很多物理现象的都可以用方程来描述,比如热传导与物质扩散可以用扩散方程来描述,流体的流动可以用NS方程描述等等。如果能够将这些偏微分方程求解出来,就可以来对很多物理现象进行仿真,现在工程中的仿真软件都是通过程序数值求解一类偏微分方程。今天我们尝试求解一类偏微分方程,为了简单起见,我们以一个简单的平流方程为例,方程形式如下:平流方程

求解偏微分方程的数值解法非常多,这里也是采用一种较为直白的方法--------有限差分法,将上述的偏微分方程离散为差分方程,这里采用一种迎风格式的差分方法,首先我们可以看出这个平流方程由两个维度,一个空间维度x,一个时间维度t,我们对这两个维度进行离散:差分网格

差分方程

将差分方程简化一下

通过上述的差分方程我们可以通过上一个时间步的结果推进得到下一个时间步的结果:

这里我们边界条件是周期边界如下图,周期边界的好处就是我们可以一直看到在我们的求解域内看到波的移动:

方程的初始条件我们给空间维度上一个指数函数的波形:

下面我们通过一段简单(其实挺长的,但是很容易理解)的Python代码对上述差分方程进行求解:

"""This code solves the advection equationU_t + vU_x = 0over the spatial domain of 0 <= x <= 1 that is discretizedinto 103 nodes, with dx=0.01, using the First-Order Upwind (FOU)scheme with Forward difference in Eq.for an initial profile of a Gaussian curve, defined byU(x,t) = exp(-200*(x-xc-v*t).^2)where xc=0.25 is the center of the curve at t=0.The periodic boundary conditions are applied either end of the domain.The velocity is v=1. The solution is iterated until t=1.5 seconds."""

import numpy as np

import matplotlib.pyplot as plt

import time

start =time.clock()

class UpwindMethod1:

def __init__(self, N, tmax):

self.N = N # number of nodes

self.tmax = tmax

self.xmin = 0

self.xmax = 1

self.dt = 0.009 # timestep

self.v = 1 # velocity

self.xc = 0.25

self.initializeDomain()

self.initializeU()

self.initializeParams()

def initializeDomain(self):

self.dx = (self.xmax - self.xmin)/self.N

self.x = np.arange(self.xmin-self.dx, self.xmax+(2*self.dx), self.dx)

def initializeU(self):

u0 = np.exp(-200*(self.x-self.xc)**2)

self.u = u0.copy()

self.unp1 = u0.copy()

def initializeParams(self):

self.nsteps = round(self.tmax/self.dt)

def solve_and_plot(self):

tc = 0

for i in range(self.nsteps):

plt.clf()

# The FOU scheme, Eq. (18.21)

for j in range(self.N+2):

self.unp1[j] = self.u[j] - (self.v*self.dt/(self.dx))*(self.u[j]-self.u[j-1])

self.u = self.unp1.copy()

# Periodic boundary conditions

self.u[0] = self.u[self.N+1]

self.u[self.N+2] = self.u[1]

plt.plot(self.x, self.u, 'bo-', label="First-order Upwind")

plt.axis((self.xmin-0.12, self.xmax+0.12, -0.2, 1.4))

plt.grid(True)

plt.xlabel("Distance (x)")

plt.ylabel("u")

plt.legend(loc=1, fontsize=12)

plt.suptitle("Time =%1.3f" % (tc+self.dt))

plt.pause(0.01)

tc += self.dt

def main():

sim = UpwindMethod1(100, 1.5)

sim.solve_and_plot()

plt.show()

if __name__ == "__main__":

main()

end = time.clock()

print('Running time:%sSeconds'%(end-start))

运行程序大家就可以看到一个波在来回移动。这里以一个简单平流方程为例,然后构造了其迎风格式的差分方程,然后用我们可爱的python语言进行求解,这里再次说明了计算机语言是一个工具,有了这个工具我们可以用它来做我们想做的事,对我来言Python做科学计算非常的Nice。

