有限差分法
有限差分方法(FDM)是计算机数值模拟最早采用的方法,至今仍被广泛运用。
该方法将求解域划分为差分网格,用有限个网格节点代替连续的求解域。有限差分法以Taylor级数展开等方法,把控制方程中的导数用网格节点上的函数值的差商代替进行离散,从而建立以网格节点上的值为未知数的代数方程组。该方法是一种直接将微分问题变为代数问题的近似数值解法,数学概念直观,表达简单,是发展较早且比较成熟的数值方法。

分类
对于有限差分格式,从格式的精度来划分,有一阶格式、二阶格式和高阶格式。从差分的空间形式来考虑,可分为中心格式和逆风格式。考虑时间因子的影响,差分格式还可以分为显格式、隐格式、显隐交替格式等。目前常见的差分格式,主要是上述几种形式的组合,不同的组合构成不同的差分格式。差分方法主要适用于有结构网格,网格的步长一般根据实际情况和条件来决定。

构造差分的方法
构造差分的方法有多种形式,目前主要采用的是泰勒级数展开方法。其基本的差分表达式主要有三种形式:一阶向前差分、一阶向后差分、一阶中心差分和二阶中心差分等,其中前两种格式为一阶计算精度,后两种格式为二阶计算精度。通过对时间和空间这几种不同差分格式的组合,可以组合成不同的差分计算格式。

泰勒级数

Python中调用sympy模块求解差分

from sympy import diff
from sympy import symbols
import sympy
def func(t):return 2000 * sympy.log(14*10000/(14*10000-2100*t))-9.8*t  #函数
t = symbols("t")
print(func(16))
print(diff(func(t),t))  #对函数进行求导
print(diff(func(t),t).subs(t,16))

运行上述程序结果:

392.073691403521
588000000000*(1 - 3*t/200)/(140000 - 2100*t)**2 - 9.8
29.6736842105263

【注意】:
函数的写法不能调用sympy以外的模块的函数
比如这样写就不对:

from sympy import diff
from sympy import symbols
import math
def func(t):return 2000 * math.log(14*10000/(14*10000-2100*t))-9.8*t
t = symbols("t")
print(func(16))
print(diff(func(t),t))
print(diff(func(t),t).subs(t,16))

结果:

392.07369140352074
print(diff(func(t),t))
return 2000 * math.log(14*10000/(14*10000-2100*t))-9.8*t
raise TypeError("can't convert expression to float")
TypeError: can't convert expression to float

错误点在于:sympy的模块的函数不能调用math模块的函数

一阶向前差分


Python代码:

import sympy
from sympy import diff
from sympy import symbols#差分的对象
x = 16
k = 2  #步长
x1 = x + k  #向前
x2 = x - k  #向后#方程式
def func(t):return 2000 * sympy.log(14*10000/(14*10000-2100*t))-9.8*t#一阶向前差分
def for_difference():a_for_diff = (func(x1) - func(x))/kfor_error = abs(a_for_diff - a_true)/a_trueprint(f'{x}的一阶向前差分值:{a_for_diff}')print(f'{x}的一阶向前差分的误差:{for_error*100}%')if __name__ == '__main__':t = symbols("t")a_true = diff(func(t), t).subs(t, x)  # 真值for_difference()

结果:

16的一阶向前差分值:30.4738991379398
16的一阶向前差分的误差:2.69671578943888%

一阶向后差分


Python代码:

import sympy
from sympy import diff
from sympy import symbols#差分的对象
x = 16
k = 2  #步长
x1 = x + k  #向前
x2 = x - k  #向后#方程式
def func(t):return 2000 * sympy.log(14*10000/(14*10000-2100*t))-9.8*t#一阶向后差分
def beh_difference():a_beh_diff = (func(x) - func(x2))/kbeh_error = abs(a_beh_diff - a_true)/a_trueprint(f'{x}的一阶向后差分值:{a_beh_diff}')print(f'{x}的一阶向后差分的误差:{beh_error*100}%')if __name__ == '__main__':t = symbols("t")a_true = diff(func(t), t).subs(t, x)  # 真值beh_difference()

运行结果:

