Python关于odeint解常微分方程问题

qq_38845202 2018-10-17 06:59:00
首先是简单的常微分方程问题
dy/dt = t 初值y(0) = 0
代码如下
import numpy as np
from scipy.integrate import odeint
#函数定义
def test(w,t):
return t
t = np.arange(0,100,1)
track = odeint(test,0,t)

import matplotlib.pyplot as plt
plt.xlabel('Time[hour]')
plt.ylabel('Y')

plt.plot(t,track[:,0])

plt.show()


问题一:本人猜测该函数可能是通过欧拉法完成的计算,
于是本人更改代码,想测试计算是否需要100回循环,更新后的代码如下
import numpy as np
from scipy.integrate import odeint
#这里做了个计数器来计算test函数执行次数
counter = 0
def test(w,t):
global counter
counter += 1
print(counter)
return t

t = np.arange(0,100,1)
track = odeint(test,0,t)

import matplotlib.pyplot as plt
plt.xlabel('Time[hour]')
plt.ylabel('Firing Rate[Hz]')

plt.plot(t,track[:,0])



plt.show()

结果有趣的情况出现了,计数器输出结果只执行了12回
问题二:如果函数里出现了呈现高斯分布的噪音即dy/dt = t + noise
其中noise是随时间变化,不确定的随机数 ,更新代码如下
import numpy as np
from scipy.integrate import odeint
counter = 0
def test(w,t):
global counter
counter += 1
print(counter)
return t+np.random.normal(0,0.05)

t = np.arange(0,100,1)
track = odeint(test,0,t)

import matplotlib.pyplot as plt
plt.xlabel('Time[hour]')
plt.ylabel('Firing Rate[Hz]')

plt.plot(t,track[:,0])



plt.show()

结果输出的函数远远偏离正常结果
由于网络问题,没法上传输出的图片
还出现了以下警告
ODEintWarning: Repeated convergence failures (perhaps bad Jacobian or tolerances). Run with full_output = 1 to get quantitative information.
warnings.warn(warning_msg, ODEintWarning)
...全文
1148 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
nk_wanger 2021-04-13
  • 打赏
  • 举报
回复 1
我也遇到了同样的问题,请问解决了吗

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