【问题标题】:Double Direct Integration双重直接整合
【发布时间】:2020-06-11 20:00:18
【问题描述】:

我正在尝试解决这样的耦合边值问题集;

U'' +aB'+ b*(cosh(lambda z))^{-2}tanh(lambda*z) = 0,

B'' + c*U' = 0, 

T'' = (gamma^{-1} - 1)*(d*(U')^2 + e*(B')^2)

受限于边界条件U(+/- 1/2) = +/-U_0*tanh(lambda/2)B(+/- 1/2) = 0 and T(-1/2) = 1T(1/2) = 4。我已将这组方程分解为一组一阶微分方程,并使用导数数组使得[U, U', B, B', T, T']。但是 bvp solve 正在返回我有一个雅可比行列式的错误。当我删除最后两个方程时,我得到了 UB 的解决方案,并且效果很好。但是,我不确定为什么添加其他两个等式会导致此问题。

import numpy as np
from scipy.integrate import solve_bvp
import matplotlib.pyplot as plt
%matplotlib inline
alpha = 1E-7
zeta = 8E-3
C_k = 0.01 
sigma = 0.005
Q = 30
U_0 = 0.1
gamma = 5/3
theta = 3

def fun(x, y):

    return y[1], -2*U_0*Q**2*(1/np.cosh(Q*x))**2*np.tanh(Q*x)-((alpha)/(C_k*sigma))*y[3],  y[3],\
        -(1/(C_k*zeta))*y[1], y[4], (1/gamma - 1)*(sigma*(y[1])**2 + zeta*alpha*(y[3])**2)

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

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


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

但是,我得到的错误是“使用序列设置数组”。第一个函数和边界条件求解两个耦合方程,然后我使用这些结果来评估我给出的方程。我曾尝试在一个函数中编写所有方程,但这似乎返回了微不足道的解决方案,即一个充满零的数组。

任何帮助将不胜感激。

【问题讨论】:

  • 试试scicomp.stackexchange.com是一个更好的地方
  • 谢谢,我会在那里发些东西
  • y[5] 代替T' 重试,而不是y[4]。这能解决问题吗?

标签: python integration ode differential-equations boundary


【解决方案1】:

当表达式变大时,保持计算的可读性而不是紧凑通常更有帮助。

def fun(x, y):
    U, dU, B, dB, T, dT = 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);
    return dU, d2U, dB, d2B, dT, d2T 

这避免了丢失索引错误,因为在此计算中没有索引,所有索引的名称都接近原始公式。

然后解决方案组件(使用只有 5 个点的初始化,导致 65 个点的细化)绘制为

【讨论】:

  • 这是非常有用的反馈。我试过你关于 y[5] 去 y[4] 的建议,我确实得到了解决方案。我得到了 U 和 B 的通常行为解决方案,但是无论参数如何,T 的解决方案始终是线性的。这对我来说似乎很奇怪,因为 U 和 B 似乎发生了巨大的变化。但是,我在任何地方都没有看到错误?我认为 T 应该改变。
  • 我假设无论如何 T 都是线性的,因为 T'' 的方程是直接积分,但在两个边界之间。
  • 这里值得补充的是,当我针对 T(我假设是 y[4])绘制 x 时,我得到一个线性图。但是,当我针对 T' (y[5]) 绘制 x 时,我没有得到一条平坦的水平线(我希望它是一条直线)。
  • 如果您得到与上面最后一个组件相同的图,请注意 y 轴上方的 +3,它告诉您刻度处的数字偏移到 3.0000,所以 y-范围是从 2.9996 到 3.0004,几乎是一条直线。
  • 第一个图有误,它使用 python 2 内核运行,其中 gamma=5/3 的计算结果为 1。
猜你喜欢
  • 2012-10-25
  • 2020-02-15
  • 2021-10-08
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多