использование scipy solve_ivp для функции с дополнительными аргументами - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь решить проблему начального значения с solve_ivp.Проблема в том, что моя функция f (x, y) = dy / dx содержит дополнительные аргументы.Я пытался использовать это:

Передать аргументы для solve_ivp (новый 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, поэтому, пожалуйста, помогите мне с этим.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы просто неправильно поместили закрывающую скобку.Поскольку derivada не имеет именованных аргументов, удалите оператор args, лямбда-выражение уже связывает эти дополнительные параметры.Кроме того, переданная функция не является именованным аргументом

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)
0 голосов
/ 19 декабря 2018

Сообщение об ошибке дает ответ: все позиционные аргументы должны предшествовать ключевым аргументам.В вашем случае я бы предложил использовать 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)
...