非线性方程求根
铁皮石斛肥料-哀莫大于心死英文
实验六、非线性方程求根
在科学研究与工程技术中常会遇到求解非线性方程的问题。二
分法简单易
行,但收敛较慢,仅有线性收敛速度。而且该方法不能用于求偶数重根或复根,
但可
以用来确定迭代法的初始值。牛顿法是方程求根中常用的一种迭代方法,它
除了具有简单迭代法的优点外
,还具有二阶收敛速度(在单根邻近处)的特点,
但牛顿法对初始值选取比较苛刻(必须充分靠近方程的
根),否则牛顿法可能不
收敛。弦截法是牛顿法的一种修改,虽然比牛顿法收敛慢,但因它不需计算函数
的导数,故有时宁可用弦截法而不用牛顿法,弦截法也要求初始值必须选取得充
分靠近方程的根
,否则也可能不收敛。
一、实验目的
1、掌握非线性方程(组)的各种解法,包括二分法、
牛顿迭代法等,并通过编
程练习与上机运算,体会二分法与牛顿迭代法的不同特点;
2、掌握解非线性方程的弦截法,并与牛顿迭代法作比较;
3、
了解各种方法的收敛性。
三、实验任务
1、用二分法求方程
f(
x)x
3
x
2
3x30
在
1.5
附近的
根。
2、分别用牛顿迭代法和弦截法求方程
f(x)x
3
x
2
3x30
在
1.5
附近的根,
并由迭代次数分析结果。
三、实验过程:
1、
二分法及其MATLAB程序
function
[k,x,wuca,yx]=erfen(fun,a,b,abtol)
if nargin <
4 | isempty(abtol),
abtol=1.e-5;
end
a(1)=a; b(1)=b;
ya=feval(fun,a(1));
yb=feval(fun,b(1)); %程序中调用的fun.m 为函数
if ya*
yb>0,
disp('注意:ya*yb>0,请重新调整区间端点a和b.'),
return
end
max1=-1+ceil((log(b-a)-
log(abtol)) log(2));
% ceil是向 方向取整
for
k=1: max1+1
a;ya=feval(fun,a);
b;yb=feval(fun,b); x=(a+b)2;
yx=feval(fun,x); wuca=abs(b-a)2; k=k-1;
[k,a,b,x,wuca,ya,yb,yx]
if yx==0
a=x; b=x;
elseif yb*yx>0
b=x;yb=yx;
else
a=x; ya=yx;
end
if b-a< abtol , return, end
end
k=max1; x; wuca; yx=feval(fun,x);
函数
Function y=fun(x)
y=x^3+x^2-3*x-3;
输入
[k,x,wuca,yx]=erfen(‘fun’,1,2,1.e-5)
输出
k =16 x =1.7320 wuca = 7.6294e-006
yx =-2.6243e-005
2、分别用牛顿迭代法和弦截法
function[k
,xk,yk,piancha,xdpiancha]=newtonqx(f,x0,tol,ftol,g
xmax)
x(1)=x0;
for i=1: gxmax
x(i+1)=x(i)-subs(f,x(i))(subs(diff(f),x(i))+eps);
piancha=abs(x(i+1)-x(i));
xdpiancha=
piancha( abs(x(i+1))+eps); i=i+1;
xk=x(i);yk=subs(f,x(i)); [(i-1) xk yk piancha
xdpiancha]
if
(abs(yk)
k=i-1; xk=x(i);[(i-1) xk yk
piancha xdpiancha]
return
end
end
if i>gxmax
k=i-1; xk=x(i);[(i-1) xk yk piancha
xdpiancha]
return;
end
[(i-1),xk,yk,piancha,xdpiancha]';
输入
[k,xk,yk,piancha,xdpiancha]=newtonqx(‘f
un’,1.5,1.e-4,1.e-4,100)
输出
k = 4 xk
= 1.7321 yk =7.7973e-012 piancha =
1.1218e-006
xdpiancha = 6.4769e-007
弦截法
function
[k,piancha,xdpiancha,xk,yk]=gexian
(x01,x02,tol,ftol,gxmax)
x(1)=x01;x(2)=x02;
for i=2: gxmax
u(i)= x(i)^3+x(i)^2-3*x(i)-3; v(i)=(x(i)^3
+x(i)^2-3*x(i)-x(i-1)^3-x(i-1)^2+3*x(i-1))(x(i)-x(
i-1));
x(i+1)=x(i)- u(i)( v(i));
piancha=abs(x(i+1)-x(i));
xdpiancha=
piancha( abs(x(i+1))+eps); i=i+1; xk= x(i);
yk=x(i)^3+x(i)^2-3*x(i)-3; [(i-2) piancha
xdpiancha xk yk]
if (abs(yk)
k=i-2; xk=x(i);yk=x(i)^3+x(i)^2-3*x(i)-3;
[(i-2) piancha xdpiancha xk yk];
return;
end
end
if i>gxmax
k=i-2; xk=x(i);yk=fnq(x(i));
return;
end
[k,piancha,xdpiancha,xk,yk]=gexian
(1,2,0.001,0.001,100)
k = 5 piancha
=5.4327e-005 xdpiancha =3.1366e-005
yk =-1.0390e-006
xk =1.7321