微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法在python中加速odeint

如何解决有没有办法在python中加速odeint

目前我正在考虑如何为我正在运行的模拟加速 odeint。实际上它只是一个带有摩擦项和不连续力的原始二阶颂歌。我用来描述动力学的模型是在一个单独的函数中定义的。尝试解决 ode 会导致错误或极高的计算时间(以天为单位)。

这是我的大部分硬编码代码

import numpy as np
import pandas as pd
from scipy.integrate import odeint
import matplotlib.pyplot as plt

def create_ref(tspan):
    if tspan>2 and tspan<8:
        output = np.sin(tspan)
    elif tspan>=20:
        output = np.sin(tspan*10)
    else:
        output = 0.5
    return output

def model(state,t):
    def Fs(x):
        pT = 0
        pB = 150
        p0 = 200
        pA = 50
        kein = 0.25
        kaus = 0.25
        if x<0:
            pA = pT
            Fsres = -kaus*x*pA-kein*x*(p0-pB)
        else:
            pB = pT
            Fsres = -kaus*x*pB-kein*x*(p0-pA)
        return Fsres

    x,dx = state
    refNow = np.interp(t,xref.index.values,xref.values.squeeze())
    refprev = np.interp(t-dt,xref.values.squeeze())
    drefNow = (refNow-refprev)/dt
    x_meas = x
    dx_meas =  dx
    errNow = refNow-x_meas
    errprev = refprev-(x_meas-dx_meas*dt)
    intrefNow = dt*(errNow-errprev)
    kp = 10
    kd = 0.1
    ki = 100
    sigma = kP*(refNow-x_meas)+kd*(drefNow-dx_meas)+ki*intrefNow
    tr0 = 5
    FricRed = (1.5-0.5*np.tanh(0.1*(t-tr0)))
    kpu = 300
    fr = 0.1
    m = 0.01
    d = 0.01
    k = 10
    u = float(kpu*np.sqrt(np.abs(sigma))*np.sign(sigma))
    ddx = 1/m*(Fs(x)+FricRed*fr*np.sign(dx)-d*dx-k*x + u )
    return [dx,ddx]
    
dt = 1e-3
tspan = np.arange(start=0,stop=50,step=dt)
steplim = tspan[-1]*0.1

reffunc = np.vectorize(create_ref)
xrefvals = reffunc(tspan)
xref = pd.DataFrame(data=xrefvals,index=tspan,columns=['xref'])

x0 = [-0.5,0]
simresult = odeint(model,x0,tspan)

plt.figure(num=1)
plt.plot(tspan,simresult[:,0],label='ispos')
plt.plot(tspan,xref['xref'].values,label='despos')
plt.legend()
plt.show()

我根据 Pranav Hosangadi 的评论更改了代码。感谢您的提示。我不知道这一点并学到了一些新东西,没想到字典对计算时间有如此大的影响。但现在速度要快得多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。