博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
欧拉法求解常微分方程(c++)【转载】
阅读量:2289 次
发布时间:2019-05-09

本文共 1280 字,大约阅读时间需要 4 分钟。

 摘自《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

你可能感兴趣的文章
【编译原理】第一章引论
查看>>
【编译原理】第三章 词法分析(上)
查看>>
【数字图像处理】第二章 数字图像基础
查看>>
【编译原理】第三章 词法分析(下)
查看>>
【数字图像处理】实验一 图像的平移,缩放和旋转(vs2017+opencv)
查看>>
【数字图像处理】opencv的安装及vs2017环境的配置
查看>>
【数字图像处理】第三章 灰度变换和空间滤波(上)
查看>>
【数字图像处理】第三章 灰度变换和空间滤波(中)
查看>>
【c++】编程常见错误处理
查看>>
【数字图像处理】实验二 直方图均衡(vs2017+opencv)
查看>>
【数字图像处理】线性滤波、最大值滤波,最小值滤波、中值滤波、高频补偿滤波(vs2017+openCV)
查看>>
【编译原理】第三章词法分析
查看>>
【编译原理】第四章语法分析
查看>>
QT遇坑警告“parameter count mismatch”
查看>>
【计算机网络】差错控制
查看>>
【杂谈】关于windows10电脑有网络,但是浏览器打不开网页的情况。
查看>>
【杂谈】windows10给U盘或者文件加密(设置访问密码)
查看>>
【杂谈】win10步骤记录器的使用
查看>>
【计算机网络】第四章 局域网
查看>>
【c++】=重载,报错:没有合适的复制构造函数
查看>>