【问题标题】:Solving set of Boundary Value Problems解决一组边值问题
【发布时间】:2020-06-12 16:20:49
【问题描述】:

我正在尝试解决由 4 个微分方程给出的一组边值问题。我在 python 中使用 bvp_solver,我收到错误,指出“在除法中遇到无效值”。我假设这意味着我在某个时候除以 NaN 或 0,但我不确定在哪里。

import numpy as np
from scipy.integrate import solve_bvp
import matplotlib.pyplot as plt
%matplotlib inline
alpha = 1
zeta = 1
C_k = 1
sigma = 1
Q = 30
U_0 = 0.1
gamma = 5/3
theta = 3
m = 1.5
def fun(x, y):
    U, dU, B, dB, T, dT, M, dM = y;
    d2U = -2*U_0*Q**2*(1/np.cosh(Q*x))**2*np.tanh(Q*x)-((alpha)/(C_k*sigma))*dB;   
    d2B = -(1/(C_k*zeta))*dU;
    d2T = (1/gamma - 1)*(sigma*dU**2 + zeta*alpha*dB**2);
    d2M = -(dM/T)*dT + (dM/T)*theta*(m+1) - (alpha/T)*B*dB
    return dU, d2U, dB, d2B, dT, d2T, dM, d2M 

def bc(ya, yb):

    return ya[0]+U_0*np.tanh(Q*0.5), yb[0]-U_0*np.tanh(Q*0.5), ya[2]-0, yb[2]-0, ya[4] - 1, yb[4] - 4, ya[6], yb[6] - 1

x = np.linspace(-0.5, 0.5, 500)
y = np.zeros((8, x.size))


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

如果我删除 M 和 dM 的最后两个方程,则解决方案可以正常工作。过去我在理解 bvp_solver 的返回数组时遇到了麻烦,但我相信我现在明白了。但每次我添加更多方程时,我都会继续出错。非常感谢任何帮助。

【问题讨论】:

    标签: python numpy ode differential-equations boundary


    【解决方案1】:

    当然这会在第一步中失败。您将所有内容初始化为零,然后在导数函数中除以T,即初始化为零。

    • 找一个更真实的T初始化,例如

      x = np.linspace(-0.5, 0.5, 15)
      y = np.zeros((8, x.size))
      y[4] = 2.5+3*x
      y[5] = 3+0*x
      

    • 对除法进行去奇异化,这通常类似于

      d2M = (-dM*dT + dM*theta*(m+1) - alpha*B*dB) * T/(1e-12+T*T)
      

    sol = solve_bvp(...) 错误消息print(sol.message) 之后打印总是有意义的。现在组件多了,我把输出表的构造改成系统的了

    %matplotlib inline
    plt.figure(figsize=(10,2.5*4))
    for k in range(4):
        v,c = ['U','B','T','M'][k],['-+b','-*r','-xg','-om'][k];
        plt.subplot(4,2,2*k+1); plt.plot(sol.x,sol.y[2*k  ],c, ms=2); plt.grid(); plt.legend(["$%c$"%v]);
        plt.subplot(4,2,2*k+2); plt.plot(sol.x,sol.y[2*k+1],c, ms=2); plt.grid(); plt.legend(["$%c'$"%v]);
    plt.tight_layout(); plt.savefig("/tmp/bvp3.png"); plt.show(); plt.close()
    

    【讨论】:

    • 我一直在求解这些方程,但是我注意到当我更改传递给 bvp_solve 的 x 中的网格点数量时,我的 M 和 dM 解也在发生变化。我不清楚我是否正在收敛到真正的解决方案或到底发生了什么。
    • 如果求解器返回“成功”,那么它很可能接近解决方案。请注意,任何部分都为非线性的 BVP 可以有多个解。最初的猜测会影响达到哪一个。
    • 谢谢你说得通。如何从我的代码中输出成功消息?
    • 你有一个逻辑标志sol.success,你可以在失败的情况下使用它来停止进一步的处理,还有一个文本消息sol.message,你可以把它放在一个打印语句中。
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    相关资源
    最近更新 更多