16的一阶向后差分值:28.9145121806904
16的一阶向后差分的误差:2.55840166138381%

一阶中心差分


Python代码:

import sympy
from sympy import diff
from sympy import symbols#差分的对象
x = 16
k = 2  #步长
x1 = x + k  #向前
x2 = x - k  #向后#方程式
def func(t):return 2000 * sympy.log(14*10000/(14*10000-2100*t))-9.8*t#一阶中心差分
def cen_difference():a_cen_diff = (func(x1)-func(x2))/(k*2)cen_error = abs(a_cen_diff - a_true)/a_trueprint(f'{x}的二阶中心差分值:{a_cen_diff}')print(f'{x}的二阶中心差分的误差:{cen_error*100}%')if __name__ == '__main__':t = symbols("t")a_true = diff(func(t), t).subs(t, x)  # 真值cen_difference()

代码运行结果:

16的二阶中心差分值:29.6942056593151
16的二阶中心差分的误差:0.0691570640275347%

二阶中心差分


Python代码:

import sympy
from sympy import diff
from sympy import symbols#差分的对象
x = 16
k = 2  #步长
x1 = x + k  #向前
x2 = x - k  #向后#方程式
def func(t):return 2000 * sympy.log(14*10000/(14*10000-2100*t))-9.8*t#二阶中心差分
def two_cen_difference():a_cen_diff = (func(x1)+func(x2)-2*func(x))/(k**2)cen_error = abs(a_cen_diff - a_true)/a_trueprint(f'{x}的二阶中心差分值:{a_cen_diff}')print(f'{x}的二阶中心差分的误差:{cen_error*100}%')if __name__ == '__main__':t = symbols("t")a_true = diff(func(t), t , 2).subs(t, x)  # 求2阶导真值two_cen_difference()

程序运行结果:

16的二阶中心差分值:0.779693478624694
16的二阶中心差分的误差:0.0779896119162236%

迭代直到精确要求——以一阶向前差分为例

要求初始步长为2,经过多次迭代,一阶向前差分的误差能小于1%
Python代码如下:

import sympy
from sympy import diff
from sympy import symbols#方程式
def func(t):return 2000 * sympy.log(14*10000/(14*10000-2100*t))-9.8*t#一阶向前差分
def for_difference(x1,x,a_true,k):a_for_diff = (func(x1) - func(x))/kfor_error = abs(a_for_diff - a_true)/a_trueprint(f'{x}的一阶向前差分值:{a_for_diff}')print(f'{x}的一阶向前差分的误差:{for_error*100}%')return for_errordef Judge_precision(x):D = Truek = 2  # 初始步长n = 0while D:n += 1x1 = x + k  # 向前t = symbols("t")a_true = diff(func(t), t).subs(t, x)error = for_difference(x1,x,a_true,k)if error <= 0.01:D = Falseprint(f'迭代第{n}次后,{x}的一阶向前差分的误差为{error}')else:k = k/2if __name__ == '__main__':x = 16  #差分对象Judge_precision(x)

运行结果:

16的一阶向前差分值:30.4738991379398
16的一阶向前差分的误差:2.69671578943888%
16的一阶向前差分值:30.0684298016344
16的一阶向前差分的误差:1.33028844112341%
16的一阶向前差分值:29.8697466293837
16的一阶向前差分的误差:0.660728265039121%
迭代第3次后,16的一阶向前差分的误差为0.00660728265039121

