【问题标题】:Solving two coupled second order boundary value problems求解两个耦合的二阶边值问题
【发布时间】:2020-02-26 09:18:35
【问题描述】:

我已经使用模块solve_bvp 求解了具有两个边界条件的单个二阶微分方程。但是,现在我正在尝试求解两个二阶微分方程组;

U'' + a*B' = 0

B'' + b*U' = 0

边界条件 U(+/-0.5) = +/-0.01 和 B(+/-0.5) = 0。我已将其拆分为一阶常微分方程系统,并尝试使用 @987654322 @ 以数字方式解决它们。但是,对于我的解决方案,我只是得到了充满零的数组。我相信我错误地执行了边界条件。我不清楚如何处理文档中的两个以上方程。我的尝试如下

import numpy as np
from scipy.integrate import solve_bvp
import matplotlib.pyplot as plt
%matplotlib inline
from scipy.integrate import solve_bvp
alpha = 1E-8
zeta = 8E-3
C_k = 0.05
sigma = 0.01
def fun(x, y):

    return np.vstack((y[1],-((alpha)/(C_k*sigma))*y[2],y[2], -(1/(C_k*zeta))*y[1]))

def bc(ya, yb):

    return np.array([ya[0]+0.001, yb[0]-0.001,ya[0]-0, yb[0]-0])

x = np.linspace(-0.5, 0.5, 5000)
y = np.zeros((4, x.size))
print(y)


sol = solve_bvp(fun, bc, x, y)
print(sol)

在我的问题中,我刚刚重新标记了 a 和 b,但它们只是我输入的参数。我有这组方程的解析解,所以我知道存在一个不平凡的方程。任何帮助将不胜感激。

【问题讨论】:

    标签: python numpy ode differential-equations


    【解决方案1】:

    如果您在评论中至少声明一次或通过分配给特定命名的变量您希望如何组成状态向量,大多数时候真的很有帮助。

    通过导数返回向量的形式,我想你打算

    U, U',  B, B'
    

    这意味着U=y[0], U'=y[1]B=y[2],B'=y[3],这样你的导数向量应该是正确的

    return y[1], -((alpha)/(C_k*sigma))*y[3],  y[3], -(1/(C_k*zeta))*y[1]
    

    和边界条件

    return ya[0]+0.001, yb[0]-0.001, ya[2]-0, yb[2]-0
    

    特别是你的边界条件应该在第一步中抛出算法,因为一个奇异的雅可比行列式,总是检查解决方案结构的.success 字段和.message 字段。


    注意,默认实验solve_bvp的绝对和相对容差为1e-3,节点数量限制为500

    将初始节点数设置为 50(5000 太多了,求解器会在必要时进行细化),并将容差设置为 1-6,我得到以下解图,明显满足边界条件。

    【讨论】:

    • 所以我把方程写成四个颂歌,这样 U' = V, V' = -((alpha/(C_ksigma))*H, B' = H, H' = -(1/(C_kzeta))*V - 我希望这很清楚。我刚刚尝试了您提供的代码,并且 B 的解决方案不满足边界条件,即 0 在边界。我对您如何为导数编写返回向量感到有些困惑。如果您能进一步解释,我将不胜感激,谢谢。
    • 好的,所以我可能已经修复它并注意到它与您对评论所做的编辑一致。但是,B 的解仍然不满足零边界条件。您在代码中注意到了什么吗?它看起来像是真正的解决方案,但颠倒了并且边界不满足。也许我的方程式漏掉了一个负数。
    • 据我所知,我的返回向量与您的 cmets 兼容。 scipy 求解器会自动将返回的列表转换为适当的 numpy 结构,因此您无需手动执行此操作。
    • 感谢您的详尽回答,这真的很有帮助。 bvp函数中如何设置容差?
    • 使用选项tol=1e-7。您可以根据需要增加具有max_nodes=1500 或更高的节点数,但此处不需要这样做,除非您使用tol=1e-12 或更低。如果可以的话,重新调整问题的比例,使所有解决方案组件的典型比例都在 1 左右,我认为求解器中的启发式算法是围绕该假设构建的。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多