数值 Python:用布尔条件求解 BVP?
Numerical Python: Solving a BVP with a boolean condition?
我不确定问这个问题的最佳方式,但我正在尝试找到具有需要满足的任意额外约束的 ODE 系统的长期状态。
例如:
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
def f(t, X, a, b):
return a*X + b
N = 5
X0 = np.random.randn(N)
t_range = [0, 1]
a = 3
b = 4
sol = solve_ivp(f, t_range, X0, args=(a, b))
for i in range(N):
plt.plot(sol['t'], sol['y'][i, :])
在上面的代码中,f
是我的 ODE 模型的右侧。 N
是我的状态向量的维度X
,t_range
是我想查看X
的值的区间,X0
是我的初始条件, a
和 b
只是任意模型参数。
编写的代码生成如下图表:
但是,假设我不想在某些固定的 t_range
上评估 X
。假设我想继续求解 ODE,直到满足某些条件:
def bc(X) -> bool:
""" True means we stop solving. """
return (X < 0).any()
换句话说,我想做这样的事情:
X = X0
while not bc(X):
X = new value from ODE solver
在 scipy 中有没有简单的方法来做到这一点?如果没有,是否有直接的方法来实现它?
如果我能澄清任何更好的地方,请告诉我。
@Lutz Lehmann 在评论中回答了我的问题。
如果我希望求解器在 X
中的一个条目变为 < 0 时停止:
event = lambda t, X, a, b : min(X) # account for when args are passed to event func
event.terminal # tells it to stop
sol = solve_ivp(f, t_range, X0, args=(a, b), events = event)
我不确定问这个问题的最佳方式,但我正在尝试找到具有需要满足的任意额外约束的 ODE 系统的长期状态。
例如:
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
def f(t, X, a, b):
return a*X + b
N = 5
X0 = np.random.randn(N)
t_range = [0, 1]
a = 3
b = 4
sol = solve_ivp(f, t_range, X0, args=(a, b))
for i in range(N):
plt.plot(sol['t'], sol['y'][i, :])
在上面的代码中,f
是我的 ODE 模型的右侧。 N
是我的状态向量的维度X
,t_range
是我想查看X
的值的区间,X0
是我的初始条件, a
和 b
只是任意模型参数。
编写的代码生成如下图表:
但是,假设我不想在某些固定的 t_range
上评估 X
。假设我想继续求解 ODE,直到满足某些条件:
def bc(X) -> bool:
""" True means we stop solving. """
return (X < 0).any()
换句话说,我想做这样的事情:
X = X0
while not bc(X):
X = new value from ODE solver
在 scipy 中有没有简单的方法来做到这一点?如果没有,是否有直接的方法来实现它?
如果我能澄清任何更好的地方,请告诉我。
@Lutz Lehmann 在评论中回答了我的问题。
如果我希望求解器在 X
中的一个条目变为 < 0 时停止:
event = lambda t, X, a, b : min(X) # account for when args are passed to event func
event.terminal # tells it to stop
sol = solve_ivp(f, t_range, X0, args=(a, b), events = event)