今天要学习的主要是odeint函数,Scipy.integrate模块的odeint函数是lsoda的Fortran代码的Python封装。

首先来了解一下理论背景:

如果说,我们要对进行数值求解,我们就需要一个函数来计算,其右侧返回一个和y相同形状的数组,还需要一个包含初始值的数组y0,以及一个tvals和一个独立变量t值数组,希望返回相应的y值,那么,这时我们要通过这样的方式来返回y的近似解:

y=odeint(f,y0,tvals)

第一个问题:我们要使用什么样的步长h?他和tvals有什么关系嘞?

答:每个点选择的步长h都受到了保持精度需求的约束,这就出现了我们怎么样去确定精度的问题,函数odeint他就是试着估计局部误差那么,就定义绝对误差为的最小值,同时要求:,同时相应的调整步长就好,但是,如果说变得非常大的话,上面的不等式准则可能会使得我们所选取的步长h变得非常小,也非常低效,那么,我们在定义相对误差,要求:,但是,这个方法在变小的情况下可能会出现问题,所以,通常的准则是:,是数组,两个默认值是

odient是可以自动处理刚性问题的方程,或者是方程组。

先跟着书上的学着写一个:

谐波振荡器:

假社,我们希望在t=1处求解:

import numpy as np
from scipy.integrate import odeint
print(odeint(lambda y,t:y,1,[0,1]))

看一看输出的结果:

图1:输出结果

lambda是匿名函数,f作为第一个参数,第二个参数是初始的y值,第三个参数是由强制的初始t值和最终y值组成的列表,这个列表被隐式转换为浮点数的numpy数组,输出由t数值和y数组构成,并且省略了初值。

这里,我们做一个简谐运动的问题:

对上面的方程,我们给他改成一个方程组:

以及的范围内进行求解和绘图:

import numpy as np
from scipy.integrate import odeint
# print(odeint(lambda y,t:y,1,[0,1]))
import matplotlib.pyplot as plt
def rhs(Y,t,omega):y,ydot=Y# 为了返回值的清晰,在这里展开了向量参数return ydot, -omega**2*y#返回了一个元组,而且这个元组被转换成了数组
t_arr=np.linspace(0,2*np.pi,101)
y_init=[1,0]
omega=2.0
#他这里的传参好怪啊
y_arr=odeint(rhs,y_init,t_arr,args=(omega,))
# args的参数必须是元组,输出被打包成了一个二维数组
y,ydot=y_arr[:,0],y_arr[:,1]
# 解包这个二维数组
fig=plt.figure()
ax1=fig.add_subplot(1,2,1)
ax1.plot(t_arr,y,t_arr,ydot)
ax1.set_xlabel("t")
ax1.set_ylabel("Y and ydot")
ax2=fig.add_subplot(1,2,2)
ax2.plot(y,ydot)
ax2.set_xlabel("y")
ax2.set_ylabel("ydot")
plt.tight_layout()
fig.subplots_adjust(top=0.9)
plt.show()

图2:简谐运动

如果我们继续对上面的代码进行修改,在相空间中创建网格并且绘制方向场,就是网格中的每个点的向量,然后从图形的任意点(任意初始条件)开始绘制解函数:

fig=plt.figure()
y,ydot=np.mgrid[-3:3:21j,-6:6:21j]
u,v=rhs(np.array([y,ydot]),0.0,omega)
mag=np.hypot(u,v)
mag[mag==0]=1.0
plt.quiver(y,ydot,u/mag,v/mag,color="red")
print("\nUse mouse to select number of trajectories")
print("time out after 30 seconds")
choice=[(0,0)]
while len(choice)>0:y01=np.array([choice[0][0],choice[0][1]])y=odeint(rhs,y01,t_arr,args=(omega,))plt.plot(y[:,0],y[:,1],lw=2)choice=plt.ginput()
print("timeout!")

图三

说实话,书上的这个代码我是没怎么看懂的,他的意思是说,选择坐标来覆盖相空间中相对粗糙的网格,计算网格中每个点切线向量场的分量,然后用quiver绘制小箭头,大小和方向是向量场的,基点是网格端,在u=v=0(平衡点附近),箭头最终成为了无信息点,然后就是绘制轨迹。

