【问题标题】:Value error of dimension when using scipy ode solver使用 scipy ode 求解器时维度的值错误
【发布时间】:2020-08-01 14:05:31
【问题描述】:

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

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(最近一次调用最后一次):

文件“C:\Users---\Desktop---.py”,第 46 行,在 i.integrate(i.t+dt)

文件“C:\Users---\anaconda3\lib\site-packages\scipy\integrate_ode.py”,第 432 行,在集成中 self.f_params, self.jac_params)

文件“C:\Users---\anaconda3\lib\site-packages\scipy\integrate_ode.py”,第 1172 行,运行中 元组(self.call_args) + (f_params,)))

ValueError: 第 0 维必须为 2 但得到 0(未定义)。

我在网上遵循了一个类似的示例,但主要区别在于我在函数中返回了 2 个方程,而我的两个 args 是数组。我尝试使用 odeint 和 solve_ivp 但它们给出的答案非常不准确。

谢谢。

【问题讨论】:

    标签: python scipy ode integrate


    【解决方案1】:

    再次检查该行

    i.set_initial_value(t0,y0)
    

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

    你应该只定义一次插值函数,然后只将它作为参数传递,甚至将其保留为全局对象。

    sol.append(i.y)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2019-04-13
      • 2017-07-13
      • 2014-02-11
      • 2014-09-07
      • 2019-12-07
      • 2018-09-20
      相关资源
      最近更新 更多