2016-11-21 44 views
1

我想解決以下公式:棕褐色(x)= 1/X如何在MATLAB中獲得該方程式的所有解法?

我做了什麼:

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

但是這給了我只是解決方案的數值逼近。之後,我讀了下面的內容:

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

但這告訴我,它無法找到明確的解決方案。

如何在一定範圍內找到該方程的數值解?

+0

你是什麼意思「獲得所有的價值」?這個方程有無限的解決方案(只需[繪製它並看看](http://www.wolframalpha.com/input/?i=tan(x)+%3D%3D + 1%2Fx +從+ -20 +到+20))。 –

+0

對不起,我的意思是不止一個值。例如在一個範圍內。 – user137425

+0

我的意思是,在一定範圍內的數值解決方案 – user137425

回答

2

要找到一些範圍內的數值解的功能,你可以使用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 

需要注意的是:

  1. 功能是對稱的,因此是其根源。這意味着你可以在正確的時間間隔內解決問題(例如),並獲得「免費」的負向根。
  2. sol中的每個其他條目都是錯誤的,因爲這是我們漸進性不連續性的地方(tan+Inf轉換爲-Inf),這被MATLAB錯誤地認爲是一種解決方案。所以,你可以不理會他們(即sol = sol(1:2:end);
+0

謝謝,但它只顯示一個解決方案。 – user137425

+0

謝謝!一個好的範圍是[-8 8] – user137425

+1

改變方程爲'x * sin(x)-cos(x)== 0'去進一步去單數化。 – LutzL

3

我一直使用求解器「盲目」,也就是說,如果沒有某種體面的初始值選擇方案從來都不喜歡。以我的經驗,價值觀,你會發現,當一味地做事,沒有語境,意思是說,你經常會錯過解決方案,認爲事情是一種解決方案,而實際上解決方案會發生爆炸等。

對於這種特殊情況,重要的是要認識到fzero使用數值導數來尋找越來越好的近似值,但是,f(x) = x · tan(x) - 1的衍生物變得越來越難以精確計算以增加x

enter image description here

正如你所看到的,x越大越好f(x)接近垂直線。 fzero只會爆炸!因此,在進入fzero之前,儘可能接近以儘可能地解決方案

所以,這裏有一種方法來獲得初始值。

考慮函數

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

+0

爲什麼不只是簡單地乘以有問題的術語'cos(x)'來找到無極方程x * sin(x)-cos(x)== 0'? – LutzL

+0

@LutzL嗯......然後呢?仍然很難找到一個好的初始估計。這是一個角度相關的相量,也就是說,它與'√(x²+ 1)·sin(x + atan2(-1,x))'相同。正如你所看到的那樣,這個週期不是一個「乾淨的」2π,而是依賴於「x」。你可以在你找到的第一個解決方案中加入n?π來獲得後續估計值,對於這種情況,我認爲這確實足夠好。但是,經驗表明,對於*其他*情況,其中期間不是*完全*你在初始估計中假設的,你最終會兩次收斂到相同的解決方案,並錯過下一個... –

+0

@LutzL好吧,你可以自由地添加一個答案,使我看起來很可笑,我真的很喜歡它,當發生這種情況:) –

2

乘法公式由xcos(x)避免了可能具有價值0任何分母,

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

考慮標準化的功能

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

對於大x這將越來越克洛se至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 
相關問題