cout<<"\n";
}
}
doubleF1(doublex,doubley1,doubley2)
{returny2;}
doubleF2(doublex,doubley1,doubley2)
{return-y1;}
3、试验结果及分析
(i)运行结果
R-K法
精确解
0
0
1
0
1
0.1
0.0998333
0.995004
0.0998334
0.995004
0.2
0.198668
0.980067
0.198669
0.980067
0.3
0.29552
0.955337
0.29552
0.955336
0.4
0.389418
0.921061
0.389418
0.921061
0.5
0.479425
0.877583
0.479426
0.877583
0.6
0.564642
0.825336
0.564642
0.825336
0.7
0.644217
0.764843
0.644218
0.764842
0.8
0.717356
0.696707
0.717356
0.696707
0.9
0.783326
0.621611
0.783327
0.62161
1
0.84147
0.540303
0.841471
0.540302
(ii)结果分析
经典四级四阶Runge-Kutta格式是高精度的,并且是显示格式,所以该格式具有算法简单并能得到高精度解的优点。
通过四级四阶Runge-Kutta格式解高阶方程,由上表可见,四级四阶Runge-Kutta法的确可计算高精度的解。
尽管如此,我们仍不能利用计算机求得它们的精确解,这是因为计算机计算,不论运算器能进行多少位数的运算,总会出现舍入误差以及在计算过程中误差的传递。
有上表的误差分析一栏,可以看出随着计算的进行,误差在不断的累积。
第二章抛物型方程的差分法
实验四
1、实验题目
用古典显式和古典隐式格式计算抛物型方程
满足初始条件
和边界条件
的近似解,
,并与解析解
进行比较(
)。
2、程序
#include
#include
constdoublepi=3.1415926;
constintN=11;
constintM=11;
constdoublet=0.001;
constdoublee=2.718281828459;
doubleUt(doublex);//初始时刻值
doubleUx1(doubletime);//左边值
doubleUx2(doubletime);//右边值
doubleFUN(doublex,doubletime);
voidmain()
{
inti,k;
doubleU[M][N];
doubleh,a,b,T1,Tn,r;
cout<<"请输入x所属区间[a,b]\n";
cin>>a>>b;
cout<<"请输入t所属区间(t1,tn)\n";
cin>>T1>>Tn;
h=(b-a)/(N-1);
r=t/(h*h);
for(k=0;k{
U[k][0]=Ux1(T1+t*k);
U[k][N-1]=Ux2(T1+t*k);
}
for(i=0;iU[0][i]=Ut(a+h*i);
for(k=1;kfor(i=1;i{U[k][i]=r*U[k-1][i-1]+(1-2*r)*U[k-1][i]+r*U[k-1][i+1];}
cout<<"古典显格式计算结果(t=0.005,h=0.1):
\n";
for(i=0;i{cout<
cout<<"\n";
cout<<"精确计算结果(t=0.005,h=0.1):
\n";
for(i=0;i{cout<}
doubleUt(doublex)//初始时刻值
{
if(((int)x)>=1)//为了减小误差当x等于整数时,令x=0;此时sin(x*pi)值不变
x=0;
return(sin(pi*x));
}
doubleUx1(doubletime)//左边值
{return0;}
doubleUx2(doubletime)//右边值
{return0;}
doubleFUN(doublex,doubletime)
{
doubles1,s2;
if(((int)x)>=1)
x=0;
s1=-pow(pi,2)*time;
s2=pow(e,s1)*sin(pi*x);
returns2;
}
3、试验结果及分析
(i)运行结果
节点
古典显式格式解
真解
0
0
0
0.1
0.294186
0.294138
0.2
0.559575
0.559483
0.3
0.770189
0.770063
0.4
0.905411
0.905263
0.5
0.952005
0.95185
0.6
0.905411
0.905263
0.7
0.770189
0.770063
0.8
0.559575
0.559483
0.9
0.294186
0.294138
1
0
0
(ii)结果分析
通过显示差分格式和隐式差分格式求解抛物型方程,由上表的计算结果,可以看出古典隐式格式比古典显式格式具有更高的精度。
实验五
1、实验题目
用Crank-Nicolson差分格式计算抛物型方程
满足初始条件
和边界条件
在
处的解,
。
2、程序
#include
#include
constdoublepi=3.1415926;
constintN=11;
constintM=11;
constdoublet=0.1;
constdoubleh=0.1;
constdoublee=2.71828;
doubleUt(doublex);//初始时刻值
doubleUx1(doubletime);//左边值
doubleUx2(doubletime);//右边值
doubleFUN(doublex,doubletime);
voidmain()
{
inti,k;
doubleU[11][11],d[9];
doublea,b,T1,Tn,r;
doubleg[9],w[9];
cout<<"请输入x所属区间[a,b]\n";
cin>>a>>b;
cout<<"请输入t所属区间(t1,tn)\n";
cin>>T1>>Tn;
r=t/(h*h);
for(k=0;k<11;k++)
{
U[k][0]=Ux1(T1+t*k);
U[k][10]=Ux2(T1+t*k);
}
for(i=0;i<11;i++)
U[0][i]=Ut(a+h*i);
for(k=1;k<11;k++)
{
//计算方程常数项
d[0]=(1-r)*U[k-1][0]+0.5*r*U[k-1][1];
d[8]=(1-r)*U[k-1][9]+0.5*r*U[k-1][8];
for(i=1;i<8;i++)
{
d[i]=(1-r)*U[k-1][i]+0.5*r*(U[k-1][i+1]+U[k-1][i-1]);
}
g[0]=d[0]/(1+r);
w[0]=0.5*r/(1+r);
for(i=1;i<9;i++)
{
g[i]=(d[i]+0.5*r*g[i-1])/(1+r-0.5*r*w[i-1]);
w[i]=0.5*r/(1+r-0.5*r*w[i-1]);
}
U[k][9]=g[8];
for(i=8;i>0;i--)
U[k][i]=g[i-1]+w[i-1]*U[k][i+1];
}
cout<<"古典显格式计算结果(t=0.1,h=0.1):
\n";
for(i=0;i<11;i++)
{cout<
cout<<"\n";
cout<<"精确计算结果(t=0.1,h=0.1):
\n";
for(i=0;i{cout<cout<<"\n";
cout<<"古典显格式计算结果(t=0.2h=0.1):
\n";