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

平流方程

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

差分网格

差分方程

将差分方程简化一下

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

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

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

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

"""
This code solves the advection equationU_t + vU_x = 0over the spatial domain of 0 <= x <= 1 that is discretized
into 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 by U(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 timestart =time.clock()class UpwindMethod1:def __init__(self, N, tmax):self.N = N # number of nodesself.tmax = tmaxself.xmin = 0self.xmax = 1self.dt = 0.009 # timestepself.v = 1 # velocityself.xc = 0.25self.initializeDomain()self.initializeU()self.initializeParams()def initializeDomain(self):self.dx = (self.xmax - self.xmin)/self.Nself.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 = 0for 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 conditionsself.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.dtdef main():sim = UpwindMethod1(100, 1.5)sim.solve_and_plot()plt.show()if __name__ == "__main__":main()end = time.clock()print('Running time: %s Seconds'%(end-start))

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

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

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

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

  2. 偏微分方程数值解法python_基于python求解偏微分方程的有限差分法资料

    基于python求解偏微分方程的有限差分法资料 Computer Era No. 11 2016 0 引言 在数学中, 偏微分方程是包含多变量和它们的偏 导数在内的微分方程.偏微分方程通常被用来求解 ...

  3. 一维抛物线的matlab求解,一维抛物线偏微分方程数值解法(附图及matlab程序)

    精确解为:U(x,t)=e^(x+t); 用紧差分格式: 此种方法精度为o(h1^2+h2^4),无条件差分稳定: 一:用追赶法解线性方程组(还可以用迭代法解) Matlab程序为: function ...

  4. 计算物理学(数值分析)上机实验答案5、常微分方程初值问题的数值解法

    实验五.常微分方程初值问题的数值解法 ​ 常微分方程的求解问题在实践中经常遇到,因此研究常微分方程的数值解法就很有必要.欧拉方法是最简单.最基本的方法,利用差商代替微商,就可得到一系列欧拉公式.这些公 ...

  5. 用matlab求解线性代数方程组,线性代数方程组数值解法与MATLAB实现综述

    线性代数方程组数值解法及MATLAB 实现综述 廖淑芳 20122090 数计学院 12计算机科学与技术1班(职教本科) 一.分析课题 随着科学技术的发展,提出了大量复杂的数值计算问题,在建立电子计算 ...

  6. 一节双曲型方程基于MATLAB的求解,双曲方程基于matlab的数值解法

    <双曲方程基于matlab的数值解法>由会员分享,可在线阅读,更多相关<双曲方程基于matlab的数值解法(9页珍藏版)>请在人人文库网上搜索. 1.双曲型方程基于MATLAB ...

  7. c语言求解热传导方程,二维稳态导热问题的数值解法.docx

    核科学与技术学院 <传热学> 二维稳态导热问题的 数值解法作业 姓名:罗晓 学号: 2014151214 班级:任课教师:李磊,张智刚 哈尔滨工程大学 核科学与技术学院 2016 年 11 ...

  8. Euler-Maruyama discretization(欧拉-丸山数值解法)

    欧拉法的来源 在数学和计算机科学中,欧拉方法(Euler method)命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解.它是一种解决常微分方程数值积分 ...

  9. [常微分方程的数值解法系列五] 龙格-库塔(RK4)法

    龙格-库塔法 简介 基本思想 具体方法 一阶 二阶 求解参数 特殊二阶 三阶 高阶 步长选择 例子 在惯性导航以及VIO等实际问题中利用IMU求解位姿需要对IMU测量值进行积分得到需要的位置和姿态,其 ...

最新文章

  1. ASP.NET内置对象的总结
  2. qt在加入Q_OBJECT宏之后出现编译错误
  3. Namomo Spring Camp Div2 Week1 - 第二次打卡
  4. maven创建父项目和子项目
  5. 六大写作软件功能解说,网络作家不可错过的码字软件宝典
  6. 渗透测试报告模板_演习防守方总结模板写作公式
  7. python环境下使用opencv把视频切割成图片
  8. 思科三层交换机不同vlan互通_Cisco三层交换机实现不同vlan之间的通信
  9. RK3288 Android5.1 隐藏 蓝牙网络共享与移动网络设置项
  10. 每日一条Linux Shell命令--mv
  11. **手机丢失之后如果通过更简单的手机定位系统找回手机?**
  12. 西门子官网下载Eplan部件库
  13. Office2016使用HP打印机只能打印一次再打印就假死怎么办?
  14. Java专项练习二(选择题)
  15. MAC 删除自带 ABC 输入法的方法
  16. 日语输入中的促音怎么输入
  17. 面向接口编程思想(转)
  18. 广东省茂名市谷歌卫星地图下载
  19. XMediaStream极速导播软件
  20. 基于Pandas和PyEcharts的当当网图书信息可视化分析

热门文章

  1. tensorflow之cast
  2. php redis主从自动切换,Redis 集群的主从切换
  3. 运算符的优先级及有哪些运算符
  4. oracle重建索引对空间的使用,分析oracle索引空间使用情况,以及索引是否需要重建...
  5. oracle改成归档模式_将Oracle数据库改为归档模式并启用Rman备份
  6. python消费kafka逻辑处理导致cpu升高_Kafka 消费迟滞监控工具 Burrow
  7. java try 性能损耗_Java 中的 try catch 影响性能吗?
  8. n阶方阵的蛇形排列java_「P·R·N·D」的排列顺序为何成为行业标准,能不能改变呢?...
  9. java创建项目出现怎么办_maven创建项目后main/java missing的解决方法
  10. List增删元素后size大小发生变化带来的影响、Stream流操作、Lambda表达式