数值微分C++实现

  • 问题描述


取h=0.1时用Euler法,改进Euler法,Rung-Kutta方法求其数值解并与精确解进行比较。

输入:求解区间,初值,数值解个数

输出:数值解

  • 基本公式

改进欧拉公式:

 四阶龙格—库塔方法:数值微分C++实现_第1张图片



  • 流程图

改进的欧拉方程 :                             四阶龙格—库塔方法:

数值微分C++实现_第2张图片数值微分C++实现_第3张图片


  • 算法实现
#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

  • 运行截图

数值微分C++实现_第4张图片




你可能感兴趣的:(数值微分,数值分析,计算方法,数值微分,C++)