有時候我們要數值求解超越方程的多個根,但是數值方法都要給定乙個初值。
matlab有內建函式fsolve求解非線性方程(組),但是只能求一組給定初值的解,如果要求多個根(如頻率方程),可以先用mathematica畫圖,然後觀察得到零點個數和大概位置,然後呼叫fsolve求解。
這裡提供了乙個程式,在區間(a,b)上面畫圖,然後可以用滑鼠選取n個點,然後返回以這些點作為初值得到的根。
幾點需要注意的地方:
1)待求根的方程要滿足向量,乘法要換成點乘
2)一次不要求太多根,因為區間大的時候前面的可能會貼近x軸看不出來
3)呼叫格式:multiroots(@equ,2,0,8);或 multiroots(@equ,1,8,12); 注意函式前要有@
function y = equ(x)y = 2-2*cos(x).*cosh(x)+sin(x).*sinh(x);
end
function rx = multiroots(equ,n,a,b)% equ -- equation which roots to be found
% n -- number of roots to be found
% a -- left end of the section
% b -- right end of the section
opt = optimset('display','off');
px = linspace(a,b,100);
plot(px,equ(px),px,zeros(1,100))
hold on
[x0,~] = ginput(n);
rx=fsolve(equ,x0,opt);
fprintf(' root\n')
for i=1:n
fprintf(' %d %12.5f\n',i,rx(i))
endend
用fsolve求解非線性方程(組)的用法:
先寫要求解的方程(組)(kx=0的形式)儲存為root2d.m
1 function f =root2d(x)2 f(1) = exp(-exp(-(x(1)+x(2))))-x(2)*(1+x(1)^2
);3 f(2) = x(1)*cos(x(2))+x(2)*sin(x(1))-0.5
;4 end
直接用fsolve會顯示一些資訊,可以關掉。
options = optimoptions('fsolve
','display
','none');
x = fsolve(@root2d,[0,0],options)
MATLAB數值求解帶引數方程
matlab裡面數值求解方程的函式為fsolve,matlab自帶的幫助文件裡有如何直接使用的例子,但沒有如何解帶引數方程的例子,其實只需要對待求解方程稍作修改即可。比如我們求如下關於x 1x 1 x1 和x 2x 2 x2 的方程 e e x1 x2 x2 1 x1 2 c 1 0x 1cos x...
Matlab 數值微積分與方程求解
專題六 數值微積分與方程求解 目錄 一 數值微分與數值積分 1.數值微分 2.數值積分 二 線性方程組求解 先說差分。差分可以分為向前差分,向後差分和中心差分。三者分別如下表述 matlab提供了求向前差分的函式diff,其呼叫格式有3種 舉個例子 求向量 1,34,54,32,56,78 的一階向...
matlab求解振動方程
看了一篇柱塞幫浦離散化動力學建模的文章,感覺還挺有意思,於是嘗試做一下 二 matlab下的動力學方程總結 斜盤式軸向柱塞幫浦是一類常見的柱塞幫浦,本文以 型斜盤式軸向柱塞幫浦為研究物件,研究幫浦內機械振動的傳遞問題。由於該幫浦傳動軸與缸體之間為過盈配合,且柱塞滑靴元件位於缸體的柱塞腔內,因此,將傳...