呃,说实话,这东西得对着书上的公式一个一个对着看,不然是真的看不懂。

然后我们看一看范德波尔振荡器:

周期轨道的快速弛豫表面这个例子可能会编的刚性,

图4:输出结果

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
def rhs(y,t,mu):return [y[1],mu*(1-y[0]**2)*y[1]-y[0]]
def jac(y,t,mu):return [[0,1],[-2*mu*y[0]*y[1]-1,mu*(1-y[0]**2)]]
mu=1.0
t_final=15.0 if mu<10 else 4.0*mu
n_points=1001 if mu<10 else 1001*mu
t=np.linspace(0,t_final,n_points)
y0=np.array([2.0,0.0])
#对odeint函数多加了两个参数,第一个告诉积分器在哪里能够找到雅各比函数,第二个是full_output,积分器运行时,他会记录各种统计数据,这些统计数据可以帮助理解积分器到底在干什么
#true就是说。这些数据可以通过info访问,这里通过选择”nje“就是显示雅各比评估数
#针对mu,我们可以试着进行放大,发现,小于15的时候,不用隐式算法,大于15的时候,会需要用到隐式算法
y,info=odeint(rhs,y0,t,args=(mu,),Dfun=jac,full_output=True)
#(我好像大致明白了,rhs、jac这俩函数,应该是隐式的传递参数吧)
print("mu = %g,number of Jacobian calls is %d "%\(mu,info['nje'][-1]))
plt.plot(y[:,0],y[:,1])
plt.show()

他这里的代码有点抽象了,看的不是很懂。

改一改,mu=10的时候看看:

图5:mu=10

图6:mu=20

增加mu就意味着增加周期。

最后一个,我们来看一看洛伦兹方程,他最早时作为天气模型出现的,表现出混沌行为,:

对于未知数x(t)、y(t)、z(t),方程是:

只允许变化,最初研究的是的情况,对于较小的值,是可以预测解的行为的,但是一旦的时候,解就变得非周期性,而且,解对初始条件非常敏感,,稍微不同的两个初始数据对应的解轨迹看起来就非常不同。

import numpy as np
from scipy.integrate import odeint
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def rhs(u,t,beta,rho,sigma):x,y,z=ureturn [sigma*(y-x),rho*x-y-x*z,x*y-beta*z]
sigma=10.0
beta=8.0/3.0
rho1=29.0
rho2=28.8
u01=[1.0,1.0,1.0]
u02=[1.0,1.0,1.0]
t=np.linspace(0.0,50.0,10001)
u1=odeint(rhs,u01,t,args=(beta,rho1,sigma))
u2=odeint(rhs,u02,t,args=(beta,rho2,sigma))
x1,y1,z1=u1[:,0],u1[:,1],u1[:,2]
x2,y2,z2=u2[:,0],u2[:,1],u2[:,2]
# plt.ion()
fig=plt.figure()
ax=fig.add_subplot(1,1,1, projection='3d')
ax.plot(x1,y1,z1,'b-')
ax.plot(x2,y2,z2,'r:')
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")
ax.set_title("Lorenz euqation with rho=%g,%g"%(rho1,rho2))
plt.show()

图7

哎,我试试改改看看:

图8:修改参数

图9

图10

的确,的时候,就变得非周期性,难以预测了。

如果,,就会存在平衡点(零速度):

如果说,只存在唯一一个平衡点:原点,但是似乎在绕着两个非平凡平衡点绕行,从其中的一个平衡点附近,解开始慢慢的螺旋辐射,当半径变得太大时,解跳到另一个平衡点附近,从那里开始进行另一个螺旋辐射,并且过程不断充分,有点像蝴蝶的翅膀。