Python有限差分法——向前差分,向后差分和中心差分的Python程序相关推荐

  1. python差分法_数值偏微分方程-差分法(Python)

    在前面的笔记里孤光一点萤:数值常微分方程-欧拉法与龙格-库塔法​zhuanlan.zhihu.com 整理了常微分方程的一些数值解法.类似的方法可以拓展到解偏微分方程的问题,这里整理有限差分法的相关笔 ...

  2. uwsgi 安装报错 plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory

    1. Python3 安装 uwsgi 报错 直接使用命令 sudo pip3 install uwsgi 安装如下错误: ubuntu@ubuntu:~/Downloads$ sudo pip3 i ...

  3. python速成要多久2019-8-28_2019最全Python入门学习路线,不是我吹,绝对是最全

    近几年Python的受欢迎程度可谓是扶摇直上,当然了学习的人也是愈来愈多.一些学习Python的小白在学习初期,总希望能够得到一份Python学习路线图,小编经过多方汇总为大家汇总了一份Python学 ...

  4. python和anaconda的区别_anaconda和python区别

    详细内容 python python自身缺少numpy.matplotlib.scipy.scikit-learn....等一系列包,需要我们安装pip来导入这些包才能进行相应运算(python3.5 ...

  5. 数据科学Python训练营课程:从初级到高级 Python for Data Science Bootcamp Course:Beginner to Advanced

    通过代码实现.示例等,掌握您需要了解的关于Python.Pandas和Numpy的一切! 你会学到什么 通过代码实现.示例等,掌握您需要了解的关于Python.Pandas和Numpy的一切! 学习高 ...

  6. 【Python之路】第二篇--初识Python

    Python简介 Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube.D ...

  7. python前端开发招聘_web前端和python学哪个出来工资高?

    展开全部 题主的意图说得很明显了e68a84e8a2ad62616964757a686964616f31333433646436,就是为了更好的就业,获得一份不错的薪资.那么我们首先来看一下Pytho ...

  8. 为什么要学习Python编程语言?哪些人适合学习Python?

    先回答第一个被初学编程的朋友问到最多的问题,为什么要学习Python编程语言? 答:现在信息更新的非常快速,又迎来了大数据的时代, 各行各业如果不与时俱进,都将面临优胜劣汰,知识是不断的更新的,只有一 ...

  9. Python游戏开发,pygame模块,Python实现打砖块小游戏

    前言: 本期我们将利用python制作一个打砖块小游戏,废话不多说,让我们愉快地开始吧~ 效果展示 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RdjcY4gn-16 ...

最新文章

  1. 不包含本位置值的累乘数组
  2. adb指令禁用软件_三星等安卓手机续航差?禁用部分系统组件后提升明显
  3. python 测试用例的无输入_如何为无参数方法自动生成测试用例?
  4. JAVA进阶教学之(序列化和反序列化)
  5. 开源纯C#工控网关+组态软件
  6. vb mysql 实例_vb数据库编程实例-求VB连接数据库实例我想做一个VB连接数据库的简单实例,可以实现 爱问知识人...
  7. 现控笔记(六)线性定常系统综合
  8. 【图像去噪】基于matlab小波变换图像去噪(MSE和SNR)【含Matlab源码 2192期】
  9. Backtrader系列教程⑦:可视化篇(重构)
  10. matlab图像处理代码实例,MATLAB图像处理375例-程序代码
  11. 验证错误信息jquery validation
  12. python用百度云接口实现植物识别和动物识别
  13. [ukulele]入门指南
  14. Liferay 6.2 改造系列之三:删除Docbar中的添加内容功能
  15. 留学目的地选择之亚利桑那州
  16. java分布式服务框架Dubbo的介绍与使用
  17. 自律·财大自习·Java
  18. 树莓派CM4 Sensing(包含485接口)+python+继电器+水质仪+阿里云物联网平台ito实现实时检测水质并上传数据到阿里云ito和远程控制灯光
  19. 戴尔灵越7000笔记本开机吱吱响,解决办法
  20. 三星nfc添加门禁卡实测有效_小米的NFC功能到底有多强大?看完折服!

热门文章

  1. 金融专业学生收卖废品,做起了“破烂王”
  2. Java接收solr动态域_Spring Data Solr创建动态域报错:org.springframework.data.solr.UncategorizedSolrException...
  3. 嘉宾介绍 | 2020 PG亚洲大会中文分论坛:潘娟
  4. 网络要上天! 雄心勃勃的天空网络计划
  5. 怎么在线识别图片内容?识别原理是什么
  6. 小觅智能亮相2019中国IT产业校企合作大会
  7. OOD, OOA和OOP
  8. 编程大实践 # python # 嵩天 # Cilay
  9. mysql中国菜刀连接_中国菜刀(Chopper)详细剖析
  10. 30套中国风PPT/创意PPT模板