我尝试解决2个耦合方程系统,这里称为系统A和系统B.这两个系统中的一个是ODE系统。 为了避免在两个系统之间复制共享数据,我希望有一个带指针的结构。为此,我使用了numpy.view的机制。
一些代码:
import numpy as np
import scipy
t0,t1,dt = 0.0,5.0, 1.0
data = np.ones((5,2))
data[:,1]*=2
y=np.array([0.0,0.0]) ### no matter default value
r = scipy.integrate.ode(f)
r.set_integrator('dopri5', rtol=1e-3, atol=1e-6 )
r.set_f_params(0.05)
#r.set_initial_value(y, t0); r._y = data[2] ### Apparently equivalent
r.set_initial_value(data[2], t0) ### Apparently equivalent
print(np.shares_memory(r.y,y))
print(np.shares_memory(r.y,data))
这里,在初始状态,我在r.y(系统A)和数据[2]之间有一个同步(名为data的变量是系统B的数据)。如果我修改一个,另一个也被修改,反之亦然。磁带命令r.y.base确认r.y只是名为data的数组的视图。那是我想要的行为。
现在,问题从这里开始。如果我的EDO系统取得进展:
while r.successful() and r.t < t1:
r.integrate(r.t+dt, step=True)
print(r.t+dt,r.y)
print(np.shares_memory(r.y,data))
print(data)
数据和r.y不再同步。 r.y不再是数据视图。 它看起来集成函数创建了它的属性r.y的新实例,而不仅仅是更新它。我已经阅读了这个函数的源代码
https://github.com/scipy/scipy/blob/v0.19.1/scipy/integrate/_ode.py#L396
但它迅速提到了fortran代码,我的理解能力就此止步。
如何通过r.y和数据之间的数据复制的不同方式解决(或解决)这个问题(这也意味着手动管理同步)? 这可能是scipy中的一个错误吗?
感谢您的帮助