Решение связанных PDE с python - PullRequest
3 голосов
/ 31 марта 2020

Я не понимаю, как решить для eta и V в моих связанных уравнениях PDE, используя python или python ode solver. (Или возможно сделать численное решение для этих парных уравнений без решателя?) Я потратил несколько дней на это, но я все еще не могу понять, как начать! Любые намеки будут полезны. Я понимаю пример, приведенный в

Решить 4 связанных дифференциальных уравнения в MATLAB

, но мне все еще нужны дополнительные советы, чтобы выяснить, как применить эти принципы к моим связанным PDE ниже ,

coupled PDEs

Я хотел бы построить временные ряды eta и V, учитывая форсированные входы изменяющихся временных рядов тау.

x - это точка в пространстве, а t - это точка во времени. h и f назначаются на основе их значения x.
V = V (x, t) eta = eta (x, t) тау = tau (x, t) h = h (x), f = f ( x) тогда как g и rho являются константами. Граничными значениями являются V (0,0) = 0, eta (0,0) = 0 и tau (0,0) = 0. При условии стационарных условий решение (V) находится путем приравнивания tau_sy и tau_by.

1 Ответ

0 голосов
/ 05 апреля 2020

Хорошо, вот несколько упрощенная числовая схема, которая показывает концептуальные свойства вашей системы. Это аналог (явного) метода Эйлера. Его можно легко обобщить на аналогичный неявный эйлеровоподобный метод.

Вам даны:

Функции h(x), f(x), tau_sx(x, t), tau_sy(x, t) и tau_by(x, t)

Константы g и rho

Вы ищете:

Функции V(x, t) и eta(x, t), которые удовлетворяют приведенной выше паре дифференциальных уравнений.

Чтобы найти решение этой проблемы, вам необходимо указать:

V(x, 0) = V0(x) и eta(0, t) = eta0(t)

Предположим, ваш домен [0, L] X [0, T], где x в [0, L] и t в [0, T]. Дискретизируйте домен следующим образом: выберите M и N натуральные числа и позвольте dx = L / M и dt = T / N. Затем рассмотрим только конечный набор точек x = m dx и t = n dt для любых целых чисел m = 0, 1, ..., M и n = 0, 1, ..., N.

Я собираюсь ограничить все функции в конечном наборе точек, определенных выше, и использовать следующие обозначения для произвольной функции funct:

funct(x, t) = funct[m, n] и funct(x) = funct[m] для любых x = m dx и t = n dt.

Тогда система дифференциальных уравнений может быть дискретизирована как

g*(h[m] + eta[m,n])*(eta[m+1, n] - eta[m,n])/dx = f[m]*(h[m] + eta[m,n])*V[m,n] + tau_sx[m,n]/rho

(V[m, n+1] - V[m,n])/dt = (tau_sy[m,n] - tau_by[m,n])/(rho*(h[m] + eta[m,n]))

Решить для eta[m+1,n] и V[m,n+1]

eta[m+1,n] = eta[m,n] + f[m]*V[m,n]*dx/g + tau_sx[m,n]*dx/(g*rho*(h[m] + eta[m,n]))

V[m,n+1] = V[m,n] + (tau_sy[m,n] - tau_by[m,n])*dt/(rho*(h[m] + eta[m,n]))

Для простоты я собираюсь сокращать правые части приведенных выше уравнений как

eta[m+1,n] = F_eta(m, n, eta[m,n], V[m,n])

V[m,n+1] = F_V(m, n, eta[m,n], V[m,n])

, то есть что-то вроде

def F_eta(m, n, eta[m,n], V[m,n]):
    return eta[m,n] + f[m]*V[m,n]*dx/g + tau_sx[m,n]*dx/(g*rho*(h[m] + eta[m,n]))

def F_V(m, n,  eta[m,n], V[m,n]):
    return V[m,n] + (tau_sy[m,n] - tau_by[m,n])*dt/(rho*(h[m] + eta[m,n]))

Из граничных условий мы знаем

eta[0,n] = eta0[n] = eta0(n*dt) и

V[m,0] = V0[m] = V0(m*dx)

в качестве входных данных, для m = 0,..., M и n = 0,..., N.

for n in range(N):
    for m in range(M):
        eta[m+1,n] = F_eta(m, n, eta[m,n], V[m,n])
        V[m,n+1] = F_V(m, n, eta[m,n], V[m,n])

(вам нужно настроить эти петли, чтобы достичь крайних правых и верхних граничных точек, но философия остается неизменной)

По сути, вы следуете шаблону: генерируйте этики по горизонтальная ось х, и в то же время вы создаете V один слой вверх. Затем вы переходите на следующий горизонтальный уровень.

o --eta--> o --eta--> o --eta--> o --eta--> o
|          |          |          |          | 
V          V          V          V          V
|          |          |          |          |
o --eta--> o --eta--> o --eta--> o --eta--> o 
...