取h=0.1时用Euler法,改进Euler法,Rung-Kutta方法求其数值解并与精确解进行比较。
输入:求解区间,初值,数值解个数
输出:数值解
改进的欧拉方程 : 四阶龙格—库塔方法:
#include
#include
#include
using namespace std;
//定义系数C
double C;
//保存生成的节点横坐标
double dataX[100];
//保存生成的节点准确的纵坐标
double dataY[100];
//保存Euler的解
double dataE[100];
//保存改进Euler的解
double dataIE[100];
//保存Rung-Kutta方法求其数值解
double dataRK[100];
//定义原函数
double function(double x,double y);
//定义导函数
double derivative(double x);
//分割区间
void devide(double a,double b,int N,double y);
//定义用欧拉方法求解的函数
void Euler(double a,double b,double n);
//定义用改进欧拉方法求解的函数
void improveEuler(double a,double b,double n);
//定义四阶龙格-库塔方法求解的函数
void RungKutta(double a,double b,double n);
//打印表格
void printTable(double n);
int main()
{
//定义左右区间端点
double a ,b;
//定义初值
double y;
//定义数值解的个数
int n;
cout<<"请输入求解区间:";
cin>>a>>b;
cout<<"请输入初值:";
cin>>y;
cout<<"请输入求解个数:";
cin>>n;
//算出原函数的系数C
C = (pow(y,2) - 2*a - 1)/(pow(M_E,2*a));
devide(a,b,n,y);
Euler(a,b,n);
improveEuler(a,b,n);
RungKutta(a,b,n);
printTable(n);
return 0;
}
//定义原函数
double function(double x)
{
return sqrt(C*pow(M_E,2*x) + 2*x + 1);
}
//定义导函数
double derivative(double x,double y)
{
return y - 2*x/y;
}
//分割区间
void devide(double a,double b,int N,double y)
{
double x = a;
double dX = (b - a) /(N) ;
//x=0时,特殊处理
dataX[0] = x;
dataY[0] = y;
for(int i=1;i<=N;i++)
{
x = a + i * dX;
dataX[i] = x;
dataY[i] = function(x);
}
}
//定义用欧拉方法求解的函数
void Euler(double a,double b,double n)
{
dataE[0] = dataY[0];
for(int i=0;i