研究生课程《应用数值分析》结课了,使用python简单记录了下常微分方程数值解法。

向前欧拉法

{ y i + 1 = y i + h i f ( x i , y i ) y 0 = y ( a ) \left \{ \begin{array}{lr} y_{i+1}=y_i+h_i f(x_i,y_i) \\ y_0=y(a) \end{array} \right .{yi+1​=yi​+hi​f(xi​,yi​)y0​=y(a)​

from pylab import *

import warnings

warnings.filterwarnings('ignore')

求解初值问题

{ y ′ = x − y + 1 0 ≤ x ≤ 1 y ( 0 ) = 1 \left \{ \begin{array}{lr} y'=x-y+1 & 0\leq x \leq 1 \\ y(0)=1 \end{array} \right .{y′=x−y+1y(0)=1​0≤x≤1

该微分方程的精确解为:y = x + e x p ( − x ) y=x+exp(-x)y=x+exp(−x)

def f(t,y):

'''

求解的微分方程,

'''

return t-y+1

def euler_forward(f,a=0,b=1,ya=1,h=0.1,verbose=True):

'''向前欧拉法

Args

----------

f: callable function

需要求解的函数

a: float

求解区间起始值

b:float

求解区间终止值

ya:float

起始条件,ya=y(a)

h:float

求解步长(区间[a,b]n等分)

verbose:logical,default is True

显示迭代结果

Returns

----------

res:list like

返回向前欧拉发求解的结果

'''

# i = 0

res = []

xi = a

yi = ya

while xi<=b: # 在求解区间范围

y = yi + h*f(xi,yi)

if verbose:

print('xi:{:.2f}, yi:{:.6f}'.format(xi,yi))

res.append(y)

xi, yi = xi+h, y

return res

res = euler_forward(f,a=0,b=1,ya=1,h=0.1,verbose=True)

xi:0.00, yi:1.000000

xi:0.10, yi:1.000000

xi:0.20, yi:1.010000

xi:0.30, yi:1.029000

xi:0.40, yi:1.056100

xi:0.50, yi:1.090490

xi:0.60, yi:1.131441

xi:0.70, yi:1.178297

xi:0.80, yi:1.230467

xi:0.90, yi:1.287420

xi:1.00, yi:1.348678

龙格库塔(Runge-Kutta methods)

三阶龙格库塔法

{ y i + 1 = y i + 1 6 ( k 1 + 2 k 2 + k 3 ) k 1 = h f ( x i , y i ) k 2 = h f ( x i + 1 2 h , y i + 1 2 k 1 ) k 3 = h f ( x i + h , y i − k 1 + 2 k 2 ) y 0 = y ( a ) , i = 0 , 1 , ⋯ &ThinSpace; , n − 1 \left \{ \begin{array}{lr} y_{i+1}=y_i+\frac{1}{6}(k_1+2k_2+k_3) & \\ k_1 = hf(x_i,y_i) & \\ k_2 = hf(x_i+\frac{1}{2}h,y_i+\frac{1}{2}k_1) & \\ k_3 = hf(x_i+h,y_i-k_1+2k_2) & \\ y_0=y(a),i=0,1,\cdots,n-1 \\ \end{array} \right .⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​yi+1​=yi​+61​(k1​+2k2​+k3​)k1​=hf(xi​,yi​)k2​=hf(xi​+21​h,yi​+21​k1​)k3​=hf(xi​+h,yi​−k1​+2k2​)y0​=y(a),i=0,1,⋯,n−1​​

四阶龙格库塔法

{ y i + 1 = y i + 1 6 ( k 1 + 2 k 2 + 2 k 3 + k 4 ) k 1 = h f ( x i , y i ) k 2 = h f ( x i + 1 2 h , y i + 1 2 k 1 ) k 3 = h f ( x i + 1 2 h , y i + 1 2 k 2 ) k 4 = h f ( x i + h , y i + k 3 ) y 0 = y ( a ) , i = 0 , 1 , ⋯ &ThinSpace; , n − 1 \left \{ \begin{array}{lr} y_{i+1}=y_i+\frac{1}{6}(k_1+2k_2+2k_3+k_4) & \\ k_1 = hf(x_i,y_i) & \\ k_2 = hf(x_i+\frac{1}{2}h,y_i+\frac{1}{2}k_1) & \\ k_3 = hf(x_i+\frac{1}{2}h,y_i+\frac{1}{2}k_2) & \\ k_4 = hf(x_i+h,y_i+k_3) & \\ y_0=y(a),i=0,1,\cdots,n-1 \\ \end{array} \right .⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​yi+1​=yi​+61​(k1​+2k2​+2k3​+k4​)k1​=hf(xi​,yi​)k2​=hf(xi​+21​h,yi​+21​k1​)k3​=hf(xi​+21​h,yi​+21​k2​)k4​=hf(xi​+h,yi​+k3​)y0​=y(a),i=0,1,⋯,n−1​​

def runge_kutta(f,a=0,b=1,ya=1,h=0.1,verbose=True):

'''四阶龙格库塔法

Args

----------

f: callable function

需要求解的函数

a: float

求解区间起始值

b:float

求解区间终止值

ya:float

起始条件,ya=y(a)

h:float

求解步长(区间[a,b]n等分)

verbose:logical,default is True

显示迭代结果

Returns

----------

res:list like

返回向前欧拉发求解的结果

'''

res = []

xi = a

yi = ya

while xi <= b: # 在求解区间范围

k1 = h * f(xi, yi)

k2 = h * f(xi + h/2, yi + k1/2)

k3 = h * f(xi + h/2, yi + k2/2)

k4 = h * f(xi + h, yi + k3)

y = yi + 1/6 * (k1 + 2*k2 + 2*k3 + k4)

if verbose:

print('xi:{:.2f}, yi:{:.10f}'.format(xi,yi))

res.append(y)

xi, yi = xi+h, y

return res

res = runge_kutta(f,a=0,b=1,ya=1,h=0.1,verbose=True)

xi:0.00, yi:1.0000000000

xi:0.10, yi:1.0048375000

xi:0.20, yi:1.0187309014

xi:0.30, yi:1.0408184220

xi:0.40, yi:1.0703202889

xi:0.50, yi:1.1065309344

xi:0.60, yi:1.1488119344

xi:0.70, yi:1.1965856187

xi:0.80, yi:1.2493292897

xi:0.90, yi:1.3065699912

xi:1.00, yi:1.3678797744

改进欧拉法

{ y p = y i + h f ( x i , y i ) y i + 1 = y i + h 2 [ f ( x i , y i ) + f ( x i , y p ) ] i = 0 , 1 , ⋯ &ThinSpace; , n − 1 y 0 = y ( a ) \left \{ \begin{array}{lr} y_p=y_i+hf(x_i,y_i) & \\ y_{i+1} = y_i+\frac{h}{2}[f(x_i,y_i)+f(x_i,y_p)] &i=0,1,\cdots ,n-1 \\ y_0=y(a) \\ \end{array} \right .⎩⎨⎧​yp​=yi​+hf(xi​,yi​)yi+1​=yi​+2h​[f(xi​,yi​)+f(xi​,yp​)]y0​=y(a)​i=0,1,⋯,n−1​

求解初值问题

{ y ′ = − y ( 0 ≤ x ≤ 1 ) y ( 0 ) = 1 \left \{ \begin{array}{lr} y'=-y &(0 \leq x \leq 1) \\ y(0)=1 \\ \end{array} \right .{y′=−yy(0)=1​(0≤x≤1)

精确解为y = e x p ( − x ) y=exp(-x)y=exp(−x)

def f(t,y):

'''

精确解为y=exp(-x)

'''

return -y

def improved_euler(f,a=0,b=1,ya=1,h=0.1,verbose=True):

'''改进欧拉法

Args

----------

f: callable function

需要求解的函数

a: float

求解区间起始值

b:float

求解区间终止值

ya:float

起始条件,ya=y(a)

h:float

求解步长(区间[a,b]n等分)

verbose:logical,default is True

显示迭代结果

Returns

----------

res:list like

返回向前欧拉发求解的结果

'''

res = []

xi = a

yi = ya

while xi <= b: # 在求解区间范围

yp = yi + h*f(xi, yi)

y = yi + h/2 * (f(xi, yi) + f(xi, yp))

if verbose:

print('xi:{:.2f}, yi:{:.6f}'.format(xi,yi))

res.append(y)

xi, yi = xi+h, y

return res

res = improved_euler(f,a=0,b=1,ya=1,h=0.1,verbose=True)

xi:0.00, yi:1.000000

xi:0.10, yi:0.905000

xi:0.20, yi:0.819025

xi:0.30, yi:0.741218

xi:0.40, yi:0.670802

xi:0.50, yi:0.607076

xi:0.60, yi:0.549404

xi:0.70, yi:0.497210

xi:0.80, yi:0.449975

xi:0.90, yi:0.407228

xi:1.00, yi:0.368541

python 常微分方程_常微分方程数值解法——python实现相关推荐

  1. 计算方法(六):常微分方程初值问题的数值解法

    文章目录 常微分方程初值问题的数值解法 欧拉(Euler)方法与改进欧拉方法 欧拉方法 欧拉公式的局部截断误差与精度分析 改进欧拉方法 龙格-库塔(Runge-Kutta)法 构造原理 经典龙格-库塔 ...

  2. 二阶边值问题的数值解matlab,《二阶常微分方程边值问题的数值解法》-毕业论文.doc...

    w 摘 要 本文主要研究二阶常微分方程边值问题的数值解法.对线性边值问题,我们总结了两类常用的数值方法,即打靶法和有限差分方法,对每种方法都列出了详细的计算步骤和Matlab程序代码,通过具体的算例对 ...

  3. python解决微分方程(数值解法)

    Python求解微分方程(数值解法) 对于一些微分方程来说,数值解法对于求解具有很好的帮助,因为难以求得其原方程. 比如方程: 但是我们知道了它的初始条件,这对于我们叠代求解很有帮助,也是必须的. 那 ...

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

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

  5. 常微分方程数值解法——python实现

    研究生课程<应用数值分析>结课了,使用python简单记录了下常微分方程数值解法. 2022.11.26 Update: 文末补充C语言实现(C11标准) 向前欧拉法 {yi+1=yi+h ...

  6. 3 x 10的python表达式_这道数学题用PYTHON编程语言怎么写? 编程语言python是用

    我觉着,这个应该这样解决比较符合计算机解题思路. 下面的回答的,思考的东西太多. # -*- coding: utf-8 -*- __author__ = 'lpe234' __date__ = '2 ...

  7. pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...

    以下资源免费获取方式! 关注!转发!私信"资料"即可免费领取! 入门书籍 1.<Python基础教程>(Beginning Python From Novice to ...

  8. 小猿圈python金角大王_小猿圈python学习-基本数据类型

    小猿圈python学习-基本数据类型 2019-04-24 11:16:14 1点赞 6收藏 0评论 什么是数据类型? 我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大, ...

  9. 零基础学python 视频_全网最全Python视频教程真正零基础学习Python视频教程 490集...

    Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python Web开发进阶课程,手把手教你用Python开发完整的商业 ...

  10. 为什么要学python语言_我们为什么要学习Python语言?

    原标题:我们为什么要学习Python语言? 聊到我们为什么要学习Python语言?小编不禁又想起大佬潘石屹准备开启Python学习旅程时所发布的微博. 我们为什么要学习Python语言? 在农业社会时 ...

最新文章

  1. C语言基础知识【数据类型】
  2. 如何将String对象转换为Boolean对象?
  3. 微软宣布Azure Function支持Python
  4. 解决启动flanneld失败的方法
  5. uva12099 Bookcase ACM NWERC
  6. 怎么改变github的用户名字,身份?
  7. C# 房贷计算器(等本降息)
  8. 信息学奥赛一本通1349-最优布线问题
  9. IntelliJ IDEA for Mac 中 Java Web Project 默认的工件(Artifacts)输出目录
  10. tp5 空格拆分关键词,多个关键词进行查询
  11. 材料科学与工程考计算机,计算机在材料科学与工程中应用作业.pdf
  12. 超级计算机用于挖矿,全球至少500台超级计算机都被用来比特币挖矿
  13. python selenium 常用方法
  14. MSDN for VB6.0 正常安装后仍然不能显示帮助的处理
  15. Oracle导入元数据,eova oracle 导入元数据报错
  16. 繁体字转换 java_java代码实现简体繁体转换
  17. 英语单词常见词根总结
  18. 跳过微信屏蔽APP扫描以及识别不同系统的手机
  19. 不要做一个只会抱怨的人
  20. 牛客小白月赛4 I.合唱队形

热门文章

  1. PDFcrack暴力破解pdf密码
  2. 荒野行动android模拟,荒野行动用模拟器玩教程 荒野行动模拟器不支持机型解决方法...
  3. 初装Windows11无法打开Windows安全中心主界面
  4. 元数据、数据元、资源目录
  5. 为什么硬件管理里面没有eplan加密狗_Eplan2.7”没有可用加密狗“问题
  6. Altium Designer 17 安装方法及步骤
  7. TLPI UNIX linux系统编程手册源代码运行
  8. PowerShell Gallery .nupkg手动下载将.nupkg文件重命名为.zip,然后将内容提取到本地文件夹中
  9. 关于java的外语文献_java英文参考文献(涵盖3年最新120个)
  10. Java实现:归并排序