【问题标题】:using scipy solve_ivp for a function with extra arguments将 scipy solve_ivp 用于具有额外参数的函数
【发布时间】:2019-05-19 08:43:00
【问题描述】:

我正在尝试使用solve_ivp 解决初始值问题。问题是我的函数 f(x,y)=dy/dx 包含额外的参数。我试着用这个:

Pass args for solve_ivp (new SciPy ODE API)

但它一直给我错误。代码如下:

from numpy import arange
import math
import numpy as np
from scipy.integrate import solve_ivp
from numpy import pi

sigmav = 1.0e-9
Mpl = 1.22e19
ms=100.0
gg=100.0
gs=106.75

def Yeq(x):
    return 0.145*(gg/gs)*(x)**(3/2)*np.exp(-x)

def ss(x,m_dm):
    return (2/45)*((pi)**2)*gs*(m_dm**3/x**3)

def hubb(x,m_dm):
    return 1.66*(gg**(1/2))*(m_dm**2/Mpl)*(1/x**2)

def derivada(x,yl,m_dm,σv):
    return -(σv*ss(x,m_dm)*((yl**2)-(Yeq(x)**2)))/(x*hubb(x,m_dm))


xx=np.logspace(np.log10(3),3,100)
y00 = Yeq(xx[0])
x00 = xx[0] 
sigmav = 1.7475e-9
ms=100.0

solucion1 = solve_ivp(fun=lambda x, y: derivada(x, y, args=(ms,sigmav),[np.min(xx),np.max(xx)],[y00],method='BDF',rtol=1e-10,atol=1e-10))

当我尝试运行 solucion1 的单元格时,它返回以下内容:

File "<ipython-input-17-afcf6c3782a9>", line 6
solucion1 = solve_ivp(fun=lambda x, y: derivada(x, y, args=(ms,sigmav),[np.min(xx),np.max(xx)],[y00],method='BDF',rtol=1e-10,atol=1e-10))
                                                                      ^
SyntaxError: positional argument follows keyword argument

这一定很容易,但我刚刚开始使用 python,所以请帮助我。

【问题讨论】:

    标签: python scipy differential-equations


    【解决方案1】:

    此问题已在 SciPy 1.4+ 中得到解决。

    https://github.com/scipy/scipy/issues/8352#issuecomment-619243137

    您应该能够像使用 odeint 一样向函数添加额外的参数,不需要 lambda 函数。我认为这就是您想要的解决方案

    solucion1 = solve_ivp(fun=derivada,
                      t_span=[np.min(xx),np.max(xx)],
                      y0=[y00],
                      args=(ms,sigmav),
                      method='BDF',
                      rtol=1e-10,
                      atol=1e-10)
    

    【讨论】:

      【解决方案2】:

      你只是放错了右括号。由于derivada 没有命名参数,请删除那里的 args 语句,lambda 表达式已经绑定了这些附加参数。另外,传递的函数不是命名参数

      solucion1 = solve_ivp(lambda x, y: derivada(x, y, ms, sigmav),[np.min(xx),np.max(xx)], [y00], method='BDF', rtol=1e-10, atol=1e-10)
      

      或以您从 github 讨论中引用的形式,其中参数列表在其他地方构建

      args = ( ms, sigmav )
      
      solucion1 = solve_ivp(lambda x, y: derivada(x, y, *args),[np.min(xx),np.max(xx)], [y00], method='BDF', rtol=1e-10, atol=1e-10)
      

      【讨论】:

        【解决方案3】:

        错误消息给出了答案:所有 em>位置参数需要在关键字参数之前来。在您的情况下,我建议使用partial

        from functools import partial
        
        f = partial(derivada, m_dm=ms, σv=sigmav)
        solucion1 = solve_ivp(f, [np.min(xx),np.max(xx)],[y00],method='BDF',rtol=1e-10,atol=1e-10)
        

        【讨论】:

          猜你喜欢
          • 2019-06-07
          • 2020-10-24
          • 2019-09-16
          • 2018-06-23
          • 2018-12-06
          • 2021-01-03
          • 1970-01-01
          • 1970-01-01
          • 2019-11-06
          相关资源
          最近更新 更多