(matlab系列)非线性方程求根

非线性方程在高次时无法直接求解,本文介绍利用MATLAB进行非线性方程求解的逼近方法,包括二分法、牛顿迭代法和割线法。这些方法通过不断修正估计值逼近真实解,其中牛顿法和割线法具有直观的几何意义,但需注意迭代的有效性。

             非线性方程在5次以上的时候没有求根公式(根据高等代数的阿贝尔群的概念得知),所以直接求解比较麻烦,需要借助解析几何的工具,结合图形采用特殊的方法求解------逼近法。主要有二分法、迭代法(包括牛顿迭代和割线法)。

             逼近法的本质就是先给一个估计值(近似值)作为方程解,然后对这个估计值一步一步地修正,使得它越来越像真实值;而这种修补的方法必须具有普遍性,可以重复性地使用,这样才能给计算机以循环指令,让计算机按照规定的方法重复性地对近似解进行修补。

             二分逼近的估计方式是取区间的中值,然后对这个中值一次一次的修补,而修补的方式是踢出区间的另一半,使得区间变小,再用新区间的中值作为方程的近似解。

            迭代逼近的估计方式通常是先利用二分法求解出一个较为粗略的近似值,而重点在于修补的方式:构造一个递推公式 ,通过递推公式得到一个近似值数列,这个数列的极限为真值,也称收敛于真实值。另外,这个数列并不总是收敛于真实值,即迭代并不总是有效,需要判断迭代的有效性。常见的有效迭代法是牛顿法和割线法,这两种方法都有着极为直观的几何意义。

二分法(bisection method)

%find root using bisection mehtod
eps = 0.5e-3;
a = 0;
b = 1;
n = 0;
while(1)
    if( fun1(a)*fun1(b)>0 )
        break;
    else
        %bisection method to get root
        c = (a+b)/2;   
        length = b-a;   %the length of section
        fprintf('n=%d  c=%f   f(c)=%f length(%d)=%f \n',n,c,fun1(c),n,length);
        
        %break when we get it   
        if( fun1(c)==0 || length*0.5<= eps)
            break;
        end
        
        %update the value of a and b
        n = n+1;
        if(fun1(c)>0)
            a = c;
        else
            b = c;
        end
    end
    
end


牛顿法(Newton method)

%Newton method 
eps = 5e-6;
delta = 1e-6;
N = 100;
k = 0;
x0 = 1.0;   
fprintf('x=%f   k=%d   f(x)=%f\n',x0,k,fun2(x0));
while(1)
    x1 = x0-fun2(x0)/fun2_d(x0);
    k = k+1;
    fprintf('x=%f   k=%d   f(x)=%f\n',x1,k,fun2(x1));
    
    %Newton method failed
    if(k>N || abs(x1)<eps)
        disp('Newton method failed!');
        break;
    end
    
    %condition
    if( abs(x1-x0)<eps || abs(fun2(x1))<delta )
        disp('Newton method succeeded!');
        break;
    end
    
    %update
    x0 = x1;
end


割线法(Secant method)

%Scant method 
eps = 5e-6;
delta = 1e-6;
N = 100;
k = 0;
x0 = 1.0;   
x1 = 2.0;
while(1)
    x2 = x1-fun2(x1)*(x1-x0)/(fun2(x1)-fun2(x0));
    fprintf('k=%d  x=%f  f(x)=%f\n',k,x2,fun2(x2));
    
    if(abs(x2-x1)<eps || abs(fun2(x2))<delta )
        fprintf('Scant method succeeded!\n');
        break;
    end
    %update
    k = k+1;
    x0 = x1;
    x1 = x2;
end


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值