首页 文章

如何在MATLAB中获得该方程的所有解?

提问于
浏览
1

我想解决以下等式:tan(x)= 1 / x

我做了什么:

syms x
eq = tan(x) == 1/x;
sol = solve(eq,x)

但这只给出了解决方案的一个数值近似 . 之后我读到了以下内容:

[sol, params, conds] = solve(eq, x, 'ReturnConditions', true)

但这告诉我它无法找到明确的解决方案 .

如何在某个给定范围内找到该方程的数值解?

3 回答

  • 3

    要找到某个范围内函数的数值解,可以像这样使用fzero

    fun = @(x)x*tan(x)-1; % Multiplied by x so fzero has no issue evaluating it at x=0.
    range = [0 pi/2];
    sol = fzero(fun,range);
    

    以上只会返回一个解决方案( 0.8603 ) . 如果您需要其他解决方案,则必须多次调用 fzero . 这可以在例如循环中完成:

    fun = @(x)tan(x)-1/x;
    
    RANGE_START = 0;
    RANGE_END = 3*pi;
    RANGE_STEP = pi/2;
    
    intervals = repelem(RANGE_START:RANGE_STEP:RANGE_END,2);
    intervals = reshape(intervals(2:end-1),2,[]).';
    
    sol = NaN(size(intervals,1),1);
    
    for ind1 = 1:numel(sol)
      sol(ind1) = fzero(fun, mean(intervals(ind1,:)));
    end
    
    sol = sol(~isnan(sol)); % In case you specified more intervals than solutions.
    

    这使:

    [0.86033358901938;
     1.57079632679490; % Wrong
     3.42561845948173;
     4.71238898038469; % Wrong
     6.43729817917195; 
     7.85398163397449] % Wrong
    

    注意:

    • 该函数是对称的,它的根也是对称的 . 这意味着您可以仅在正间隔(例如)上求解并获得负根"for free" .

    • sol 中的每个其他条目都是错误的,因为这是我们渐近不连续的地方( tan+Inf 过渡到 -Inf ),这被MATLAB错误地识别为解决方案 . 所以你可以忽略它们(即 sol = sol(1:2:end); .

  • 2

    我从来不喜欢“盲目地”使用求解器,也就是说,没有某种合适的初始值选择方案 . 根据我的经验,盲目做事时你会发现的 Value 观也是没有背景的 . 意思是,你经常会错过解决方案,认为某些东西是解决方案,而实际上解算器爆炸了,等等 .

    对于这种特殊情况,重要的是要认识到 fzero 使用数值导数来找到越来越好的近似值 . 但是, f(x) = x · tan(x) - 1 的衍生物变得越来越难以准确计算以增加 x

    enter image description here

    如您所见, x 越大, f(x) 越接近垂直线; fzero 会简直爆炸!因此,在进入 fzero 之前,必须尽可能接近解决方案 .

    所以,这是一种获得 good 初始值的方法 .

    考虑这个功能

    f(x) = x · tan(x) - 1
    

    知道 tan(x)Taylor expansion

    tan(x) ≈ x + (1/3)·x³ + (2/15)·x⁵ + (7/315)·x⁷ + ...
    

    我们可以使用它来近似函数 f(x) . 在第二学期结束后截断,我们可以写:

    f(x) ≈ x · (x + (1/3)·x³) - 1
    

    现在,要实现的关键是 tan(x) 重复周期 π . 因此,考虑一系列功能是最有用的:

    fₙ(x) ≈ x · ( (x - n·π) + (1/3)·(x - n·π)³) - 1
    

    对几个倍数进行评估并收集术语可得到以下推广:

    f₀(x) = x⁴/3 - 0π·x³ + ( 0π² + 1)x² - (0π +   (0π³)/3)·x  - 1
    f₁(x) = x⁴/3 - 1π·x³ + ( 1π² + 1)x² - (1π +   (1π³)/3)·x  - 1
    f₂(x) = x⁴/3 - 2π·x³ + ( 4π² + 1)x² - (2π +   (8π³)/3)·x  - 1
    f₃(x) = x⁴/3 - 3π·x³ + ( 9π² + 1)x² - (3π +  (27π³)/3)·x  - 1
    f₄(x) = x⁴/3 - 4π·x³ + (16π² + 1)x² - (4π +  (64π³)/3)·x  - 1
                                  ⋮
    fₙ(x) = x⁴/3 - nπ·x³ + (n²π² + 1)x² - (nπ +  (n³π³)/3)·x  - 1
    

    在一个简单的MATLAB测试中实现所有这些:

    % Replace this with the whole number of pi's you want to 
    % use as offset 
    n = 5;
    
    % The coefficients of the approximating polynomial for this offset
    C = @(npi) [1/3
                -npi
                npi^2 + 1
                -npi - npi^3/3
                -1];
    
    % Find the real, positive polynomial roots
    R = roots(C(n*pi));
    R = R(imag(R)==0);
    R = R(R > 0);
    
    % And use these as initial values for fzero()
    x_npi = fzero(@(x) x.*tan(x) - 1, R)
    

    在循环中,这可以生成下表:

    % Estimate (polynomial)    Solution (fzero)
     0.889543617524132          0.860333589019380    0·π
     3.425836967935954          3.425618459481728    1·π
     6.437309348195653          6.437298179171947    2·π
     9.529336042900365          9.529334405361963    3·π
    12.645287627956868         12.645287223856643
    15.771285009691695         15.771284874815882    
    18.902410011613000         18.902409956860023
    22.036496753426441         22.036496727938566    ⋮
    25.172446339768143         25.172446326646664    
    28.309642861751708         28.309642854452012
    31.447714641852869         31.447714637546234
    34.586424217960058         34.586424215288922   11·π
    

    如您所见,近似值基本上等于解决方案 . 对应情节:

    enter image description here

  • 2

    将方程乘以 xcos(x) 以避免任何可以具有值 0 的分母,

    f(x)=x*sin(x)-cos(x)==0
    

    考虑规范化函数

    h(x)=(x*sin(x)-cos(x)) / (abs(x)+1)
    

    对于大 x ,这将越来越接近 sin(x) (或 -sin(x) 为大负 x ) . 实际上,绘制这个已经在视觉上是真实的,直到幅度因子为 x>pi .

    对于 [0,pi/2] 中的第一个根,使用第二度 x^2-(1-0.5x^2)==0x=0 处的泰勒逼近得到 x[0]=sqrt(2.0/3) 作为根近似,对于较高的那些采用正弦根 x[n]=n*pin=1,2,3,... 作为牛顿迭代 xnext = x - f(x)/f'(x) 中的初始近似值得到

    n        initial              1. Newton         limit of Newton
    
     0    0.816496580927726    0.863034004302817    0.860333589019380
     1    3.141592653589793    3.336084918413964    3.425618459480901
     2    6.283185307179586    6.403911810682199    6.437298179171945
     3    9.424777960769379    9.512307014150883    9.529334405361963
     4   12.566370614359172   12.635021895208379   12.645287223856643
     5   15.707963267948966   15.764435036320542   15.771284874815882
     6   18.849555921538759   18.897518573777646   18.902409956860023
     7   21.991148575128552   22.032830614521892   22.036496727938566
     8   25.132741228718345   25.169597069842926   25.172446326646664
     9   28.274333882308138   28.307365162331923   28.309642854452012
    10   31.415926535897931   31.445852385744583   31.447714637546234
    11   34.557519189487721   34.584873343220551   34.586424215288922
    

相关问题