• 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
    ')
    for i=1:n
        fprintf(' %d %12.5f
    ',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)
  • 相关阅读:
    libgdx学习记录12——圆角矩形CircleRect
    libgdx学习记录11——平铺地图TiledMap
    libgdx判断矩形重叠碰撞
    libgdx学习记录10——Particle粒子
    libgdx学习记录9——FreeType,ttf中文显示
    libgdx学习记录8——对话框Dialog
    libgdx学习记录7——Ui
    libgdx学习记录6——动作Action
    libgdx学习记录5——演员Actor
    libgdx学习记录4——舞台Stage
  • 原文地址:https://www.cnblogs.com/zhanchao/p/7520031.html
Copyright © 2020-2023  润新知