Python科学计算:常微分方程2相关推荐

  1. python科学计算基础教程pdf下载-python科学计算 第二版 PDF 下载

    相关截图: 资料简介: 本书详细介绍Python科学计算中最常用的扩展库NumPy.SciPy.matplotlib.Pandas.SymPy.TTK.Mayavi.OpenCV.Cython,涉及数 ...

  2. python 科学计算设计_《Python科学计算-(第2版)》怎么样_目录_pdf在线阅读 - 课课家教育...

    第1章 Python科学计算环境的安装与简介 1 1.1 Python简介 1 1.1.1 Python 2还是Python 3 1 1.1.2 开发环境 2 1.1.3 集成开发环境(IDE) 5 ...

  3. 中国地质大学(北京) 研究生 2022秋《Python科学计算》期末考试 模拟题2 题目+参考答案

    另一套模拟题1: 期末考试 模拟题1 考试方法 浏览器(Chrome.火狐)登录PTA网址: pintia.cn,单击右上角"登录->考试登录",下拉菜单输入cugb 选择& ...

  4. python123计算分段函数_Python 专题四 python 科学计算

    一.目录 第1章 软件包的安装和介绍 1 11 Python简介 1 12 安装软件包 2 121 Python(x,y) 2 122 Enthought Python Distribution (E ...

  5. 无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages)

    无网络服务器(linux ubuntu),pip安装python科学计算所有需要包(packages) # 在windows上打开anaconda,进入环境tab页,在base环境处单击,然后点开te ...

  6. 目前比较流行的Python科学计算发行版

    经常有身边的学友问到用什么Python发行版比较好? 其实目前比较流行的Python科学计算发行版,主要有这么几个: Python(x,y) GUI基于PyQt,曾经是功能最全也是最强大的,而且是Wi ...

  7. python科学计算基础教程pdf下载-Python科学计算基础教程_PDF电子书

    因资源下载地址容易失效,请加微信号359049049直接领取,直接发最新下载地址. 前言 ======================================================= ...

  8. python 科学计算基础教程电子版-自学Python 编程基础、科学计算及数据分析

    自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 ☆☆☆☆☆ 李金 著 ...

  9. python 科学计算基础教程电子版-终于领会python科学计算入门教程

    PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...

  10. python科学计算基础教程pdf下载-Python科学计算 PDF 第2版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python.科学计算方面的内容,本书是由清华大学出版社出版,格式为PDF,资源大小59.5 MB,张若愚编写,目前豆瓣.亚马逊.当当.京东 ...

最新文章

  1. AI 医学影像辅助诊断的商业模式分析
  2. jQuery效果之滑动
  3. hystrix服务降级
  4. plsql打开sql窗口快捷键_巧用Navicat for MySQL的快捷键
  5. FreeRTOS(五)——heap文件解析
  6. 嵌入式linux蓝牙通讯,开发板蓝牙通信问题,有这方面经验的请进
  7. php生成随机汉字,PHP随机生成中文段落示例【测试网站内容时使用】
  8. this的作用(转)
  9. 服装打版软件ET2019淘宝100RMB买的
  10. UE4蓝图版简易背包系统
  11. 学计算机跨考航天航空,北京航空航天大学计算机考研辅导班:跨考考研经验
  12. 秒懂Https之CA证书与自签名证书漫谈
  13. win10未安装任何音频输出设备解决方案-记一次电脑的睿智问题
  14. 靶机渗透练习99-hacksudo:FOG
  15. 多校9 HDU-6164 Dying Light 几何数学
  16. 我的世界服务器如何修改天气,我的世界怎么切换天气 原来这么简单
  17. Microsoft Orleans 之 入门指南
  18. 基于OTSU算法和基本粒子群优化算法的双阈值图像分割
  19. 漫画 | 什么是 HashMap?
  20. BS工作原理—BS总结

热门文章

  1. NCL读写.nc文件
  2. Python 创建一个二维列表
  3. Python中 如何将一个字符串分成一个个字符;
  4. 3G之殇:龙旗平安夜裁掉TD手机设计团队
  5. 性能百万/s:腾讯轻量级全局流控方案详解【转自Wetest】
  6. 0x68111002_R9 370 2G驱动成功10.14.3 (18D109),但是HDMI黑屏
  7. 我喀喀喀 找到了去除win7桌面库跟家庭组的方法
  8. switch case用法详解
  9. vue element上一步下一步跳转
  10. 切线和倒数_导数法求切线