小组计算方法课程实验.docx
- 文档编号:4675336
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:8
- 大小:106.73KB
小组计算方法课程实验.docx
《小组计算方法课程实验.docx》由会员分享,可在线阅读,更多相关《小组计算方法课程实验.docx(8页珍藏版)》请在冰豆网上搜索。
小组计算方法课程实验
牛顿法、不动点迭代
实验报告
Mathematica语言
一、收敛的迭代法(二分法不动点)求方程的根。
1)二分法构造过程
设方程f(x)=0在(a,b)内只有一实根,取[a,b]区间二等分的中点x0=(a+b)/2。
若f(x0)=0,则x0是f(x)=0的实根x*,输出近似根x0,终止;否则如果f(a)f(x0)<0成立,则根x*必在区间(a,x0)内,取a1=a,b1=x0;否则根x*必在区间(x0,b)内,取a1=x0,b1=b。
这样,得到新区间[a1,b1],其长度为[a,b]的一半,如此继续下去,进行k次等分后,得到一组不断缩小的区间序列:
[a,b],[a1,b1],…...,[ak,bk],…和对应区间的中点数列:
xk=(ak+bk)/2,k=0,1,2,….。
其中每个区间都含有根x*,满足:
[a,b][a1,b1]…..[ak,bk]…
且每个区间都是前一个区间长度的一半。
由于[ak,bk]的长度为(b-a)/2k,当k不断变大时,则有这些区间将收敛于一个点x*,该点即为所求的根。
当做到第k步时,有
为给定精度,此时xkx*即为满足要求的近似根。
2)二分法算法
1. 计算[a,b]区间的中点存放在变量x0中:
x0(a+b)/2
2. 如果函数值f(x0)=0,则x0是f(x)=0的实根x*,输出根x0,终止
3. 如果函数值f(a)f(x0)<0,则bx0,否则ax0
4. 如果b-a(为给定的精度),则输出根的近似值(a+b)/2,终止,否则转1。
3)二分法程序(mathematica语言)
Clear[x]
f[x_]=Input[“键入函数f(x)=”];
a=Input[“键入左端点a=”];
b=Input[“键入右端点b=”];
Print[“a=”,a,“b=”,b,“f(x)=”,f[x]]
e1=10^(-10);
eps=Input[“键入根的误差限eps=”];
n=0;
While[b-a>eps,
x=(a+b)/2;
n=n+1;
w=f[x];
If[Abs[w] p=f[a]*w//N; If[p<0,b=x,a=x]; Print[“n=”,n,“x=”,x//N,“eps=”,b-a//N] ] 注: 本程序用于求非线性方程f(x)=0在区间[a,b]内的根,这里要求f(x)在区间[a,b]连续,且f(a)f(b)<0。 程序执行后,先通过键盘输入函数f(x)和区间左端点a和右端点b及根的精度要求e,程序即可给出每次二分的次数和对应的点列xk,其中最后输出的结果即为所求的根。 4)程序中变量说明 x: 存放初值x0和二分法中的xk a: 存放含根区间的左端点ak b: 存放含根区间的右端点bk e1: 描述f(xk)=0的微小值,这里用|f(xk)| n: 存放二分次数 注: 语句If[p<0,b=x,a=x]中p的一定要是算出的数值,否则会出现错误。 本程序中用“p=f[a]*w//N”而不用“p=f[a]*w”就是这个原因。 补充Mathematica程序为: 二、用Newton法求方程的根 Newton迭代法也称切线法,是非线性方程求根方法中收敛的最快的方法,其涉及的近似处理方法很有代表性。 1)Newton迭代法构造过程 将方程f(x)=0线性化处理为近似方程,然后用近似方程获得求根的迭代计算公式。 具体为: 设xk是f(x)=0的一个近似根,把f(x)在xk处作泰勒展开,得: 取前两项来近似代替f(x)(称为f(x)的线性化),则得近似线性方程: 设f(xk)0,令其解为xk+1,得: 上式称为求f(x)=0根的Newton(牛顿)迭代格式。 2)Newton迭代法算法 1.输入初值x0、迭代精度eps、函数f(x)和迭代最大次数Nmax 2.Fork=1,2,…,Nmax 1.1 如果|f(x0)| 1.2 xx0-f(x0)/f(x0) 1.3 如果|x-x0| 1.4 x0x 2.输出迭代失败,终止。 3)Newton迭代法程序 Clear[x,f,g]; f[x_]=Input["f[x]="]; g[x_]=D[f[x],x]; x0=Input["输入迭代初值"]; eps1=0.00000000001; nmax=500; eps=Input["输入精度控制eps="]; Do[u1=g[x0]; If[Abs[u1//N] x=x0-f[x0]/u1; u1=Abs[x-x0]//N; Print["x=",x,"n=",n,"eps=",u1]; If[u1 {n,1,nmax}]; If[u1>eps,Print["迭代失败"]] 说明: 本程序用于求非线性方程f(x)=0在x0附近的根。 程序执行后,先通过键盘输入迭代函数f(x)和迭代初值x0及根的精度要求eps,程序即可给出每次迭代的次数和对应的点列xk,其中最后输出的结果即为所求的根。 如果迭代超出500次还没有求出满足精度的根则输出迭代失败提示。 4)程序中变量说明: x0: 存放初值和迭代过程中的xk x: 存放迭代过程中的xk+1 nmax: 存放迭代允许的最大次数 u1: 临时变量 注: 迭代最大次数可以修改为其他数字。 三、题目解答(Abs[x(k)-x(k-1)]<0.001) 题1。 (x-2)*Exp[x]=1,取x0=2.5. 解: 用Mathematica程序直接迭代结果为: 用牛顿不动点迭代法得到的结果为: 题2。 2*Cos[x]-3*x+12=0,取x0=4. 解: 用Mathematica程序直接迭代结果为: 用牛顿不动点迭代法得到的结果为: 题3。 3*x^2-Exp[x]=0,取x0=-1. 解: 用Mathematica程序直接迭代结果为: 用牛顿不动点迭代法得到的结果为: 题4.用Newton迭代法求方程xex–1=0的根,取x0=0.5,要求误差不超过10-3。 解: 用二分法求方程xex-1=0在[0,1]内的根,要求误差不超过10-3。 令f(x)=xex–1,因为f(0)=-1<0,f (1)=e-1>0,所以可以用二分法。 执行二分法程序后,在输入的四个窗口中按提示分别输入 x*Exp[x]-1、0、1、0.001 每次输入后用鼠标点击窗口的“OK”按扭,输出计算结果: a=0b=1f(x)=-1+exx n=1x=0.5e=0.5 n=2x=0.75e=0.25 n=3x=0.625e=0.125 n=4x=0.5625e=0.0625 n=5x=0.59375e=0.03125 n=6x=0.578125e=0.015625 n=7x=0.570312e=0.0078125 n=8x=0.566406e=0.00390625 n=9x=0.568359e=0.00195312 n=10x=0.567383e=0.000976562 此结果说明共二分10次,求得的近似根为x=0.567383,其误差为e=0.000976562。 执行Newton迭代法程序后在输入的三个窗口中按提示分别输入 x*Exp[x]-1、0.5、0.001 每次输入后用鼠标点击窗口的“OK”按扭,输出计算结果: x=0.57102n=1eps=0.0710204 x=0.567156n=2eps=0.00386487 x=0.567143n=3eps=0.0000122782 x=0.567143n=4eps=1.2347710-10 此结果说明迭代4次,求得误差为e=1.2347710-10的近似根,最后显示的近似根结果为x=0.567143,它只是部分表示,要看该近似根更详细的表示(如看其中前10位数)可以再键入命令N[x,10]后有近似根的为0.5671432904。 题5。 x^3-x^2-1=0,取x0=1.5. 解: 用Mathematica程序直接迭代结果为: 用牛顿不动点迭代法得到的结果为: 题6。 Exp[x]+10*x-2=0,取x0=0. 解: 用Mathematica程序直接迭代结果为: 用牛顿不动点迭代法得到的结果为: 实验小结与分析: 观察几道题的计算结果,二分法的迭代次数比牛顿迭代法的多,收敛速度较慢。 牛顿法一个主要优点: 当初始点充分靠近x*时,牛顿法收敛很快。 但是从程序中我们可以发现,牛顿迭代法要求导数,牛顿迭代法的计算量比二分法大。 最后,我们发现牛顿法是一个局部方法,仅当初始点x0充分靠近x*时,方法才是有效的,如果初始点x0远离x*,牛顿法将收敛很慢,甚至不收敛。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小组 计算方法 课程 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)