用 python 求解耦合偏微分方程
Solving coupled PDE with python
我不明白如何使用 python 或 python ode 求解器求解耦合 PDE 方程中的 eta 和 V。 (或者是否可以在没有求解器的情况下对这些方程式进行数值求解?)
我在这上面花了几天时间,但我仍然不知道如何开始!任何提示都会有所帮助。我理解
中给出的示例
但我仍然需要更多提示来弄清楚如何将这些原则应用于下面的耦合 PDE。
我想绘制 eta 和 V 的时间序列,给定 tau 的不同时间序列的强制输入。
x是space中的一个点,t是一个时间点。 h 和 f 是根据它们的 x 值分配的。
V = V(x,t) eta = eta(x,t) tau = 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。
好的,这是一个比较简单的数字方案,它显示了系统的概念属性。它类似于(明确的)欧拉方法。它可以很容易地推广到类似的隐式类欧拉方法。
你得到:
函数 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])
(您必须调整这些循环以到达最右边和上边界点,但原理保持不变)
基本上,您遵循以下模式:沿水平 x 轴生成 etas,同时向上生成一个 V 层。然后你向上移动到下一个水平面。
o --eta--> o --eta--> o --eta--> o --eta--> o
| | | | |
V V V V V
| | | | |
o --eta--> o --eta--> o --eta--> o --eta--> o
我不明白如何使用 python 或 python ode 求解器求解耦合 PDE 方程中的 eta 和 V。 (或者是否可以在没有求解器的情况下对这些方程式进行数值求解?) 我在这上面花了几天时间,但我仍然不知道如何开始!任何提示都会有所帮助。我理解
中给出的示例但我仍然需要更多提示来弄清楚如何将这些原则应用于下面的耦合 PDE。
我想绘制 eta 和 V 的时间序列,给定 tau 的不同时间序列的强制输入。
x是space中的一个点,t是一个时间点。 h 和 f 是根据它们的 x 值分配的。
V = V(x,t) eta = eta(x,t) tau = 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。
好的,这是一个比较简单的数字方案,它显示了系统的概念属性。它类似于(明确的)欧拉方法。它可以很容易地推广到类似的隐式类欧拉方法。
你得到:
函数 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])
(您必须调整这些循环以到达最右边和上边界点,但原理保持不变)
基本上,您遵循以下模式:沿水平 x 轴生成 etas,同时向上生成一个 V 层。然后你向上移动到下一个水平面。
o --eta--> o --eta--> o --eta--> o --eta--> o
| | | | |
V V V V V
| | | | |
o --eta--> o --eta--> o --eta--> o --eta--> o