python - 用 scipy 解决颂歌系统 - 如何引用不同的索引?

标签 python scipy differential-equations

我有一个依赖于数据矩阵的 ODE 系统。每个 ODE 应在其评估中引用不同的数据列。

import numpy as np
n_eqns = 20
coeffs = np.random.normal(0, 1, (n_eqns, 20))
def dfdt(_, f, idx):
    return (f ** 2) * coeffs[idx, :].sum() - 2 * f * coeffs.sum()

from scipy.integrate import ode
f0 = np.random.uniform(-1, 1, n_eqns)
t0 = 0
tf = 1
dt = 0.001

r = ode(dfdt)
r.set_initial_value(f0, t0).set_f_params(range(n_eqns))

while r.successful() and r.t < tf:
    print(r.t+dt, r.integrate(r.t+dt))

如何指定每个 ODE 应使用与其在 ODE 系统中的索引关联的 idx 值?应传递第一个方程 idx=0,第二个方程 idx=1,依此类推。

最佳答案

函数dfdt分别以数组(或其他可迭代对象)的形式获取并返回状态和导数。因此,您所要做的就是循环所有索引并相应地应用您的操作。例如:

def dfdt(t,f):
    output = np.empty_like(f)
    for i,entry in enumerate(f)
        output[i] = f[i]**2 * coeffs[i,:].sum() - 2*f[i]*coeffs.sum()
    return output

您还可以使用 NumPy 的组件式操作来编写此代码(更快):

def dfdt(t,f):
    return f**2 * coeffs.sum(axis=1) - 2*f*coeffs.sum()

最后请注意,使用 f 表示您的状态可能会有些困惑,因为这就是 ode 表示导数的方式(您将其称为 dfdt) .

关于python - 用 scipy 解决颂歌系统 - 如何引用不同的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49118890/

相关文章:

python嵌套函数内存泄漏?

python - python __eq__ 方法检查两个列表是否相等时出现问题

python - scipy.signal.sepfir2d 中的类型错误

c++ - 编写方法的不同方式

Julia 的微分方程步长控制

arrays - 索引错误 : index 10 is out of bounds for axis 0 with size 10

python - 使用 PyDrive 将大文件上传到 Google Drive

Python Pandas/Matplotlib - 在线上方和下方的注释值

python - 两个 scipy 希尔伯特变换之间有主要区别吗?

machine-learning - 提高 ValueError ("Unknown label type: %s"% repr(ys)) ValueError : Unknown label type: (array