Решение множества краевых задач - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь решить ряд краевых задач, заданных 4 дифференциальными уравнениями. Я использую bvp_solver в python и получаю ошибки, в которых указано «недопустимое значение, обнаруженное при делении». Я предполагаю, что это означает, что я делю на 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, но я уверен, что теперь я это понимаю. Но я продолжаю получать ошибки каждый раз, когда добавляю больше уравнений. Любая помощь с благодарностью.

1 Ответ

1 голос
/ 28 февраля 2020

Конечно, это не удастся на первом этапе. Вы инициализируете все до нуля, а затем в функции производных делите на T, что равно нулю от инициализации.

  • Найдите более реалистичную c инициализацию 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). Теперь, когда есть более чем несколько компонентов, я изменил структуру выходной таблицы на систематизацию c

%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()
...