42.利用 牛顿迭代法解非线性高维方程组(matlab程序)

1.简述

      

若向量记号为X,方程组就可以写成F(X)=0的形式。

我们知道,对于一元函数的牛顿迭代法求根公式

类似的,对于多元函数求根公式

其中X是向量,是非线性方程组对应的雅可比矩阵。

具体求解的时候,我们可以先通过绘图命令绘制图形,看交点。然后将交点附近的值带入迭代

矩阵。最后求出小于误差的收链解。

2.代码

主程序:

function newton%牛顿迭代法解非线性方程组
    syms a x;
    beta=0.15;
    F=[1-beta+sqrt((1-beta)^2+4*a)-2*x;
       beta+a+2*x-(beta+x)^3];
    eps=10e-6;%精度
    num=1;%记步数
    tol=1;%给定误差初始值
    x0=[1;1];%参数赋初始值
    v=[a,x];
        while tol>eps
            Fx=subs(F,v,transpose(x0));
            dF=jacobian(F,v);
            c=subs(dF,v,transpose(x0));
            x=x0-inv(c)*Fx;
            tol=norm(x-x0);
            x0=x;
            num=num+1;
                if (num>10^8)
                    disp('迭代次数大于最大值,可能不收敛')
                    return
                end
        end
%Output
fprintf('解出 a = %g.\n',x0(1))
fprintf('解出 x = %g.\n',x0(2))
fprintf('迭代次数 n = %g次.\n',num)

子程序:

function   [y,n]=newton_fun(F,x0)
        if nargin==2
            eps=1.0e-6;
        end
        num = 0;
        tol = 1;
        v=findsym(F);
        while tol>eps
            Fx = subs(F,v,transpose(x0));
            dF=jacobian(F,v);
            c=subs(dF,v,transpose(x0));
            x=x0-inv(c)*Fx;
            tol=norm(x-x0);
            x0=x;
            num=num+1;
                if (num>10^8)
                    disp('迭代次数大于最大值,可能不收敛')
                    return
                end
        end
        y = x0;
        n = num;
end
 

子程序:

function solve
  syms x
    gamma=0.5;
    m=5;
    theta=12;
    a=1-gamma;
    F=sin((m+1)*x)-a*sin(m*x);
   
    for i=0:m+1
        w0=i*pi/(m+1);
        [x,n]=newton_fun(F,w0);
        w(i+1)=x;
%       beta(i+1)=theta*gama^2/(sqrt(1+a^2-2*a*cos(x))-gama*(1-theta));
        b(i+1)=cos((m+1)*x)-a*cos(m*x);%先算出b
        beta(i+1)=theta*gamma^2/(b(i+1)-gamma*(1-theta));%再算出beta
        num(i+1)=n;
    end
    w
    beta
    num

猜你喜欢

转载自blog.csdn.net/m0_57943157/article/details/132156792
42.