数值分析计算机实验和4.docx
《数值分析计算机实验和4.docx》由会员分享,可在线阅读,更多相关《数值分析计算机实验和4.docx(14页珍藏版)》请在冰豆网上搜索。
数值分析计算机实验和4
数值分析计算机实验和4
————————————————————————————————作者:
————————————————————————————————日期:
实验三复化辛卜生法,龙贝格法
一、目的与要求:
Ø通过实际计算体会各种方法的精确度;
Ø会编写用复化辛卜生、龙贝格算法求定积分的程序。
二、实验内容:
Ø通过实际计算体会各种方法的精确度并且会编写用复化辛卜生、龙贝格算法求定积分的程序
三、程序与实例
复化辛卜生公式
算法:
复化辛卜生公式为Sn=h/6
计算过程为:
1.令
2.对
计算
3.
。
程序与实例
例用复化辛卜生法计算积分
源程序:
#include
intmain()
{
doublea=0.0,b=1.0;
doublex=a;
doubleSn=0;
intn;
cout<<"请输入你想求的阶数:
";
cin>>n;
intm=2*n+1;
doubleh=0.5/n;//步长
double*f;
f=newdouble[m];
for(inti=0;i{
f[i]=1.0/(1+x*x);
x=x+h;
}
for(intj=0;j{
cout<<"f["<}
for(intk=0;k<=n-1;k++)
{
Sn=Sn+f[k*2]+4*f[2*k+1]+f[2*(k+1)];
}
cout<<"S"<return0;
}
运行结果
说明:
本例运行了三次,当
时,就与
时有6位数字相同,若用复化梯形法计算,当n=512时有此结果。
Ø龙贝格算法计算
算法
用事后估计法控制精度
。
源程序:
//龙贝格法计算积分,f(x)=1/(1+x^2)
#include
#include
#definee2.71828183
#definef(x)(1.0/(1.0+(x)*(x)))
voidmain()
{
doublea=0.0,b=1.0;
doubleae=5*e-6;cout<<"精度为:
"<doubleT1=0.5*(f(0)+f
(1));
doubleT2=0.5*T1+0.5*f(0.5);
cout<<"T1="<cout<<"T2="<doubleS1=4.0*T2/3.0-1.0*T1/3.0;
if(fabs((1.0/3.0)*(T2-T1)){
cout<<"S1满足精度要求!
"<cout<<"S1="<}
else
{cout<<"S1不满足精度要求!
"<}
doubleT4=0.5*T2+0.25*(f(0.25)+f(0.75));
doubleS2=(1.0/3.0)*(4*T4-T2);
doubleC1=(1.0/15.0)*(16*S2-S1);
if(fabs((1.0/15.0)*(S2-S1)){
cout<<"C1满足精度要求!
"<cout<<"C1="<}
else
{cout<<"C1不满足精度要求!
"<}
doubleT8=0.5*T4+(1.0/8.0)*(f(1.0/8.0)+f(3.0/8.0)+f(5.0/8.0)+f(7.0/8.0));
doubleS4=(1.0/3.0)*(4*T8-T4);
doubleC2=(16.0/15.0)*S4-(1.0/15.0)*S2;
doubleR1=(64.0/63.0)*C2-(1.0/63.0)*C1;
if(fabs((1.0/63.0)*(C2-C1)){
cout<<"R1满足精度要求!
"<cout<<"R1="<}
else
{cout<<"R1不满足要求!
"<}
DoubleT16=0.5*T8+(1.0/16.0)*(f(1.0/16.0)+f(3.0/16.0)+f(5.0/16.0)+f(7.0/16.0)+f(9.0/16.0)+f(11.0/16.0)+f(13.0/16.0)+f(15.0/16.0));
doubleS8=(1.0/3.0)*(4*T16-T8);
doubleC4=(16.0/15.0)*S8-(1.0/15.0)*S4;
doubleR2=(64.0/63.0)*C4-(1.0/63.0)*C2;
if(fabs((1.0/63.0)*(C4-C2)){
cout<<"R2满足精度要求!
"<cout<<"R2="<}
运行结果:
实验四改进欧拉法,二分法,牛顿法
计算机121班吴珍珍122460
一、目的与要求:
Ø熟悉求解常微分方程初值问题的有关方法和理论,主要是改进欧拉法
Ø会编制上述方法的计算程序
Ø针对实习题编制程序,并上机计算其所需要的结果;
二、实验内容:
Ø熟悉求解常微分方程初值问题的有关方法和理论,主要是改进欧拉法,体会其解法的功能。
程序与实例
Ø改进欧拉方法
算法概要
解一阶常微分方程初值问题
将区间[a,b]作n等分,取步长
。
欧拉公式为
梯形公式为
改进欧拉法,采用公式
或表为
实验题:
源代码:
#include
#definef(x,y)(-x*y*y)
intmain()
{
intn;
cout<<"您想把区间分成多少分?
"<<"";
cin>>n;
double*Xi=newdouble[n+1];
double*Yi=newdouble[n+1];
doubleh=3.0/n;
Xi[0]=0;
for(intk=0;k<=n;k++)
{
Xi[k+1]=Xi[k]+h;
}
Yi[0]=2;
for(inti=0;i<=n;i++)
{
Yi[i+1]=Yi[i]+(h/2.0)*(f(Xi[i],Yi[i])-(Xi[i+1]*(Yi[i]+h*f(Xi[i],Yi[i]))));
}
cout<<"n="<for(intj=0;j<=n;j++)
{
cout<<"X"<}
return0;
}
运行结果:
二分法和牛顿迭代法
一、目的与要求:
Ø通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点;
Ø比较二者的计算速度和计算精度。
二、实验内容:
Ø通过对二分法和牛顿迭代法作编程练习和上机运算,进一步体会它们在方程求根中的不同特点
三、程序与实例
Ø二分法
算法:
给定区间[a,b],并设与符号相反,取为根的容许误差,为的容许误差。
(1)令c=(a+b)/2
(2)如果(c-a)<或,则输出,结束;否则执行(3),
(3)如果,则令;否则则令,重复
(1),
(2),(3)。
书上课后习题1(老教材)。
源代码:
#include
#definef(x)(x*x-x-1)
intmain()
{
doublewucha=0.05;
doublea=1.0,b=2.0;
doublem;
intn=4;
for(inti=1;i<=n;i++)
{
m=(b+a)/2.0;
if(f(m)>0)
{
b=m;
}
else
{
a=m;
}
cout<<"("<}
cout<<"最后区间:
"<<"("<return0;
}
运行结果:
Ø牛顿迭代法
算法:
给定初值
,
为根的容许误差,
为
的容许误差,N为迭代次数的容许值。
(1)如果
=0或迭代次数大于N,则算法失败,结束;否则执行
(2)。
(2)计算
=
-
(3)若
<
或
<
,则输出
,程序结束;否则执行(4)。
(4)令
=
,转向
(1)。
书上课后习题7的
(1)(老教材)
源代码:
#include
#include
#definef(x)(x*x*x-3*x-1)
#defineff(x)(3*x*x-3)
intmain()
{
doublex0=2,x1;
for(intn=0;n<3;n++)
{
if(ff(x0)!
=0)
{
cout<<"f'(x0)!
=0,执行下一步算法!
"<}
else
{break;}
x1=x0-f(x0)/ff(x0);
cout<<"Xk="<if(fabs(x1-x0)<0.0005)
{
cout<<"算法结束!
"<<""<<"x*="<}
else
{
cout<<"f(x1)"<x0=x1;
}
}
return0;
}
运行结果: