Ode 集成器 Python TypeError 'float' 对象不可下标

Posted

技术标签:

【中文标题】Ode 集成器 Python TypeError \'float\' 对象不可下标【英文标题】:Ode integrator Python TypeError 'float' object is not subscriptableOde 集成器 Python TypeError 'float' 对象不可下标 【发布时间】:2019-02-21 17:54:44 【问题描述】:

我正在拼命尝试使用 scipy ODE 积分器,但我不断收到以下错误:

Y[0] = (1/I3) * T_z(INP[0], INP[1], INP[2], INP[3], INP[4])
TypeError: 'float' object is not subscriptable

我的代码如下:

import scipy.integrate as spi
import numpy as np

import pylab as pl
from time import time

#Constants

I3 = 0.00396
lamb = 1
L = 5*10**-1
mu = 1
m = 0.1
Cz = 0.5
rho = 1.2
S = 0.03*0.4
K_z = 1/2*rho*S*Cz
g = 9.81

#Initial conditions

omega0 = 10*2*np.pi
V0 = 25
theta0 =np.pi/2
phi0 = 0
psi0 = -np.pi/9
X0 = 0
Y0 = 0
Z0 = 1.8

#for integration

t_start = 0.0
t_end = 5
t_step = 0.1
t_range = np.arange(t_start, t_end+t_step, t_step)

INPUT = omega0, V0, theta0, phi0, psi0, X0, Y0, Z0 #initial conditions 

def diff_eqs(INP,t):  

    def M(v_G, w_z):
        return L*K_z*(v_G**2 + v_G*L*w_z*np.sin(w_z*t_step)+(L*w_z)**2)


    def F_x(w_z, v_G, theta, phi, psi):
        return K_z*(v_G**2+(L*w_z)**2)*np.sin(theta)*np.sin(phi) + lamb*v_G*(np.cos(psi)*np.cos(phi) - np.cos(theta)*np.sin(phi)*np.sin(psi))

    def F_y(w_z, v_G, theta, phi, psi):
        return -K_z*(v_G**2+(L*w_z)**2)*np.sin(theta)*np.cos(phi) + lamb*v_G*(np.cos(psi)*np.sin(phi) + np.cos(theta)*np.cos(phi)*np.sin(psi))

    def F_z(w_z, v_G, theta, phi, psi):
        return -K_z*(v_G**2+(L*w_z)**2)*np.cos(theta) + lamb*v_G*np.sin(theta)*np.sin(psi) - m*g


    def T_x(w_z, v_G, theta, phi, psi):
        return M(v_G, w_z)*(-np.sin(w_z*t_step)*(np.cos(psi)*np.cos(phi) - np.cos(theta)*np.sin(phi)*np.sin(psi)) \
        + np.cos(w_z*t_step)*(-np.sin(psi)*np.cos(phi) - np.cos(theta)*np.sin(phi)*np.cos(psi))) \
        - mu * w_z * (np.sin(theta)*np.sin(phi))

    def T_y(w_z, v_G, theta, phi, psi):
        return M(v_G, w_z)*(-np.sin(w_z*t_step)*(np.cos(psi)*np.sin(phi) + np.cos(theta)*np.cos(phi)*np.sin(psi)) \
        + np.cos(w_z*t_step)*(-np.sin(psi)*np.sin(phi) - np.cos(theta)*np.cos(phi)*np.cos(psi)))
        - mu * w_z * (np.sin(theta)*np.cos(phi))

    def T_z(w_z, v_G, theta, phi, psi):
        return M(v_G, w_z)*(-np.sin(w_z*t_step)*np.sin(theta)*np.sin(psi) + np.cos(w_z*t_step)*np.sin(theta)*np.cos(psi)) \
        - mu * w_z * np.cos(theta)

    Y = np.zeros(8)

    Y[0] = (1/I3) * T_z(INP[0], INP[1], INP[2], INP[3], INP[4])
    Y[1] = -(lamb/m)*F_x(INP[0], INP[1], INP[2], INP[3], INP[4])
    Y[2] = (1/(I3*INP[0]))*(-T_y(INP[0], INP[1], INP[2], INP[3], INP[4])*np.cos(INP[4]) - T_x(INP[0], INP[1], INP[2], INP[3], INP[4])*np.sin(INP[4]))
    Y[3] = (1/(I3*INP[0]*np.cos(INP[3]))) * (-T_y(INP[0], INP[1], INP[2], INP[3], INP[4])*np.sin(INP[4]) + T_x(INP[0], INP[1], INP[2], INP[3], INP[4])*np.cos(INP[4]))
    Y[4] = -(1/(m*INP[1]))*F_y(INP[0], INP[1], INP[2], INP[3], INP[4])
    Y[5] = INP[1]*(-np.cos(INP[4])*np.cos(INP[3]) + np.sin(INP[4])*np.sin(INP[3])*np.cos(INP[2]))
    Y[6] = INP[1]*(-np.cos(INP[4])*np.sin(INP[3]) - np.sin(INP[4])*np.cos(INP[3])*np.cos(INP[2]))
    Y[7] = INP[1]*(-np.sin(INP[4])*np.sin(INP[2]))


    return Y

ode =  spi.ode(diff_eqs)

# BDF method suited to stiff systems of ODEs
ode.set_integrator('vode',nsteps=500,method='bdf')
ode.set_initial_value(INPUT,t_start)

ts = []
ys = []

while ode.successful() and ode.t < t_end:
    ode.integrate(ode.t + t_step)
    ts.append(ode.t)
    ys.append(ode.y)

t = np.vstack(ts)

我有一组 8 个微分方程,我想用数值求解。因此,我在“INPUT”中存储了 8 个初始值。但是当我在 ode.set_initial_value(INPUT,t_start) 中使用这个变量时,它不断重复这个变量是一个浮点数!它一直困扰着我几个小时,答案可能很明显,但我看不出我在哪里犯了错误。而且我不认为方程式本身,即使它们非常混乱,也在这里涉及。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您的参数顺序是 odeint 的 ODE 函数所需的顺序。对于ode,您需要订购(t, INP)

尝试使用更新的solve_ivp 接口,它具有与ode 类大致相同的功能和与odeint 大致相同的紧凑调用结构。

【讨论】:

谢谢!我知道这很愚蠢。我将研究新界面。

以上是关于Ode 集成器 Python TypeError 'float' 对象不可下标的主要内容,如果未能解决你的问题,请参考以下文章

Python - Scipy:ode 模块:启用求解器的 step 选项的问题

scipy.integrate.ode 放弃集成

多个 scipy.integrate.ode 实例

离散值的 ODE 集成

在 Python 中传递参数化函数句柄

奇怪的 SciPy ODE 集成错误