欧拉法求解常微分方程(c++)【转载】

 摘自《c++和面向对象数值计算》,代码简洁明快,采用类进行封装实现代码,增强代码的重用性,通过继承可实现代码的重用,采用函数指针,通用性增强,在函数改变时只需要单独改变函数部分的代码,无需对所有代码进行重写,对其中代码稍加改动,源代码有缺陷,没有释放内存,会造成内存泄露,在构造函数当中,将源代码的在函数体中赋值,改为列表赋值,可以稍微提高代码的执行效率。 

#include<iostream>

#include <cmath>

#include <algorithm>

using namespace std;

   

class ode

{

      double tini;      //初始时间

      double ison;      //初始解

      double tend;      //结束时间

      double(*sfn)(double t, double x);      //源函数,此处采用函数指针的方式,更具通用性

public:

      ode(double t0, double x0, double T, double(*f)(double, double)) :      //类的构造函数

            tini(t0), ison(x0), tend(T), sfn(f){}

      double* euler(int n) const;            //n子区间欧拉方法

};

   

double f(double t, double x)      //源函数

{

      return x*(1 - exp(t)) / (1 + exp(t));

}

   

double exact(double t)      //真实解

{

      return 12 * exp(t) / pow(1 + exp(t), 2);

}

   

int main()

{

      ode exmp(0, 3, 2, f);      //x(0)=3,T=2

      double* soln = exmp.euler(100);            //100个子区间

      double norm = 0;

      double h = 2.0 / 100;      //计算步长

      for (int k = 1; k <= 100; k++)

            norm = max(norm, fabs(exact(k*h) - soln[k]));

      cout << "max norm of error by euler's method = "

            << norm << endl;

      delete[] soln;

      return 0;

}

   

double* ode::euler(int n) const            //显式欧拉方法

{

      double* x = new double[n + 1];      //近似解

      double h = (tend - tini) / n;      //步长

      x[0] = ison;            //初始解

      for (int k = 0; k < n; k++)

            x[k + 1] = x[k] + h*sfn(tini + k*h, x[k]);

      return x;

}
 

转载于:https://www.cnblogs.com/liusuanyatong/p/11259909.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值