【问题标题】:How to pass an array to scipy.integrate.solve_ivp using args?如何使用 args 将数组传递给 scipy.integrate.solve_ivp?
【发布时间】:2020-08-27 22:55:47
【问题描述】:

如何将数组传递给 scipy.integate.solve_ivp 函数?现在是u=1.0,我想要的是u=np.random.uniform(-1, 1, 1000)

scipy版本是1.4.1

代码是:

import numpy as np
from scipy.integrate import solve_ivp

def func(t, x, u):
    dydt = (-x + u) / 5
    return dydt

y0 = 0
t_span = [0, 10]  
t_eval = np.linspace(0, 10, 1000)
u = 1.0

sol = solve_ivp(func, t_span=t, y0=y0, t_eval=t_eval, args=(u, ))

任何帮助将不胜感激!

不要忘记arg=(u, ) 中的逗号,否则会出现错误odepack.error: Extra arguments must be in a tuple。感谢@Bear Brown 解决了这个问题。

【问题讨论】:

  • 这能回答你的问题吗? odepack.error: Extra arguments must be in a tuple
  • 不是。 @BearBrown
  • 您需要在代码中添加逗号(u,),因为(u) 不是元组
  • 哦,太好了,它有效。非常感谢。还有一个问题:我想传一个数组,比如u = np.linspace(0, 10, 1000),怎么办? @BearBrown
  • 是的,错误是RuntimeError: The size of the array returned by func (1000) does not match the size of y0 (1).

标签: python scipy ode odeint


【解决方案1】:

我认为这可能行得通。

import numpy as np
from scipy.integrate import solve_ivp

def func(t, x, u):
    dydt = (-x + u(t)) / 5
    return dydt

y0 = 0
t_span = [0, 10]  
t_eval = np.linspace(0, 10, 1000)
u = lambda t: np.random.uniform(-1, 1, 1000)

sol = solve_ivp(func, t_span=t, y0=y0, t_eval=t_eval, args=(u, ))

这里有一个更好的解决方案。谢谢@Lutz Lehmann

import numpy as np
from scipy.integrate import solve_ivp
from scipy.interpolate import interp1d

def func(t, x, u):
    dydt = (-x + u(t)) / 5
    return dydt

y0 = 0
t_span = [0, 10]  
t_eval = np.linspace(0, 10, 1000)
u_value = np.random.uniform(-1, 1, 1000)
u = interp1d(x=t_eval, y=u_value)

sol = solve_ivp(func, t_span=t, y0=y0, t_eval=t_eval, args=(u, ))

【讨论】:

    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多