Хорошо, вот несколько упрощенная числовая схема, которая показывает концептуальные свойства вашей системы. Это аналог (явного) метода Эйлера. Его можно легко обобщить на аналогичный неявный эйлеровоподобный метод.
Вам даны:
Функции 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