Python 对带有额外参数的函数使用scipy solve_ivp
我试图用solve_ivp解决一个初值问题。问题是我的函数f(x,y)=dy/dx包含额外的参数。我试着用这个: 但它总是给我错误。代码如下:Python 对带有额外参数的函数使用scipy solve_ivp,python,scipy,differential-equations,Python,Scipy,Differential Equations,我试图用solve_ivp解决一个初值问题。问题是我的函数f(x,y)=dy/dx包含额外的参数。我试着用这个: 但它总是给我错误。代码如下: 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 de
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
文件“”,第6行
解算1=解算ivp(fun=λx,y:导数(x,y,args=(ms,sigmav),[np.min(xx),np.max(xx)],[y00],方法='BDF',rtol=1e-10,atol=1e-10))
^
SyntaxError:位置参数跟在关键字参数后面
这一定很简单,但我刚刚开始使用python,所以请帮我解决这个问题。错误消息给出了答案:所有位置参数都必须位于关键字参数之前。在您的情况下,我建议使用
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)
错误消息给出了答案:所有位置参数都必须位于关键字参数之前。在您的情况下,我建议使用
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)
你只是错放了一个右括号。由于
derivida
没有命名的args,请删除其中的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)
你只是错放了一个右括号。由于
derivida
没有命名的args,请删除其中的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)
此问题已在SciPy 1.4+中解决 您应该能够向函数添加额外的参数,就像使用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)
此问题已在SciPy 1.4+中解决 您应该能够向函数添加额外的参数,就像使用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)