1.用歐拉法、改進歐拉法和四階龍格-庫塔法求解一階常微分方程初值問題
令步長h=0.1。
要求:
(1) 步長h的值從鍵盤終端輸入;
(2) 將三種方法計算的每一個節點的函數值打印輸出,並和精確值進行比較(精確解對應的解析表達式爲),根據計算結果分析這三種方法求解結果的精度差別。
#include<iostream>
using namespace std;
int main(){
double h,Y=1;
int n;
cout<<"輸入步長h: "<<endl;
scanf("%lf",&h);
cout<<"歐拉法:"<<endl;
cout<<" xn "<<" yn "<<endl;
for(n=1;n<=10;n++){
Y = Y + h*(Y - 2*((n-1)*h)/Y);
printf(" %.1lf %.6lf\n",n*0.1,Y);
}
cout<<"改進歐拉法:"<<endl;
double x0=0,y0=1,x1,y1,yp,yc;
n=0;
cout<<" xn "<<" yn "<<endl;
do{
x1 = x0 + h;
yp = y0 + h*(y0 - 2*x0/y0);
yc = y0 + h*(yp - 2*x1/yp);
y1 = (yp+yc)/2;
printf(" %.1lf %.6lf\n",x1,y1);
n++;
x0 = x1;
y0 = y1;
}while(n<10);
x0=0,y0=1;
n=0;
double k1,k2,k3,k4;
cout<<"四階龍格-庫塔法:"<<endl;
cout<<" xn "<<" yn "<<endl;
do{
k1 = y0 - 2*x0/y0;
k2 = y0 + h/2*k1 - (2*x0+h)/(y0+h/2*k1);
k3 = y0 + h/2*k2 - (2*x0+h)/(y0+h/2*k2);
k4 = y0 + h*k3 - 2*(x0+h)/(y0+h*k3);
y1 = y0 + (h/6)*(k1+2*k2+2*k3+k4);
x1 = x0 + h;
printf(" %.1lf %.6lf\n",x1,y1);
n++;
x0 = x1;
y0 = y1;
}while(n<10);
return 0;
}
2.用四階龍格-庫塔法求解一階常微分方程組初值問題
x∈[0, 2],h=0.1。
要求:
(1) 步長h的值從鍵盤終端輸入;
(2) 將每一步的計算結果打印輸出。
程序源代碼:
#include<iostream>
using namespace std;
double f1(double x,double y1,double y2){
return (1/(y2 - x));
}
double f2(double x,double y1,double y2){
return (-1/y1 + 1);
}
int main(){
double h,x0=0,x1,y0=1,y1,y20=1,y21,k1,k2,k3,k4,l1,l2,l3,l4;
int n=0;
cout<<"請輸入步長h:"<<endl;
cin>>h;
cout<<endl<<"每一步的計算結果爲:"<<endl;
while(n!=(2/h)){
x1 = x0 + h;
k1 = f1(x0,y0,y20);
l1 = f2(x0,y0,y20);
k2 = f1(x0+h/2,y0+h*k1/2,y20+h*l1/2);
l2 = f2(x0+h/2,y0+h*k1/2,y20+h*l1/2);
k3 = f1(x0+h/2,y0+h*k2/2,y20+h*l2/2);
l3 = f2(x0+h/2,y0+h*k2/2,y20+h*l2/2);
k4 = f1(x1,y0+h*k3,y20+h*l3);
l4 = f2(x1,y0+h*k3,y20+h*l3);
y1 = y0 + h*(k1+2*k2+2*k3+k4)/6;
y21 = y20 + h*(l1+2*l2+2*l3+l4)/6;
printf("x%d = %.6lf y1%d = %.6lf y2%d = %.6lf\n",n+1,x1,n+1,y1,n+1,y21);
n++;
x0 = x1;
y0 = y1;
y20 = y21;
}
return 0;
}