from scipy.integrate import solve_ivp
def myfunc(a,b,c,d,e,f,g,h):
t=a+2
d=b+3
return t,d
a=1
b=2
c=3
d=4
e=5
f=6
g=7
e=8
solve_ivp(lambda t,s:myfunc(a,b,c,d,e,f,g,h),np.linspace(0,100),3)
这就是我面临的问题。Scipy的solve_ivp()
使用语法solve_ivp(function,timerange,initial guess,**kwargs)
求解函数。
我有一个函数(比如myfunc()
),它接受大量的参数,对它们进行一些数学操作,并返回2个变量。我在这里提供了一个样本。我想把这个函数作为solve_ivp()
的参考。我已经用lambda
做过了,但我遇到了一个too many values to unpack (expected 2)
错误。
我该如何解决这个问题?
2条答案
按热度按时间vaqhlq811#
这是另一种情况,我应该只要求完整的追溯,而不是快速猜测问题(请参阅我的评论)。
运行代码:
这是一个解包错误,在
这试图得到2个浮点值的
t_span
参数,并在2个变量,t0,tf
。相反,你提供了一个arange(100)
!用(0,100)来运行它:
所以现在它不喜欢标量
3
为y0
。将其更改为列表[3]
(或等效数组):现在我们有一个缺失的变量
h
。这是从哪来的更正全局变量赋值:
现在它能跑了,虽然我不知道这有什么好处。函数总是返回(a+2,B+3),即(3,5)。你在范围(0,100)上积分,所以返回的
y
是初始值+ 100*(3,5),即。(303,503):你的函数返回两个值,一个全局变量
a
和b
的函数。所以y0
也需要是形状(2)。solve_ivp
将是标量t
和2个元素y
的值,尽管lambda
将它们丢弃。我尝试使用lambda t,s: my_func(t,s,a,b,...)
,但在尝试返回(t,[s+(2,3)])时总是遇到问题,这是一个“粗糙的数组”。我可以用
integrate.solve_ivp(lambda t,s:myfunc(a,b,t,s,c,d,e,f),(0,100),[0,0])
将
t,s
放在myfunc
将忽略它们的插槽中。ee7vknir2#
这里有几个关于你的代码的问题。
1.微分方程函数的前两个参数应该是时间和因变量。你的
lambda
有两个参数,t
和s
,但从来没有使用过它们。1.为时间范围传递
linspace
,但应该是包含开始和停止时间的2个成员tuple
或list
。(如果您想要在特定时间的结果,请将所需时间传递到t_eval
kwarg
。1.当它应该是一个形状为
(n,)
的数组(或list
)时,你传递一个整数作为初始猜测,其中n
是方程的数量。n
应该与微分方程返回值的大小相匹配,但是微分方程返回两个值,而你只提供了一个初始条件。您需要解决所有这些问题,以使您的代码正常工作。