Matlab數值求解超越方程的根


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

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)) 
end
end

  

 

用fsolve求解非線性方程(組)的用法:https://cn.mathworks.com/help/optim/ug/fsolve.html

先寫要求解的方程(組)(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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM