当前位置:文档之家› 非线性方程线性化

非线性方程线性化


x0 的选取,若 x0 偏离 x* 简单的算法,它的优点是算法简单,且总是收敛的,缺点是收敛太慢,故 一般不单独将其用于求根,只用其为根求得一个较好的近似值。迭代法是一种逐次逼近法,迭代过程是个 极限过程,在用迭代法进行实际计算是,必须按精度要求控制迭代次数。并且对于收敛的迭代过程,只要 迭代足够多次,就可以是结果达到任意的精度,但有时迭代过程收敛缓慢,从而使计算量变得很大。牛顿 法实质上是一种线性化方法,就是将非线性方程线性化,以线性方程的解逐步逼近非线性方程的解。牛顿 迭代公式的收敛速度很快,但计算实践表明,当初值不够好时,Newton 法可能发散,一般可有问题的实 际背景来预测后由对分区间法求得教的初始值。
3
%p 是不动点的近似值 %err 是误差 %p(p1,p2, … ,pn) P(1)=p0; for k=2:max1 P(k)=feval('g',P(k-1)); k,err=abs(P(k)-P(k-1)) p=P(k); if(err<tol), break;end if k==max1 disp('maximum number of iteration exceeded'); end 首先在 MATLAB 命令窗口输入 fplot('[sin(x)-x^2,0]',[-5,5]);grid 回车,可得图形
end 首先在 MATLAB 命令窗口输入 fplot('[x^3-3*x+2,0]',[-2.5,2.5]);grid; 回车,得到图形
有图形可知函数 f ( x) 与 x 轴有交点,也就是说有根,并且从图中能够大致估算到根的位置。 先用 M-文件写一个名为 f.m 的文件定义函数 f ( x) x 3x 2 。
x0
1 (a b) ,检查 f (a) 与 f ( x0 ) 是否同号,若同号,说明根 x * 与 b 之间,此时 a1 x0 , b1 b ;若异 2
*
号,说明根 x 在 a 与 x 0 之间,此时 a1 a, b1 x0 ,得新区间 [a1 , b1 ] 为原区间的一半。对 [a1 , b1 ] 进行上 述过程,取中点 x1
7
1.0066 err = 0.0066 k= 5 y= 1.3270e-004 p1 = 1.0033 err = 0.0033 k= 6 y= 3.3211e-005 p1 = 1.0017 err = 0.0017 k= 7 y= 8.3074e-006 p1 = 1.0008 err = 8.3157e-004 k= 8 y= 2.0774e-006 p1 = 1.0004 err = 4.1596e-004 k= 9 y= 5.1943e-007 p1 = 1.0002 err = 2.0802e-004 k= 10 y=
x x0
f ( x0 ) ,将此根记为原方程的近似根 x1 ,然后按上式迭代计算,使形成一种新的迭代公式: f ' ( x0 ) f ( xk ) , k 0,1,2,.... f ' ( xk )
xk 1 xk
三:实验问题、方法及步骤
1、用二分法解方程 x 3 x 1 0 在区间[1.0,1.5]上的一个根。
8
1.2987e-007 ans = 1.0002
四:计算结果的分析
通过以上三种方法计算结果,我们可以看出二分法的计算精度较差,因为它只能求得一个较好的近似 值;迭代法的计算精度相对很高,它是一种逐次逼近的方法,要想求得很精确的解,只要迭代足够多次就 可得到;牛顿法的计算精度也是很高的,但是它必须能够选一个很好的初值,因为牛顿法的收敛性依赖于 初值
* *
*
动点,求 f ( x) 的零点就等价于求 ( x) 的不动点。 任取一点 x 0 代入 ( x) 求得
x1 ( x0 )
x2 ( x1 )
一般地
又将 x1 代入 ( x) 求得 如此反复迭代下去
xk 1 ( xk )
k=0,1,2,………
( x) 称为迭代函数, x ( x) 称为迭代公式。若迭代序列 {x k } 有极限,即 lim xk x * ,则称迭代方程
1 (a1 b1 ) ,检查 f (a1 ) 与 f ( x1 ) 是否同号,如此反复二分下去,即可得出一系列有 2
根 区 间 [a, b] [a1 , b1 ] [a2 , b2 ] … [a k , bk ] … , 其中 每 个 区间都是 前 一个 区 间的 一 半, 因此
解 先按照二分法的基本原理编写二分发的 MATLAB 程序(程序命名为: HalfInterval.m) , 编程如下: function root=HalfInterval(f,a,b,eps) if(nargin==3) eps=1.0e-4 end f1=subs(sym(f),findsym(sym(f)),a); f2=subs(sym(f),findsym(sym(f)),b); if(f1==0) root=a; end if(f2==0) root=b; end if(f1*f2>0) disp('两端点函数值乘积大于 0! '); return; else root=FindRoots(f,a,b,eps); end function r=FindRoots(f,a,b,eps) f_1=subs(sym(f),findsym(sym(f)),a); f_2=subs(sym(f),findsym(sym(f)),b); mf=subs(sym(f),findsym(sym(f)),(a+b)/2); if(f_1*mf>0) t=(a+b)/2; r=FindRoots(f,t,b,eps); else if(f_1*mf==0) r=(a+b)/2; else if(abs(b-a<=eps))
3
2、用迭代法求方程 sin x x 0 的一个近似值,给定初始值 x0 0.5 ,误差界为 10 。
2
5

