(matlab系列)非线性方程求根
2012-09-23 22:27
330 查看
非线性方程在5次以上的时候没有求根公式(根据高等代数的阿贝尔群的概念得知),所以直接求解比较麻烦,需要借助解析几何的工具,结合图形采用特殊的方法求解------逼近法。主要有二分法、迭代法(包括牛顿迭代和割线法)。
逼近法的本质就是先给一个估计值(近似值)作为方程解,然后对这个估计值一步一步地修正,使得它越来越像真实值;而这种修补的方法必须具有普遍性,可以重复性地使用,这样才能给计算机以循环指令,让计算机按照规定的方法重复性地对近似解进行修补。
二分逼近的估计方式是取区间的中值,然后对这个中值一次一次的修补,而修补的方式是踢出区间的另一半,使得区间变小,再用新区间的中值作为方程的近似解。
迭代逼近的估计方式通常是先利用二分法求解出一个较为粗略的近似值,而重点在于修补的方式:构造一个递推公式 ,通过递推公式得到一个近似值数列,这个数列的极限为真值,也称收敛于真实值。另外,这个数列并不总是收敛于真实值,即迭代并不总是有效,需要判断迭代的有效性。常见的有效迭代法是牛顿法和割线法,这两种方法都有着极为直观的几何意义。
二分法(bisection method)
牛顿法(Newton method)
割线法(Secant method)
逼近法的本质就是先给一个估计值(近似值)作为方程解,然后对这个估计值一步一步地修正,使得它越来越像真实值;而这种修补的方法必须具有普遍性,可以重复性地使用,这样才能给计算机以循环指令,让计算机按照规定的方法重复性地对近似解进行修补。
二分逼近的估计方式是取区间的中值,然后对这个中值一次一次的修补,而修补的方式是踢出区间的另一半,使得区间变小,再用新区间的中值作为方程的近似解。
迭代逼近的估计方式通常是先利用二分法求解出一个较为粗略的近似值,而重点在于修补的方式:构造一个递推公式 ,通过递推公式得到一个近似值数列,这个数列的极限为真值,也称收敛于真实值。另外,这个数列并不总是收敛于真实值,即迭代并不总是有效,需要判断迭代的有效性。常见的有效迭代法是牛顿法和割线法,这两种方法都有着极为直观的几何意义。
二分法(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
相关文章推荐
- matlab-非线性方程求根函数及函数曲线绘制
- (matlab系列)线性方程组求根-------列主元高斯消元法
- Matlab非线性方程求根
- Matlab应用实例(10)—fzero和fsolve解非线性方程(组)
- 总结系列_6(matlab错误调试,续...)
- 【数学建模集训系列】公交查询系统的matlab实现-公交与地铁换乘
- Matlab图像识别/检索系列(2)—10行代码完成分类、识别
- Matlab图像识别/检索系列(7)-10行代码完成深度学习网络之取中间层数据作为特征
- Matlab图像识别/检索系列(9)—开源工具介绍之图像识别reco_toolbox
- MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根
- Matlab生物信息学工具箱新增功能——处理GEO系列数据
- Matlab绘图系列之高级绘图
- 牛顿迭代法解非线性方程组(MATLAB版)
- 【工具使用系列】关于 MATLAB Simulink Coder, 你需要知道的事
- 斯特芬森加速迭代法(Steffensen)-埃特金方法(Aitken) 一元非线性方程求根 C语言实现
- Matlab绘图系列之高级绘图
- Retinex系列之McCann99 Retinex 分类: 图像处理 Matlab 2014-12-03 11:27 585人阅读 评论(0) 收藏
- Matlab薛定谔方程工具箱系列——GUI初步美化
- 数学建模常用Matlab/Lingo/c代码总结系列——floyd最短路径
- 数学建模常用Matlab/Lingo/c代码总结系列——参数估计