计算方法实验二.doc
《计算方法实验二.doc》由会员分享,可在线阅读,更多相关《计算方法实验二.doc(9页珍藏版)》请在冰豆网上搜索。
计算机与信息学院
计算方法实验报告
专业班级
学生姓名及学号
课程教学班号
任课教师
汪荣贵
实验指导教师
实验地点
逸夫楼507
2013~2014学年第一学期
实验二 数值微积分与非线性方程求根迭代法
1实验目的
(1)熟悉复化梯形方法、复化Simpson方法、梯形递推算法、龙贝格算法;
(2)熟悉非线性方程求根简单迭代法,牛顿迭代及牛顿下山法
(3)能编程实现复化梯形方法、复化Simpson方法、梯形递推算法、龙贝格算法;
(4)能编程实现简单迭代法,牛顿迭代及牛顿下山法
(5)理解并掌握自适应算法和收敛加速算法的基本思想;
(6)分析实验结果体会各种方法的精确度,建立计算机求解定积分问题的感性认识
(7)认识选择迭代格式的重要性
(8)对迭代速度建立感性的认识;分析实验结果体会初值对迭代的影响
2实验内容
(1)用龙贝格算法计算
输入:
积分区间,误差限
输出:
序列Tn,Sn,Cn,Rn及积分结果(参考书本P81的表2-4)
(2)中点加速法求的导数。
(3)用牛顿下山法解方程(初值为0.6)
输入:
初值,误差限,迭代最大次数,下山最大次数
输出:
近似根各步下山因子
3算法基本原理
在许多实际问题中,常常需要计算定积分的值。
根据微积分学基本定理,若被积函数f(x)在区间[a,b]上连续,只要能找到f(x)的一个原函数F(x),便可利用牛顿-莱布尼兹公式求得积分值。
但是在实际使用中,往往遇到如下困难,而不能使用牛顿-莱布尼兹公式。
(1)找不到用初等函数表示的原函数
(2)虽然找到了原函数,但因表达式过于复杂而不便计算
(3)f(x)是由测量或计算得到的表格函数
由于以上种种困难,有必要研究积分的数值计算问题。
利用插值多项式则积分转化为,显然易算。
称为插值型求积公式。
最简单的插值型求积公式是梯形公式和Simpson公式,。
当求积结点提供较多,可以分段使用少结点的梯形公式和Simpson公式,并称为复化梯形公式、复化Simpson公式。
如步长未知,可以通过误差限的控制用区间逐次分半的策略自动选取步长的方法称自适应算法。
梯形递推公式给出了区间分半前后的递推关系。
由梯形递推公式求得梯形序列,相邻序列值作线性组合得Simpson序列,Simpson序列作线性组合得柯特斯序列,柯特斯序列作线性组合的龙贝格序列。
若|R2-R1|如此加工数据的过程叫龙贝格算法,如下图所示:
图2.1龙贝格算法数据加工流程
复化梯形公式
复化Simpson公式
梯形递推公式
加权平均公式:
龙贝格算法大大加快了误差收敛的速度,由梯形序列O(h2)提高到龙贝格序列的O(h8)
求非线性方程组的解是科学计算常遇到的问题,有很多实际背景.各种算法层出不穷,其中迭代是主流算法。
只有建立有效的迭代格式,迭代数列才可以收敛于所求的根。
因此设计算法之前,对于一般迭代进行收敛性的判断是至关重要的。
牛顿法也叫切线法,是迭代算法中典型方法,只要初值选取适当,在单根附近,牛顿法收敛速度很快,初值对于牛顿迭代
至关重要。
当初值选取不当可以采用牛顿下山算法进行纠正。
一般迭代:
牛顿公式:
牛顿下山公式:
下山因子
下山条件
4算法描述
(1)梯形递推算法见流程图
(2)龙贝格算法见流程图
图2.2梯形递推算法流程图
图2.3龙贝格算法流程图
(3)牛顿下山算法见流程图
图3.2牛顿下山算法流程图
5输入输出
A.龙贝格
实验输出:
参考输出:
对比结果完全一致
B.中心加速求导:
结果准确。
C.牛顿下山:
结果准确,迭代次数较小。
6源代码
A.龙贝格:
//Sin(x)/xin[0,1]
#include
#include
#defineeps1e-12
usingnamespacestd;
doublea,b,h;
doublefx(doublex)
{
if(x==0)return1;
returnsin(x)/x;
}
intmain()
{
cin>>a>>b;
h=fabs(b-a);
doubleS1,S2,T1,T2,C1,C2,R1,R2;
doublex,f;
T2=T1=(fx(a)+fx(b))*h/2;
intk=0;
R1=0;R2=1;h*=2;
while(fabs(R2-R1)>eps)
{
cout< if(k>1)cout< if(k>2)cout< if(k>3)cout< cout<T1=T2;
S1=S2;
if(k>1)C1=C2;
if(k>2)R1=R2;
k++;h/=2;
f=0;x=a+h/2;
while(x
{
f+=fx(x);
x+=h;
}
T2=(T1+h*f)/2;
S2=T2+(T2-T1)/3;
if(k==1)continue;
C2=S2+(S2-S1)/15;
if(k==2)continue;
R2=C2+(C2-C1)/63;
}
system("pause");
return0;
}
B.中心加速求导:
//y=e^x
#include
#include
#defineeps1e-6
usingnamespacestd;
doubleG(doubleh)
{
if(h<0)h=-h;
return(exp(1+h)-exp(1-h))/(2*h);
}
intmain()
{
doubleh;
cin>>h;
doubleS1,S2,T1,T2,C1,C2,R1,R2;
doublex,f;
T2=T1=G(h);
intk=0;
R1=0;R2=1;h*=2;
while(fabs(R2-R1)>eps)
{
cout< if(k>1)cout< if(k>2)cout< if(k>3)cout< cout< T1=T2;
S1=S2;
if(k>1)C1=C2;
if(k>2)R1=R2;
k++;h/=2;
T2=G(h);
S2=T2+(T2-T1)/3;
if(k==1)continue;
C2=S2+(S2-S1)/15;
if(k==2)continue;
R2=C2+(C2-C1)/63;
}
system("pause");
return0;
}
C.牛顿下山:
//solvex^3-x-1=0
#include
#include
#defineE1e-10
usingnamespacestd;
doubleff(doublex)
{
returnx*x*x-x-1;
}
doublefai(doublex)//x^3-x-1=0
{
doublel=1.0;//lambda
doubley;
do
{
y=x-l*(x*x*x-x-1)/(3*x*x-1);
l/=2;
}while(fabs(ff(y))>fabs(ff(x)));
returny;
}
doubleIteration(doublex0,double(*f)(double),boolz)
{
doublex1=f(x0);
intk=0;
while(fabs(x1-x0)>E&&k<100)
{
if(z)printf("x%d=%.11f\n",k,x0);
x0=x1;
x1=f(x0);
k++;
}
if(k==100)printf("Iterationfailed.\n");
elseprintf("TheSolveis:
%.8f\n",x0);
}
intmain()
{
doublex;
printf("Pleaseinputx0:
");
cin>>x;
Iteration(x,fai,1);
system("pause");
return0;
}
7总结
通过这一次实验,理解并掌握了自适应算法和收敛加速算法的基本思想,熟悉复化梯形方法、复化Simpson方法、梯形递推算法、龙贝格算法。
编程实现了复化Simpson方法、龙贝格算法和中心加速求导方法;分析实验结果体会各种方法的精确度,建立计算机求解定积分问题的感性认识。
熟悉了非线性方程求根简单迭代法,牛顿迭代及牛顿下山法,能编程实现简单迭代法,牛顿迭代及牛顿下山法,认识选择迭代格式的重要性,对迭代速度建立感性的认识;分析实验结果体会初值对迭代的影响。
在编写牛顿下山法的过程中发现对下山因子的选取理解不到位。
经过调试个请教老师,明白了:
当迭代值不满足单调下降时,下山因子从1开始每次折半尝试,目的是通过缩小下山因子,来修正迭代值。
图像上理解就是折半步长。
故每次迭代后都需判定单调性,选取下山因子。
、