如何修复 scipy 的 odeint 函数中的 np.float64 不可调用错误? [关闭]

Posted

技术标签:

【中文标题】如何修复 scipy 的 odeint 函数中的 np.float64 不可调用错误? [关闭]【英文标题】:How do I fix np.float64 not callable error in scipy's odeint function? [closed] 【发布时间】:2021-03-29 04:15:30 【问题描述】:

所以我试图用 scipy odeint 函数解决一组耦合的 ODE-s,并且错误:'numpy.float64' object is not callable 不断弹出。我已经对这个功能有一些经验,但我不知道哪一部分是错的。这是我的代码:

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


def ODE(f, t):
    """Function containing the ODE-s, to be used in odeint"""
    x, vx, y, vy = f
    ax = -2.0*y**2*x(1 - x**2)*np.exp(-(x**2 + y**2))
    ay = -2.0*x**2*y(1 - y**2)*np.exp(-(x**2 + y**2))
    return np.array([vx, ax, vy, ay])
    

def trajectory(impactpar, speed):
    """Using odeint to calculate values"""
    x0 = impactpar
    vy = speed
    y0 = -2
    vx = 0
    initvals = [x0, vx, y0, vy]
    maxtime = 10 / speed
    time = np.linspace(0, maxtime, 300)
    result = odeint(ODE, initvals, time)
    return result


"""setting initial conditions for trajectory()"""
a_x0 = np.random.randint(-9000, 9001, 1)[0]/1e4
a_vy = np.random.randint(1, 5000, 1)[0]/1e4
xt = trajectory(a_x0, a_vy)[0]
yt = trajectory(a_x0, a_vy)[2]

这是我收到的完整错误消息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-55-40f25e7b2ba0> in <module>
     28 a_x0 = np.random.randint(-9000, 9001, 1)[0]/1e4
     29 a_vy = np.random.randint(1, 5000, 1)[0]/1e4
---> 30 xt = trajectory(a_x0, a_vy)[0]
     31 yt = trajectory(a_x0, a_vy)[2]

<ipython-input-55-40f25e7b2ba0> in trajectory(impactpar, speed)
     22     maxtime = 10 / speed
     23     time = np.linspace(0, maxtime, 300)
---> 24     result = odeint(ODE, initvals, time)
     25     return result
     26 

E:\Coding\Anaconda\lib\site-packages\scipy\integrate\odepack.py in odeint(func, y0, t, args, Dfun, col_deriv, full_output, ml, mu, rtol, atol, tcrit, h0, hmax, hmin, ixpr, mxstep, mxhnil, mxordn, mxords, printmessg, tfirst)
    242                              full_output, rtol, atol, tcrit, h0, hmax, hmin,
    243                              ixpr, mxstep, mxhnil, mxordn, mxords,
--> 244                              int(bool(tfirst)))
    245     if output[-1] < 0:
    246         warning_msg = _msgs[output[-1]] + " Run with full_output = 1 to get quantitative information."

<ipython-input-55-40f25e7b2ba0> in ODE(f, t)
      9     """Function containing the ODE-s, to be used in odeint"""
     10     x, vx, y, vy = f
---> 11     ax = -2.0*y**2*x(1 - x**2)*np.exp(-(x**2 + y**2))
     12     ay = -2.0*x**2*y(1 - y**2)*np.exp(-(x**2 + y**2))
     13     return np.array([vx, ax, vy, ay])

TypeError: 'numpy.float64' object is not callable

如果有人可以帮助我,我将不胜感激

【问题讨论】:

【参考方案1】:

正如它所说的那样,浮点变量不是函数,因此不能被调用。您需要将x(...) 替换为x*(...)

【讨论】:

以上是关于如何修复 scipy 的 odeint 函数中的 np.float64 不可调用错误? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scipy.integrate.odeint 求解具有时间相关变量的 ODE 系统

python 的scipy 里的 odeint 这个求微分方程的函数怎么用啊

boost odeint 给出了与 Python3 scipy 非常不同的值

scipy.integrate.odeint 和 scipy.integrate.ode 有啥区别?

在python(odeint)中求解具有时间相关系数的常微分方程

使用 scipy.integrate.odeint 解决颂歌系统(不断变化的常数!)?