按照迭代法的基本原理编写迭代法的 MALAB 程序(函数名为: fixpt.m) 编程如下: function[p0,k,err,p]=fixpt(g,p0,to1,max1) %g 是给定的迭代函数 %p0 是给定的初始值 %max1 是所允许的最大迭代次数 %k 是所进行的迭代次数加 1
4
3 err = 0.1052 k= 4 err = 0.0292 k= 5 err = 0.0078 k= 6 err = 0.0021 k= 7 err = 5.7408e-004 k= 8 err = 1.5525e-004 k= 9 err = 4.1975e-005 k= 10 err = 1.1350e-005 k= 11 err = 3.0688e-006 P= 0.5000 0.9589 0.8767 0.8767 ans = 0.5000 结 果 中 列 出 了 最 后 两 次 迭 代 产 生 的 xn 和 xn xn 1 。 因 为 x10 x9 3.5003 10
有图形可知函数 f ( x) 与 x 轴有交点,也就是说有根,并且从图中能够大致估算到根的位置。 先用 M-文件写一个名为 g.m 的函数。 function y=g(x); y=sin(x)/x; 然后再 MATLAB 的命令窗口输入: fixpt('g',0.5,10^(-5),20) 结果为: k= 2 err = 0.4589 k=
非线性方程线性化
一:实验目的
1、掌握用二分法解非线性方程的方法。 2、掌握用迭代法解非线性方程的方法。 3、掌握用牛顿法解非线性方程的方法。 4、学会运用 Matlab 语言解决提供的函数求解实际问题。
二:实验内容所需的基本知识
二分法的原理:
设 f ( x) 在 [a, b] 上 连 续 , 且 f (a) f (b) 0 。 则 [a, b] 为 方 程 区 间 ( 设 只 有 唯 一 根 ) 。 取中 点
6
0.8537
0.8829
0.8751
0.8772
0.8766
0.8768
0.8767
105 。 所 以
x* x10 0.876 。
3、用牛顿法求方程 x 3x 2 的近似值,给定一个初始值 p0 1.2 ,误差界为 10 。
3 6
5

按照 Newton 法的基本原理编写 Newton 法德 MATLAB 程序(函数名为 Newton.m) 编程如下: function [p1,err,k,y,]=newton(f,df,p0,delta,max1) %f是非线性函数 %df是 f的微商 %p0是初始值 %delta是给定允许误差 %max1是迭代的最大次数 %p1是牛顿法求得的方程的近似值 %err是 p0的误差估计 %k是迭代的次数 %y=f(p1) p0,feval('f',p0) for k=1:max1 p1=p0-feval('f',p0)/feval('df',p0); err=abs(p1-p0); p0=p1; p1,err,k,y=feval('f',p1) if(err<delta)|(y==0), break,end
k
xk 1 ( xk ) ,k=0,1,2,…收敛,这时 x * 显然是 x ( x) 的不动点。
牛顿(Newton) 法:
1
将非线性方程 f ( x) 0 逐步转化为某种线性方程求解。已知 f ( x) 0 的一个近似根 x 0 ,则函数 f ( x) 在 点 x 0 附近可以用一阶泰勒公式来近似, f ( x) f ( x0 ) f ' ( x0 )( x x0 ) 0 ,若 f ' ( x0 ) 0 ,解得
相关主题