我不确定这段代码是什么问题。我正在尝试解决以下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
最诚挚的问候,
凯瑟琳
您调用.set_f_params(2.0).set_jac_params(2.0)
,但是f
和jac
都没有额外的参数。更改
r.set_initial_value(A0, t0).set_f_params(2.0).set_jac_params(2.0)
至]
r.set_initial_value(A0, t0)
您将遇到的另一个问题是
f
和jac
中的表达式缺少一些乘法符号。例如,在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
中的多个位置,都出现相同的问题。