'float'对象不可下标-使用ODE

问题描述 投票:0回答:1

我不确定这段代码是什么问题。我正在尝试解决以下ODE。我用ODEint解决了这个问题,由于某种原因,它只是给零,所以我移到了ode,并且继续收到这个错误,即float对象不可下标。我将不胜感激。

from scipy.integrate import ode
import numpy as np

A0, t0 = [10**-4, 0], 0


coeff = np.complex(0.1451141133675846,-0.08827343181364691)
coeffr = np.real(coeff)
coeffi = np.imag(coeff)


def f(t,A):
    return [(A[0]**2 + A[1]**2)(- coeffr*A[0] + coeffi*A[1]), (A[0]**2 + A[1]**2)(-coeffr*A[0] - coeffi*A[1])]

def jac(t,A):
    return [[ (A[0]**2 + A[1]**2)(- coeffr) + (2*A[0])(- coeffr*A[0] + coeffi*A[1]),(A[0]**2 + A[1]**2)(coeffi) + (2*A[1])(- coeffr*A[0] + coeffi*A[1])],
            [ (A[0]**2 + A[1]**2)(-coeffr) + (2*A[0]**2)(-coeffr*A[1] - coeffi*A[0]),(A[0]**2 + A[1]**2)(- coeffi) +  (2*A[1]**2)(-coeffr*A[0] - coeffi*A[1])]]


r = ode(f, jac).set_integrator('zvode', method='bdf')
r.set_initial_value(A0, t0).set_f_params(2.0).set_jac_params(2.0)
t1 = 100
dt = 0.01

import numpy as np

solution = np.empty((0,100))
time = np.empty((0,100))

while r.successful() and r.t < t1:
    sol = r.integrate(r.t+dt)[0]
    solution = np.append(solution,sol)
    tim = r.t+dt
    time = np.append(time,tim)
    print(r.t+dt, r.integrate(r.t+dt))

print(solution)
print(time)
import matplotlib.pyplot as plt

plt.plot(time,np.real(solution))
plt.show()

错误消息为-抱歉,不太确定如何格式化它:

capi_return is NULL

Call-back cb_f_in_zvode__user__routines failed.

Traceback (most recent call last):

   File "C:/Users/Catherine/PycharmProjects/GinzburgLandau/understanding.py", line 31, in <module>

    sol = r.integrate(r.t+dt)[0]

  File "C:\Users\Catherine\PycharmProjects\GinzburgLandau\venv\lib\site-packages\scipy\integrate\_ode.py", line 432, in integrate
    self.f_params, self.jac_params)

  File "C:\Users\Catherine\PycharmProjects\GinzburgLandau\venv\lib\site-packages\scipy\integrate\_ode.py", line 1004, in run
    y1, t, istate = self.runner(*args)

  File "C:/Users/Catherine/PycharmProjects/GinzburgLandau/understanding.py", line 13, in f return [(A[0]**2 + A[1]**2)(- coeffr*A[0] + coeffi*A[1]), (A[0]**2 + A[1]**2)(-coeffr*A[0] - coeffi*A[1])]  

TypeError: 'float' object is not subscriptable

最诚挚的问候,

凯瑟琳

python numpy for-loop scipy ode
1个回答
0
投票

您调用.set_f_params(2.0).set_jac_params(2.0),但是fjac都没有额外的参数。更改

r.set_initial_value(A0, t0).set_f_params(2.0).set_jac_params(2.0)

至]

r.set_initial_value(A0, t0)

您将遇到的另一个问题是fjac中的表达式缺少一些乘法符号。例如,在f中,术语

(A[0]**2 + A[1]**2)(- coeffr*A[0] + coeffi*A[1])

应该是

(A[0]**2 + A[1]**2) * (- coeffr*A[0] + coeffi*A[1])

[第二个术语,以及jac中的多个位置,都出现相同的问题。

© www.soinside.com 2019 - 2024. All rights reserved.