Newton-Raphson 法求解非线性方程组

来源:互联网 发布:linux bc 缩写 编辑:程序博客网 时间:2024/04/30 20:10

      牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。

      设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0) f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。

       解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。

 

关于Newton's method的基本使用方法参见:http://blog.csdn.net/iamskying/archive/2009/08/22/4471071.aspx

 

Metlab源程序:

 

function homework

[P,iter,err]=newton('f','JF',[7.8e-001;4.9e-001; 3.7e-001],0.01,0.001,1000);

    disp(P);

    disp(iter);

    disp(err);

 

function Y=f(x,y,z)

    Y=[x^2+y^2+z^2-1;

         2*x^2+y^2-4*z;

         3*x^2-4*y+z^2];

 

 

function y=JF(x,y,z)

    f1='x^2+y^2+z^2-1';

    f2='2*x^2+y^2-4*z';

    f3='3*x^2-4*y+z^2';

    df1x=diff(sym(f1),'x');

    df1y=diff(sym(f1),'y');

    df1z=diff(sym(f1),'z');

    df2x=diff(sym(f2),'x');

    df2y=diff(sym(f2),'y');

    df2z=diff(sym(f2),'z');

    df3x=diff(sym(f3),'x');

    df3y=diff(sym(f3),'y');

    df3z=diff(sym(f3),'z');

    j=[df1x,df1y,df1z;df2x,df2y,df2z;df3x,df3y,df3z];

    y=(j);

 

function [P,iter,err]=newton(F,JF,P,tolp,tolfp,max)

%输入P为初始猜测值,输出P则为近似解

%JF为相应的Jacobian矩阵

%tolp为P的允许误差

%tolfp为f(P)的允许误差

%max:循环次数

    Y=f(F,P(1),P(2),P(3));

    for k=1:max 

        J=f(JF,P(1),P(2),P(3));

        Q=P-inv(J)*Y;

        Z=f(F,Q(1),Q(2),Q(3));

        err=norm(Q-P);

        P=Q;

        Y=Z;

        iter=k;

        if (err<tolp)||(abs(Y)<tolfp||abs(Y)<0.0001)

            break

        end

    end 

 

 

来自Metlab官网的方法:

 

 

 

参见:http://www.mathworks.com/matlabcentral/fileexchange/4313

 

 

一个C程序实例:

 

 

 

原创粉丝点击