1. 数学原理

以简单的热方程为例,其中D为常数:

根据导数的定义式有:

如果我们将x理解成delta_x*n,则u(x,t)可以看成只是t的函数,n作为参数来控制x,即定义:

这样我们就可以把这个偏微分方程看做是一个常微分方程

对于常微分方程的C++实现,可以先看看https://blog.csdn.net/weixin_39374967/article/details/105333880

二、C++实现

如下代码中,新建了一个叫solutionDirichletProblem.csv的文件记录偏微分方程的计算结果;

初始条件是

#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>// 设置左右边界条件
double DirichletBCLeft(double t)
{return 0.0;
}
double DirichletBCRight(double t)
{return 0.0;
}// 新建一个文件,记录时间和函数值
void AddCurrentStateToOpenStream(double currentTime, const std::vector<double>& currentFunctionValue)
{std::ofstream fileOutput("solutionDirichletProblem.csv", std::ofstream::app);fileOutput << currentTime << " , ";for (int i = 0; i < currentFunctionValue.size() - 1; ++i){fileOutput << currentFunctionValue[i] << " , ";}fileOutput << currentFunctionValue.back() << std::endl;fileOutput.close();
}int main()
{const double finalTime = 0.1;const int numberOfTimeSteps = 10000;const double deltaT = finalTime / numberOfTimeSteps;// x的取值范围是[0,1]const double domainSize = 1.0;const int numberOfSpatialElements = 51;const double deltaX = domainSize / (numberOfSpatialElements - 1);// 初始条件里,开始结尾都是0,中间部分是sin(pi*x)std::vector<double> initialFunctionValue(numberOfSpatialElements, 0.0);initialFunctionValue[0] = DirichletBCLeft(0.0);initialFunctionValue.back() = DirichletBCRight(0.0);for (int i = 1; i < numberOfSpatialElements - 1; ++i){initialFunctionValue[i] = sin(M_PI*i*deltaX);}// initial是t=0时的x序列,previous是t时的x序列,current是t+deltaT的序列std::vector<double> previousFunctionValue = initialFunctionValue;std::vector<double> currentFunctionValue = previousFunctionValue;double currentTime = 0.0;double outputTimesInterval = finalTime / 10;double nextOutputTime = outputTimesInterval;AddCurrentStateToOpenStream(currentTime, previousFunctionValue);while (currentTime < finalTime){previousFunctionValue = currentFunctionValue;for (int i = 1; i < numberOfSpatialElements - 1; ++i){currentFunctionValue[i] += deltaT / deltaX / deltaX * (previousFunctionValue[i + 1] + previousFunctionValue[i - 1] - 2 * previousFunctionValue[i]);}// 更新开头结尾边界条件currentFunctionValue[0] = DirichletBCLeft(currentTime);currentFunctionValue.back() = DirichletBCRight(currentTime);if (currentTime >= nextOutputTime){AddCurrentStateToOpenStream(currentTime, currentFunctionValue);nextOutputTime += outputTimesInterval;}currentTime += deltaT;}return 0;
}

C++实现前向欧拉法Forward Euler解决偏微分方程相关推荐

  1. 前向欧拉法、后向欧拉法简介

    前言 这里简单介绍一下前向欧拉法和后向欧拉法. (在百度上没有找到满意的结果,所以在此补充) 1 欧拉方法 其简介 [2]: 欧拉方法,命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初 ...

  2. matlab 前向欧拉法,前向后项差分和显式隐式欧拉法

    摘要: 本文主要介绍前向后向差分,显式隐式欧拉法及其稳定性分析. 前向差分对应显式方法,后向差分对应隐式方法.显式欧拉法是比较流行的显式方法,隐式欧拉法是比较流行的隐式方法. 显式欧拉法条件稳定,对积 ...

  3. Eclipse中出现JS文件前有红叉的解决方法

    Eclipse中出现JS文件前有红叉的解决方法 参考文章: (1)Eclipse中出现JS文件前有红叉的解决方法 (2)https://www.cnblogs.com/zhangda001/p/853 ...

  4. Linux内核编程广泛使用的前向声明(Forward Declaration)

    前向声明 编程定律 先强调一点: 在一切可能的场景,尽可能地使用前向声明(Forward Declaration).这符合信息隐蔽的原则. 一个例子 regmap 那么前向声明究竟是个什么鬼? 在内核 ...

  5. 前后端分离,如何解决跨域问题

    前后端分离,如何解决跨域问题 跨域 1.Jsonp,只能使用get提交,传输数据量有限 2.CORS(Corss-origin resource sharing)跨域资源共享,支持post提交    ...

  6. linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  7. C++基础(1)- 声明(前向声明 Forward Declaration)与定义

    C++基础(1)- 声明(前向声明 Forward Declaration)与定义 如需转载请标明出处:http://blog.csdn.net/itas109 技术交流:129518033 文章目录 ...

  8. 侠客风云传未能连接到服务器,《侠客风云传:前传》无法启动解决方法

    导 读 <侠客风云传前传>作为不少玩家期待已久的国产大作,不少玩家在刚开始的时候就遇到了游戏打不开进不去.无法启动的问题怎么办,这里给大家带来了<侠客风云传:前传>打不开无法启 ...

  9. 前向欧拉法的PI调节器C语言代码

    前向欧拉法的 PI 调节器的 C 语言代码大致如下所示: #include <stdio.h>#define TS 0.01 // 采样周期 #define Kp 1.0 // 比例系数 ...

最新文章

  1. Graphviz样例之无向图
  2. 在FC7上安装xmms
  3. pytorch离线安装(探索尝试版本)
  4. 一文了解P2P的前世今生
  5. CodeForces - 628D Magic Numbers(数位dp)
  6. LeetCode 430. 扁平化多级双向链表(DFS)
  7. 关于抓包出现TCP DUP ACK问题
  8. DEFERRED_SEGMENT_CREATION
  9. VS中使用码云gitee建立源代码管理
  10. python获取指定扩展名的文件_用Python提取文件夹下的特定扩展名的文件
  11. U盘启动盘制作,金士顿2GU盘量产工…
  12. python猜年龄代码_Python实现猜年龄游戏代码实例
  13. yv12、I420、nv12、nv21相互转换
  14. Java中violate关键字详解(2)?真正了解violate
  15. 推荐 | 掌握这12条经验,对理解机器学习至关重要!(可下载PDF)
  16. 上市公司注册城市、上市日期、成立日期以及行业和注册资本信息
  17. 机器视觉(相机、镜头、光源)详细解析
  18. Python websocket爬虫
  19. 使用计算机读取其时钟值,计算机网络中的时间同步
  20. 懂得选择,学会放弃..

热门文章

  1. mapboxGL和高德API结合实现路径规划
  2. easypoi模板单文件导出多个sheet页(单文件单sheet复制到多个导出)
  3. 关于养老保险你不得不了解的事儿
  4. 基于SG90舵机(伺服电机)的操作笔记
  5. 如何给135编辑器推文添加附件
  6. ios 添加浮动效果_IOS 实现3D 浮动效果动画
  7. 眼见不为“实”,人们更信任人工智能合成的假脸
  8. scum官方服务器维护时间,在等公测的这段时间里聊聊最近很火的scum吧
  9. 包装类-自动装箱、拆箱
  10. 5分钟带你看完 WWDC 2018