我想解決以下公式:棕褐色(x)= 1/X如何在MATLAB中獲得該方程式的所有解法?
我做了什麼:
syms x
eq = tan(x) == 1/x;
sol = solve(eq,x)
但是這給了我只是解決方案的數值逼近。之後,我讀了下面的內容:
[sol, params, conds] = solve(eq, x, 'ReturnConditions', true)
但這告訴我,它無法找到明確的解決方案。
如何在一定範圍內找到該方程的數值解?
我想解決以下公式:棕褐色(x)= 1/X如何在MATLAB中獲得該方程式的所有解法?
我做了什麼:
syms x
eq = tan(x) == 1/x;
sol = solve(eq,x)
但是這給了我只是解決方案的數值逼近。之後,我讀了下面的內容:
[sol, params, conds] = solve(eq, x, 'ReturnConditions', true)
但這告訴我,它無法找到明確的解決方案。
如何在一定範圍內找到該方程的數值解?
要找到一些範圍內的數值解的功能,你可以使用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
需要注意的是:
sol
中的每個其他條目都是錯誤的,因爲這是我們漸進性不連續性的地方(tan
從+Inf
轉換爲-Inf
),這被MATLAB錯誤地認爲是一種解決方案。所以,你可以不理會他們(即sol = sol(1:2:end);
。謝謝,但它只顯示一個解決方案。 – user137425
謝謝!一個好的範圍是[-8 8] – user137425
改變方程爲'x * sin(x)-cos(x)== 0'去進一步去單數化。 – LutzL
我一直使用求解器「盲目」,也就是說,如果沒有某種體面的初始值選擇方案從來都不喜歡。以我的經驗,價值觀,你會發現,當一味地做事,沒有語境,意思是說,你經常會錯過解決方案,認爲事情是一種解決方案,而實際上解決方案會發生爆炸等。
對於這種特殊情況,重要的是要認識到fzero
使用數值導數來尋找越來越好的近似值,但是,f(x) = x · tan(x) - 1
的衍生物變得越來越難以精確計算以增加x
:
正如你所看到的,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·π
正如您所看到的,近似值基本上等於解決方案。相應的曲線:
爲什麼不只是簡單地乘以有問題的術語'cos(x)'來找到無極方程x * sin(x)-cos(x)== 0'? – LutzL
@LutzL嗯......然後呢?仍然很難找到一個好的初始估計。這是一個角度相關的相量,也就是說,它與'√(x²+ 1)·sin(x + atan2(-1,x))'相同。正如你所看到的那樣,這個週期不是一個「乾淨的」2π,而是依賴於「x」。你可以在你找到的第一個解決方案中加入n?π來獲得後續估計值,對於這種情況,我認爲這確實足夠好。但是,經驗表明,對於*其他*情況,其中期間不是*完全*你在初始估計中假設的,你最終會兩次收斂到相同的解決方案,並錯過下一個... –
@LutzL好吧,你可以自由地添加一個答案,使我看起來很可笑,我真的很喜歡它,當發生這種情況:) –
乘法公式由x
和cos(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)==0
的x=0
得到x[0]=sqrt(2.0/3)
作爲根近似,對於較高者採取正弦根x[n]=n*pi
,n=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
你是什麼意思「獲得所有的價值」?這個方程有無限的解決方案(只需[繪製它並看看](http://www.wolframalpha.com/input/?i=tan(x)+%3D%3D + 1%2Fx +從+ -20 +到+20))。 –
對不起,我的意思是不止一個值。例如在一個範圍內。 – user137425
我的意思是,在一定範圍內的數值解決方案 – user137425