题目
欧拉公式
//欧拉公式代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
//导数或者斜率,主要修改这个地方完成对不同常微分方程的积分运算
double f(double x,double y){
return 10*x*(1-y);
}
vector<double> Euler(double x0,double y0,double h,int N){
vector<double> Y(N,0);
double x=x0;
Y[0]=y0;
for(int n=1;n<N;n++){
Y[n] = Y[n-1] + h*f(x,Y[n-1]);
x += h;
}
return Y;
}
int main(){
char a='n';
//准确值
float yxk[11]={
0.0,
0.0487706,
0.181269,
0.362372,
0.550671,
0.713495,
0.834701,
0.913706,
0.959238,
0.982578,
0.993262};
do{
cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;
double h;
int N;
cin>>h>>N;
cout<<"请输入要初始函数点(x0,y0):"<<endl;
double x0;
double y0;
cin>>x0>>y0;
vector<double> Y=Euler(x0,y0,h,N+1);
cout<<"欧拉格式计算结果为: "<<endl;
for(int i=0;i<N+1;i++){
cout<<x0+i*h<<" "<<Y[i]<<endl;
}
cout<<"欧拉格式计算误差为: "<<endl;
for(int i=0;i<N+1;i++){
cout<<x0+i*h<<" "<<Y[i]-yxk[i]<<endl;
}
cout<<"是否要继续?(y/n)"<<endl;
cin>>a;
}while(a=='y');
return 0;
}
/* 10步迭代结果
0 0
0.1 0
0.2 0.1
0.3 0.28
0.4 0.496
0.5 0.6976
0.6 0.8488
0.7 0.93952
0.8 0.981856
0.9 0.996371
1 0.999637
*/
改进的欧拉公式
//改进的欧拉公式
#include<iostream>
#include<string>
#include<vector>
using namespace std;
double f(double x,double y){
return 10*x*(1-y);
}
vector<double> ImprovedEuler(double x0,double y0,double h,int N){
vector<double> Y(N,0);
Y[0]=y0;
double x=x0;
double p=0;
double c=0;
for(int n=1;n<N;n++){
p=Y[n-1]+h*f(x,Y[n-1]);
x +=h;
c=Y[n-1]+h*f(x,p);
Y[n]=(p+c)/2;
}
return Y;
}
int main(){
char a='n';
float yxk[11]={
0.0,
0.0487706,
0.181269,
0.362372,
0.550671,
0.713495,
0.834701,
0.913706,
0.959238,
0.982578,
0.993262};
do{
cout<<"请输入步长h和要计算的函数值的个数N: "<<endl;
double h;
int N;
cin>>h>>N;
cout<<"请输入要初始函数点(x0,y0):"<<endl;
double x0;
double y0;
cin>>x0>>y0;
vector<double> Y=ImprovedEuler(x0,y0,h,N+1);
cout<<"欧拉格式计算结果为: "<<endl;
for(int i=0;i<N+1;i++){
cout<<x0+i*h<<" "<<Y[i]<<endl;
}
cout<<"欧拉格式计算误差为: "<<endl;
for(int i=0;i<N+1;i++){
cout<<x0+i*h<<" "<<Y[i]-yxk[i]<<endl;
}
cout<<"是否要继续?(y/n)"<<endl;
cin>>a;
}while(a=='y');
return 0;
}
准确值的计算
#include<iostream>
#include <cmath>
using namespace std;
int main(){
double x=0.0,y;
for(double i=0.1;i<=1;i=i+0.1)
{
x=x+0.1;
y=(1-exp(-5.0*x*x));
cout<<x<<" "<<y<<endl;
}
return 0;
}
/*
0 0
0.1 0.0487706
0.2 0.181269
0.3 0.362372
0.4 0.550671
0.5 0.713495
0.6 0.834701
0.7 0.913706
0.8 0.959238
0.9 0.982578
1 0.993262
*/