1非线性方程求根 2.docx
《1非线性方程求根 2.docx》由会员分享,可在线阅读,更多相关《1非线性方程求根 2.docx(13页珍藏版)》请在冰豆网上搜索。
1非线性方程求根2
桂林电子科技大学
数学与计算科学学院实验报告
实验室:
实验日期:
2010年4月17日
学号
0800730121
批次
3
姓名
彭兆拓
成绩
课程
名称
数值分析
实验项目
名称
1非线性方程求根
指导
教师
李光云
一,实验目的
通过实验,熟悉非线性方程求根的经典数值方法,掌握二分法,简单迭代法,牛顿迭代法的算法思想
二,实验原理
求非线性方程的数值解的方法一般有
1.二分法
要求在所给含根区间内有且只有一个根.即
.求根方法为不断取区间中点求函数值
将中点替代与之同号的端点,实现含根区间逐步减半,达到逐步接近方程根的目的.
2.简单迭代法
利用方程
构造迭代格式
选取初值
产生迭代序列
在迭代格式收敛的情况下,可以得到
的近似根.
3.牛顿迭代法
是取特殊迭代格式
的迭代法.
三,使用仪器,材料
计算机一台;Mathematica软件.
四,实验内容与步骤
1.用二分法求方程
的解,精确到5位小数.
2.求解方程
在
内根的下列迭代法
(1)
(2)
(3)
(4)
试通过实验找出收敛的迭代法.
3.编写程序,分别用下列方法求解方程
取
.
(1)牛顿迭代法;
(2)
;
(3)*
;
比较各个方法的收敛速度.
五,实验过程原始记录(数据,图表,计算等)
1、解:
Plot[Cos[Sin[x]]-0.75,{x,-5,5}]
(*二分法*
*输入数据,[a,b]为含根区间,f[x]为已知函数,e为允许误差*)
Clear[x];
a=-3.;
b=-2;
f[x_]:
=Cos[Sin[x]-0.75];
e=10^(-3);
(****************************)
If[f[a]*f[b]>0,Print["[a,b]区间上f[x]无解!
"],
i=1;
While[Abs[a-b]>e,
If[Abs[f[(b+a)/2]]If[f[a]*f[(b+a)/2]>0,a=(b+a)/2,b=(b+a)/2];
Print["第",i,"次二分区间得:
[",a,",",b,"],区间中点为:
",(a+b)/2,
",f[x]=",f[(a+b)/2]];
i=i+1;
]
Print["方程根为x=",(a+b)/2,",f[x]=",f[(a+b)/2]];
]
(****************************)
第1次二分区间得:
[-2.5,-2],区间中点为:
-2.25,f[x]=0.0427101
第2次二分区间得:
[-2.25,-2],区间中点为:
-2.125,f[x]=-0.0295192
第3次二分区间得:
[-2.25,-2.125],区间中点为:
-2.1875,f[x]=0.00500699
第4次二分区间得:
[-2.1875,-2.125],区间中点为:
-2.15625,f[x]=-0.0126648
第5次二分区间得:
[-2.1875,-2.15625],区间中点为:
-2.17188,f[x]=-0.00392973
第6次二分区间得:
[-2.1875,-2.17188],区间中点为:
-2.17969,f[x]=0.000513602
方程根为x=-2.17969,f[x]=0.000513602
2、
(1)*输入数据,max为最大迭代次数,g[x]为迭代格式,
x0为迭代初值,e为允许误差,k为计数器*)
Clear[x];
max=10;
g[x_]:
=(x^2+x+1)^(1/3);
x0=1.5;
e=10^(-3);
k=1;
(*利用迭代公式形成迭代序列*)
xx=g[x0];
Print["第",k,"次迭代x=",xx];
While[Abs[x0-xx]>e,
If[k>max,
x0=xx;Print["达到最大迭代次数,可能为死循环!
"],
x0=xx;
xx=g[x0];
k=k+1;
Print["第",k,"次迭代x=",xx];
]
]
(************************************************)
第1次迭代x=1.68099
第2次迭代x=1.76589
第3次迭代x=1.80536
第4次迭代x=1.82363
第5次迭代x=1.83206
第6次迭代x=1.83596
第7次迭代x=1.83775
第8次迭代x=1.83858
(2)(*简单迭代法*
*输入数据,max为最大迭代次数,g[x]为迭代格式,
x0为迭代初值,e为允许误差,k为计数器*)
Clear[x];
max=30;
g[x_]:
=1+1/x+1/x^2;
x0=1.5;
e=10^(-3);
k=1;
(*利用迭代公式形成迭代序列*)
xx=g[x0];
Print["第",k,"次迭代x=",xx];
While[Abs[x0-xx]>e,
If[k>max,
x0=xx;Print["达到最大迭代次数,可能为死循环!
"],
x0=xx;
xx=g[x0];
k=k+1;
Print["第",k,"次迭代x=",xx];
]
]
(************************************************)
第1次迭代x=2.11111
第2次迭代x=1.69806
第3次迭代x=1.93572
第4次迭代x=1.78348
第5次迭代x=1.87509
第6次迭代x=1.81773
第7次迭代x=1.85279
第8次迭代x=1.83103
第9次迭代x=1.84441
第10次迭代x=1.83614
第11次迭代x=1.84123
第12次迭代x=1.83809
第13次迭代x=1.84003
第14次迭代x=1.83883
第15次迭代x=1.83957
(3)(*简单迭代法*
*输入数据,max为最大迭代次数,g[x]为迭代格式,
x0为迭代初值,e为允许误差,k为计数器*)
Clear[x];
max=30;
g[x_]:
=x^3-x^2-1;
x0=1.5;
e=10^(-3);
k=1;
(*利用迭代公式形成迭代序列*)
xx=g[x0];
Print["第",k,"次迭代x=",xx];
While[Abs[x0-xx]>e,
If[k>max,
x0=xx;Print["达到最大迭代次数,可能为死循环!
"],
x0=xx;
xx=g[x0];
k=k+1;
Print["第",k,"次迭代x=",xx];
]
]
(************************************************)
第1次迭代x=0.125
第2次迭代x=-1.01367
第3次迭代x=-3.06911
第4次迭代x=-39.3287
第5次迭代x=-62379.3
第6次迭代x=-2.42733*10^14
第7次迭代x=-1.43017*10^43
第8次迭代x=-2.92523*10^129
第9次迭代x=-2.503114349471163*10^388
第10次迭代x=-1.568346682658564*10^1165
第11次迭代x=-3.85768008432428*10^3495
第12次迭代x=-5.7408820864370*10^10486
第13次迭代x=-1.8920642529243*10^31460
第14次迭代x=-6.773414323074*10^94380
第15次迭代x=-3.107584347897*10^283142
第16次迭代x=-3.001019214385*10^849427
第17次迭代x=-2.70275281386*10^2548282
第18次迭代x=-1.97432654417*10^7644847
第19次迭代x=-7.6958563660*10^22934541
第20次迭代x=-4.5579636837*10^68803625
第21次迭代x=-9.469184568*10^206410876
General:
:
ovfl:
Overflowoccurredincomputation.>>
General:
:
ovfl:
Overflowoccurredincomputation.>>
第22次迭代x=Overflow[]
第23次迭代x=Overflow[]
第24次迭代x=Overflow[]
第25次迭代x=Overflow[]
第26次迭代x=Overflow[]
第27次迭代x=Overflow[]
第28次迭代x=Overflow[]
第29次迭代x=Overflow[]
第30次迭代x=Overflow[]
第31次迭代x=Overflow[]
达到最大迭代次数,可能为死循环!
由实验可知、此收敛方式发散
(4)(*简单迭代法*
*输入数据,max为最大迭代次数,g[x]为迭代格式,
x0为迭代初值,e为允许误差,k为计数器*)
Clear[x];
max=30;
g[x_]:
=(x^2+1)/(x^2-1);
x0=1.8;
e=10^(-3);
k=1;
(*利用迭代公式形成迭代序列*)
xx=g[x0];
Print["第",k,"次迭代x=",xx];
While[Abs[x0-xx]>e,
If[k>max,
x0=xx;Print["达到最大迭代次数,可能为死循环!
"],
x0=xx;
xx=g[x0];
k=k+1;
Print["第",k,"次迭代x=",xx];
]
]
(************************************************)
第1次迭代x=1.89286
第2次迭代x=1.77432
第3次迭代x=1.93101
第4次迭代x=1.73293
第5次迭代x=1.99848
第6次迭代x=1.66802
第7次迭代x=2.12216
第8次迭代x=1.57085
第9次迭代x=2.3628
第10次迭代x=1.43641
第11次迭代x=2.88097
第12次迭代x=1.27397
第13次迭代x=4.21024
第14次迭代x=1.11957
第15次迭代x=8.89126
第16次迭代x=1.02562
第17次迭代x=39.5336
第18次迭代x=1.00128
第19次迭代x=781.452
第20次迭代x=1.
第21次迭代x=305333.
第22次迭代x=1.
第23次迭代x=4.66144*10^10
第24次迭代x=1.
第25次迭代x=-9.0072*10^15
第26次迭代x=1.
Power:
:
infy:
Infiniteexpression1/0.encountered.>>
第27次迭代x=ComplexInfinity
\[Infinity]:
:
indet:
Indeterminateexpression0ComplexInfinityencountered.>>
第28次迭代x=Indeterminate
3、
(1)(*牛顿迭代法*
*输入数据,f[x]为已知函数,x0为初值,e为允许误差*)
Clear[x];
f[x_]:
=x^2+2x*E^x+E^(2x);
x0=0.0;
e=10^(-5);
(*利用牛顿迭代公式求迭代序列*)
k=1;
df[x_]:
=D[f[x],x];
xx=x0-f[x]/df[x]/.x->x0;
Print["第",k,"次迭代x=",xx];
While[Abs[x0-xx]>e,
If[k>100,
x0=xx;Print["达到最大迭代次数,可能为死循环!
"],
x0=xx;
xx=x0-f[x]/df[x]/.x->x0;
k=k+1;
Print["第",k,"次迭代x=",xx];]]
(************************************************)
第1次迭代x=-0.25
第2次迭代x=-0.39864
第3次迭代x=-0.480194
第4次迭代x=-0.522967
第5次迭代x=-0.544876
第6次迭代x=-0.555965
第7次迭代x=-0.561543
第8次迭代x=-0.56434
第9次迭代x=-0.565741
第10次迭代x=-0.566442
第11次迭代x=-0.566793
第12次迭代x=-0.566968
第13次迭代x=-0.567056
第14次迭代x=-0.567099
第15次迭代x=-0.567121
第16次迭代x=-0.567132
第17次迭代x=-0.567138
(2)(*牛顿迭代法*
*输入数据,f[x]为已知函数,x0为初值,e为允许误差*)
Clear[x];
f[x_]:
=x^2+2x*E^x+E^(2x);
x0=0.0;
e=10^(-5);
(*利用牛顿迭代公式求迭代序列*)
k=1;
df[x_]:
=D[f[x],x];
xx=x0-2*f[x]/df[x]/.x->x0;
Print["第",k,"次迭代x=",xx];
While[Abs[x0-xx]>e,
If[k>100,
x0=xx;Print["达到最大迭代次数,可能为死循环!
"],
x0=xx;
xx=x0-2*f[x]/df[x]/.x->x0;
k=k+1;
Print["第",k,"次迭代x=",xx];]]
(************************************************)
第1次迭代x=-0.5
第2次迭代x=-0.566311
第3次迭代x=-0.567143
第4次迭代x=-0.567143
与方法一相比,第2种迭代方式更简便
六,实验结果分析或总结
通过此次试验,了解了如何使用Mathematica软件解决非线性问题的求解问题,以及简单迭代法、牛顿迭代法、二分法求解非线性方程的根,但由于对mathematic软件的不熟悉,使得有些地方还不是不太明白,对简单迭代法的一些问题还是不了解.总的来说,本次试验基本熟悉了本课所要求掌握的内容。