}
}
(2)编制的程序求车门的3次样条插值函数S(x):
x属于区间[0,1]时;S(x)=2.51+0.8(x)-0.0014861(x)(x)-0.00851395(x)(x)(x)
x属于区间[1,2]时;S(x)=3.3+0.771486(x-1)-0.027028(x-1)(x-1)-0.00445799(x-1)(x-1)(x-1)
x属于区间[2,3]时;S(x)=4.04+0.704056(x-2)-0.0404019(x-2)(x-2)-0.0036543(x-2)(x-2)(x-2)
x属于区间[3,4]时;S(x)=4.7+0.612289(x-3)-0.0513648(x-3)(x-3)-0.0409245(x-3)(x-3)(x-3)
x属于区间[4,5]时;S(x)=5.22+0.386786(x-4)-0.174138(x-4)(x-4)+0.107352(x-4)(x-4)(x-4)
x属于区间[5,6]时;S(x)=5.54+0.360567(x-5)+0.147919(x-5)(x-5)-0.268485(x-5)(x-5)(x-5)
x属于区间[6,7]时;S(x)=5.78-0.149051(x-6)-0.657537(x-6)(x-6)+0.426588(x-6)(x-6)(x-6)
x属于区间[7,8]时;S(x)=5.4-0.184361(x-7)+0.622227(x-7)(x-7)-0.267865(x-7)(x-7)(x-7)
x属于区间[8,9]时;S(x)=5.57+0.256496(x-8)-0.181369(x-8)(x-8)+0.0548728(x-8)(x-8)(x-8)
x属于区间[9,10]时;S(x)=5.7+0.058376(x-9)-0.0167508(x-9)(x-9)+0.0583752(x-9)(x-9)(x-9)
S(0.5)=2.90856S(1.5)=3.67843S(2.5)=4.38147
S(3.5)=4.98819S(4.5)=5.38328S(5.5)=5.7237
S(6.5)=5.59441S(7.5)=5.42989S(8.5)=5.65976
S(9.5)=5.7323
习题6
23.(上机题)常微分方程初值问题数值解
(1)编制RK4方法的通用程序;
(2)编制AB4方法的通用程序(由RK4提供初值);
(3)编制AB4-AM4预测校正方法的通用程序(由RK4提供初值);
(4)编制带改进的AB4-AM4预测校正方法的通用程序(由RK4提供初值);
(5)对于初值问题
取步长
应用
(1)~(4)中的四种方法进行计算,并将计算结果和精确解
作比较;
(6)通过本上机题,你能得到哪些结论?
解:
程序为:
#include
#include
#include
#include
ofstreamoutfile("data.txt");
//此处定义函数f(x,y)的表达式
//用户可以自己设定所需要求得函数表达式
doublef1(doublex,doubley)
{
doublef1;
f1=(-1)*x*x*y*y;
returnf1;
}
//此处定义求函数精确解的函数表达式
doublef2(doublex)
{
doublef2;
f2=3/(1+x*x*x);
returnf2;
}
//此处为精确求函数解的通用程序
voidaccurate(doublea,doubleb,doubleh)
{
doublex[100],accurate[100];
x[0]=a;
inti=0;
outfile<<"输出函数准确值的程序结果:
\n";
do{
x[i]=x[0]+i*h;
accurate[i]=f2(x[i]);
outfile<<"accurate["<
i++;
}while(i<(b-a)/h+1);
}
//此处为经典Runge-Kutta公式的通用程序
voidRK4(doublea,doubleb,doubleh,doublec)
{
inti=0;
doublek1,k2,k3,k4;
doublex[100],y[100];
y[0]=c;
x[0]=a;
outfile<<"输出经典Runge-Kutta公式的程序结果:
\n";
do
{
x[i]=x[0]+i*h;
k1=f1(x[i],y[i]);
k2=f1((x[i]+h/2),(y[i]+h*k1/2));
k3=f1((x[i]+h/2),(y[i]+h*k2/2));
k4=f1((x[i]+h),(y[i]+h*k3));
y[i+1]=y[i]+h*(k1+2*k2+2*k3+k4)/6;
outfile<<"y"<<"["<
i++;
}while(i<(b-a)/h+1);
}
//此处为4阶Adams显式方法的通用程序
voidAB4(doublea,doubleb,doubleh,doublec)
{
doublex[100],y[100],y1[100];
doublek1,k2,k3,k4;
y[0]=c;
x[0]=a;
outfile<<"输出4阶Adams显式方法的程序结果:
\n";
for(inti=0;i<=2;i++)
{
x[i]=x[0]+i*h;
k1=f1(x[i],y[i]);
k2=f1((x[i]+h/2),(y[i]+h*k1/2));
k3=f1(