python求解偏微分方程_Python数值计算----------求解简单的偏微分方程相关推荐

  1. python解不定积分_python快速求解不定积分和定积分

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客. 基本概念 定积分的定义如下: 不定积分定义如下: 如果想了解更 ...

  2. matlab偏微分方程数值解误差_Python数值计算----------求解简单的偏微分方程

    很多物理现象的都可以用方程来描述,比如热传导与物质扩散可以用扩散方程来描述,流体的流动可以用NS方程描述等等.如果能够将这些偏微分方程求解出来,就可以来对很多物理现象进行仿真,现在工程中的仿真软件都是 ...

  3. python计算矩阵方程_python/sympy求解矩阵方程的方法

    sympy版本:1.2 假设求解矩阵方程 AX=A+2X 其中 求解之前对矩阵方程化简为 (A−2E)X=A 令 B=(A−2E) 使用qtconsole输入下面程序进行求解 In [26]: fro ...

  4. python 字典处理_python numpy求解积分python中的字典操作及字典函数

    字典 dict_fruit = {'apple':'苹果','banana':'香蕉','cherry':'樱桃','avocado':'牛油果','watermelon':'西瓜'} 字典的操作 W ...

  5. python 线性回归函数_Python实现的简单线性回归算法实例分析

    本文实例讲述了Python实现的简单线性回归算法.分享给大家供大家参考,具体如下: 用python实现R的线性模型(lm)中一元线性回归的简单方法,使用R的women示例数据,R的运行结果: > ...

  6. python自动寻路模板_Python实现的简单模板引擎功能示例

    本文实例讲述了Python实现的简单模板引擎功能.分享给大家供大家参考,具体如下: #coding:utf- 8 __author__="sdm" __author_email=' ...

  7. python ansible模块_python学习-ansible简单使用1

    一.介绍 Ansible 一种集成 IT 系统的配置管理.应用部署.执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年 ...

  8. 贪吃蛇python语言代码_Python贪吃蛇简单的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在自学Python的过程中在网上查询资料时发现了一些好玩的东西,python的游戏库模块,它可以自己弄一个小游戏来玩玩,然后我在网上找了一些游戏的代码,, ...

  9. python绝对值编程_python中取绝对值简单方法总结

    python如何使用绝对值?下面给大家介绍三种求绝对值的方法: import math def abs_value1(): a = float(input('1.请输入一个数字:')) if a &g ...

  10. python求绝对值_python中取绝对值简单方法总结

    python如何使用绝对值?下面给大家介绍三种求绝对值的方法: import math def abs_value1(): a = float(input('1.请输入一个数字:')) if a &g ...

最新文章

  1. 2022-2028年中国铁路信息化建设投资分析及前景预测报告
  2. 【转】TCP、UDP数据包大小的限制
  3. ICPC-无限路之城
  4. 「JupyterNotebook」Linux下安装Anaconda3以及后续打开jupyter notebook
  5. QT-在子控件上绘图的两种方式
  6. 为什么女生会有体香?
  7. oracle单表存储记录,oracle从各个表获得数据保存到另一个表
  8. 发展数字经济面临哪些困难_解决数字音乐制作面临的最大问题之一
  9. 要想学好前端开发,这五点你一定要知道!
  10. Qt多线程应用--QRunnable
  11. Zookeeper的Quorum机制-谈谈怎样解决脑裂(split-brain)
  12. C++: 对字符串转换字符集(编码)
  13. 0bug到底碰痛了谁的神经?
  14. java 计算器 下载_那里可以下载到JAVA编的计算器程序??
  15. Logit模型拟合实战案例(Biogeme)
  16. java gb2312中文乱码_Java中文乱码问题(转)
  17. 为什么实对称矩阵要求其正交矩阵,而不是可逆矩阵使其对角化?
  18. 喜报 | 谱尼测试获得零跑科技第三方试验室认可
  19. java 笔画排序_中文排序 - 笔画
  20. 一文了解滴滴与蚂蚁金服开源共建的SQLFlow

热门文章

  1. NSIS打包工具用法介绍与NSIS相关软件下载
  2. 黄山学院计算机作业管理系统,在线作业管理系统
  3. 常用Windows运行命令大全
  4. WebLogic简单抓鸡大法
  5. oracle sqlplus客户端,sqlplus下载|oracle sqlplus windows 客户端工具 64位下载 - 3322软件站...
  6. 使用麦咖啡打造安全系统
  7. java管理系统类似的_开发类似安居客OA系统管理平台
  8. 2022年小米产业链研究报告
  9. 2018通达信l2服务器源码,通达信强势龙头指标源码无未来,牛股连板涨停启动源码...
  10. handbrake下载太慢_handbrake使用教程