首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numerical Python:用布尔条件求解BVP?

Numerical Python:用布尔条件求解BVP?
EN

Stack Overflow用户
提问于 2021-03-27 02:05:40
回答 1查看 41关注 0票数 1

我不确定问这个问题的最佳方式,但我正在尝试找到一个具有任意额外约束的ODE系统的长期状态,该约束需要满足。

例如:

代码语言:javascript
复制
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是我的初始条件,ab只是任意的模型参数。

所编写的代码会生成以下图表:

然而,假设我不想在某个固定的t_range上评估X。比方说,我想一直解这个ODE,直到满足某些条件:

代码语言:javascript
复制
def bc(X) -> bool:
    """ True means we stop solving. """
    return (X < 0).any()

换句话说,我想做这样的事情:

代码语言:javascript
复制
X = X0
while not bc(X):
   X = new value from ODE solver

在scipy中有没有简单的方法可以做到这一点?如果没有,有没有一种简单的方法来实现呢?

如果我能澄清一些更好的事情,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-29 03:43:40

@Lutz Lehmann在评论中回答了我的问题。

如果我想让求解器在X中的一个条目变为<0时停止:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66822159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档