數值計算方法實驗四

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章