python - 使用隐式方法时 scipy.solve_ivp 中的奇怪行为
问题描述
我最近遇到了一个关于集成的问题,遇到了一个奇怪的错误。我尝试使用一个非常简单的问题solve_ivp
:
from scipy.integrate import solve_ivp
import numpy as np
def f(y, t):
return y
y0 = [1,1,1,1]
method = 'RK23'
s = solve_ivp(f, (0,1), y0, method=method, t_eval=np.linspace(0,1))
它工作正常。当我更改为method='BDF'
或method='Radau'
出现错误时:
Traceback (most recent call last):
File "<ipython-input-222-f11c4406e92c>", line 10, in <module>
s = solve_ivp(f, (0,1), y0, method=method, t_eval=np.linspace(0,1))
File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\integrate\_ivp\ivp.py", line 455, in solve_ivp
solver = method(fun, t0, y0, tf, vectorized=vectorized, **options)
File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\integrate\_ivp\radau.py", line 299, in __init__
self.jac, self.J = self._validate_jac(jac, jac_sparsity)
File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\integrate\_ivp\radau.py", line 345, in _validate_jac
J = jac_wrapped(t0, y0, self.f)
File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\integrate\_ivp\radau.py", line 343, in jac_wrapped
sparsity)
File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\integrate\_ivp\common.py", line 307, in num_jac
return _dense_num_jac(fun, t, y, f, h, factor, y_scale)
File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\integrate\_ivp\common.py", line 318, in _dense_num_jac
diff = f_new - f[:, None]
IndexError: too many indices for array
我也得到一个错误method = 'LSODA'
,虽然不同(即所有隐式积分器)。我没有得到任何显式积分器的错误。
我在 spyder 和 scipy 1.0.0 版和 google colab(scipy 1.1.0 版)中尝试了这个,结果相同。
这是一个错误还是我错过了隐式积分器需要的一些参数?
解决方案
似乎 Radau 和 BDF 方法不处理单值 RHS 函数。使f
上面的函数输出一维列表可以解决您的问题。此外,正如 Weckesser 在评论中提到的,solve_ivp
期望 RHS 是f(t, y)
而不是f(y, t)
.
像这样
def f(t, y):
return [y]
推荐阅读
- html - 让 YouTUBE 视频播放并全屏显示
- javascript - 用括号和省略号在流中键入别名
- javascript - 更改事件侦听器中的 setAttribute 不更新视图
- flutter - Flutter:BorderRadius 在 showGeneralDialog 下不起作用
- android - 匕首 2 组件中的匕首 2 模块
- node.js - how to get the count of documents with value in different fields in mongo
- php - Woocommerce 需要很长时间才能加载并抛出我的页面并出现 503 错误
- python - 如何使用 Discord.py 获取发件人 ID?
- arrays - 空手道:在一种情况下验证 json 和数组的键时遇到问题
- c++ - 如何按键对 std::list 进行排序?