solve_ivp 不适用于 toms748

计算科学 Python scipy
2021-12-17 01:31:13

我有以下代码

from scipy.optimize import toms748
from scipy.integrate import solve_ivp

def f(r):
    return lambda x: x-r

def E(t,r):
    return -toms748(f(r),r-1,r+1)

sol=solve_ivp(E,(0,10),[1])

当我运行它时,我收到以下错误

Traceback (most recent call last):
File "C:\Users\User\Documents\Project codes\Density.py", line 10, in <module>
sol=solve_ivp(E,(0,10),[1])
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\integrate\_ivp\ivp.py", line 576, in solve_ivp
message = solver.step()
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\integrate\_ivp\base.py", line 181, in step
success, message = self._step_impl()
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\integrate\_ivp\rk.py", line 144, in _step_impl
y_new, f_new = rk_step(self.fun, t, y, self.f, h, self.A,
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\integrate\_ivp\rk.py", line 64, in rk_step
K[s] = fun(t + c * h, y + dy)
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\integrate\_ivp\base.py", line 138, in fun
return self.fun_single(t, y)
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\integrate\_ivp\base.py", line 20, in fun_wrapped
return np.asarray(fun(t, y), dtype=dtype)
File "C:\Users\User\Documents\Project codes\Density.py", line 8, in E
return -toms748(f(r),r-1,r+1)
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\optimize\zeros.py", line 1361, in toms748
result = solver.solve(f, a, b, args=args, k=k, xtol=xtol, rtol=rtol,
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\optimize\zeros.py", line 1225, in solve
status, xn = self.iterate()
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\optimize\zeros.py", line 1144, in iterate
c = _newton_quadratic(self.ab, self.fab, d, fd, nsteps)
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\optimize\zeros.py", line 1004, in _newton_quadratic
_, B, A = _compute_divided_differences([a, b, d], [fa, fb, fd],
File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site- 
packages\scipy\optimize\zeros.py", line 959, in _compute_divided_differences
row = np.diff(row)[:] / denom
ValueError: operands could not be broadcast together with shapes (3,0) (2,1)

toms748 是一个求根算法,它接受一个可调用函数和两个标量,这些标量限定了在其间搜索根的值。因此,E(t,r) 就是 E(t,r)=-r,上面实现的微分方程是 dr/dt=-r,初始条件 r(0)=1。解决方案就是 r(t)=exp(-t)。

现在更让我困惑的是,当我从 E(t,r) 中删除减号时,即让

def E(t,r):
    return toms748(f(r),r-1,r+1)

然后不返回任何错误

以上都是玩具功能。实际功能要复杂得多,以上只是重现相同错误的基本实现。非常感谢任何帮助,在此先感谢。

1个回答

我不确定确切的错误,但问题似乎源于tom748您将数组/列表传递rE而不是标量时,尽管我不确定为什么它似乎只发生在solveivp使用-tom748.

solveivp要求您以类似数组的形式输入初始值,但您可以重写E以从列表中解包元素:

def E(t,r):
    r0=r[0]
    res= -toms748(f(r0),r0-1,r0+1)
    return res

通过此修改,脚本对我来说运行得很好。