Matlab數值求解超越方程的根

2022-08-31 00:36:08 字數 1384 閱讀 7922

有時候我們要數值求解超越方程的多個根,但是數值方法都要給定乙個初值。

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下的動力學方程總結 斜盤式軸向柱塞幫浦是一類常見的柱塞幫浦,本文以 型斜盤式軸向柱塞幫浦為研究物件,研究幫浦內機械振動的傳遞問題。由於該幫浦傳動軸與缸體之間為過盈配合,且柱塞滑靴元件位於缸體的柱塞腔內,因此,將傳...