события scipy solve_ivp : события в интеграле производной

#python #scipy #integration #derivative

Вопрос:

 import numpy as np
from scipy.optimize import fsolve
from scipy.integrate import quad
from scipy.integrate import solve_ivp

def dYdW(W, Y):
  X, y = Y
  dXdW = (kprime/Fa0)*(1-X)*y*(1/(1 epsilon*X))
  dydW = -1*alpha*(1 epsilon*X)*(1/2*y)
  return(np.array([dXdW, dydW]))

def event(W, Y): 
  X, y = Y
  X = 0.5
  return(0.5)

X0 = np.array([0, 1])
Wspan = np.array([0, 100])
Weval, h = np.linspace(*Wspan, 500, retstep=True)

sol = solve_ivp(dYdW, Wspan, X0, max_step=h, events=event)

import matplotlib.pyplot as plt
plt.plot(sol.t, sol.y.T)
plt.xlabel("w")
plt.ylabel("X (conversion, y(dimensionless pressure)")
plt.legend("Conversion","pressure")

sol.t_events
 

Я пытаюсь решить, когда функция X = 0,5, и определить, что такое W и y, когда это произойдет. Я действительно не слишком хорошо знаю, как заставить функцию событий работать для вещей, выходящих за рамки производной, для которой я решаю

Ответ №1:

Если вы пытаетесь определить, когда второе значение y равно 0,5, вы должны вернуть 0, если это верно. Попробуйте что-нибудь подобное, где я предположил, что все ваши параметры равны 1.

 import numpy as np
from scipy.integrate import solve_ivp
kprime=1
Fa0=1
epsilon=1
alpha=1
def dYdW(W, Y):
    X, y = Y
    dXdW = (kprime/Fa0)*(1-X)*y*(1/(1 epsilon*X))
    dydW = -1*alpha*(1 epsilon*X)*(1/2*y)
    return(np.array([dXdW, dydW]))
def event(W, Y):
    return Y[1] - 0.5
X0 = np.array([0, 1])
Wspan = np.array([0, 100])
Weval, h = np.linspace(*Wspan, 500, retstep=True)

sol = solve_ivp(dYdW, Wspan, X0, max_step=h, events=event)
print(sol.t_events)
print(sol.y_events)
 

доходность

 [array([1.06945742])]
[array([[0.46528842, 0.5        ]])]