使用scipy ode解算器时的尺寸值错误

2024-09-25 12:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

当前正在尝试运行以下代码

import numpy as np

from scipy.interpolate import interp1d

from scipy.integrate import ode


def dydt(t,y,tsi,rho):

    Lambda      = 10^-4
    beta        = 0.0065
    lambda2      = 0.08

    rho = interp1d(tsi,rho, fill_value = 'extrapolate')


    #one group delayed precursor
    dydt1 = (-lambda2*y[0] + beta*y[1])
    #power
    dydt2 = (((rho(t)-beta)/Lambda)*y[1]+(lambda2*y[0])/Lambda)
    return dydt1, dydt2


x = 21

dt = 1

tsi=np.arange(0,x,dt)
dt = [1]

rho=np.ones(x)*0.0025
y0= [1,0]
t0 = [0,x-1]


sol = []

i = ode(dydt)

i.set_integrator('dopri5')

i.set_initial_value(t0,y0)

i.set_f_params(tsi,rho)


for t in tsi[1:]:

    i.integrate(i.t+dt)

    sol.append(i.y)

但是,我最终犯了一个错误:

runfile('C:/Users/----/Desktop/---.py', wdir='C:/Users/---/Desktop') Traceback (most recent call last):

File "C:\Users---\Desktop---.py", line 46, in i.integrate(i.t+dt)

File "C:\Users---\anaconda3\lib\site-packages\scipy\integrate_ode.py", line 432, in integrate self.f_params, self.jac_params)

File "C:\Users---\anaconda3\lib\site-packages\scipy\integrate_ode.py", line 1172, in run tuple(self.call_args) + (f_params,)))

ValueError: 0-th dimension must be 2 but got 0 (not defined).

我在网上使用了一个类似的例子,但主要的区别是我在函数中返回了两个等式,我的两个参数是数组。我曾尝试使用odeint和solve_ivp,但他们给出的答案非常不准确

多谢各位


Tags: lambdainpyimportnpdtscipyparams
1条回答
网友
1楼 · 发布于 2024-09-25 12:34:48

再次检查线路

i.set_initial_value(t0,y0)

在文档中,时间参数排在第二位(因为它是一个默认值为0的可选参数)。初始时间是一个标量,而不是元组

您应该只定义一次插值函数,然后仅将其作为参数传递,甚至将其作为全局对象

sol.append(i.y)

也可能不会像您认为的那样,在向量值的情况下,它会构建一个数组,其中包含对i.y的引用的相同副本。使用i.y.copy()生成从解算器内部移除的副本

相关问题 更多 >