首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用python求解耦合PDE

用python求解耦合PDE
EN

Stack Overflow用户
提问于 2020-03-31 15:06:16
回答 1查看 1.9K关注 0票数 3

我不明白如何用python或python ode求解器来求解耦合PDE方程中的eta和V。(或者不需要解就可以对这些耦合方程进行数值解吗?)我花了好几天时间在这上面,但我还是不明白怎么开始!任何暗示都会有帮助。我理解下面的例子

Solve 4 coupled differential equations in MATLAB

但是,我仍然需要更多的提示来找出如何将这些原则应用到下面耦合的PDE中。

我想画一个eta和V的时间序列,考虑到τ的不同时间序列的强制输入。

X是空间中的一个点,t是一个时间点。H和f是根据x的值分配的。

V= V(x,t) eta = eta(x,t)τ=τ(x,t) h= h(x),f= f(x),g和rho是常数。边界值为V( 0,0 ) =0,eta(0,0)=0,τ(0,0)=0。在稳态条件下,通过tau_sy和tau_by的等价物求出解(V)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-05 03:27:58

好的,这是一个比较简单的数值格式,它显示了你的系统的概念属性。它类似于(显式)欧拉方法。它可以很容易地推广到类似的隐式Euler类方法。

你得到的是:

函数h(x)f(x)tau_sx(x, t)tau_sy(x, t)tau_by(x, t)

常数grho

你在寻找:

满足上述微分方程对的函数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]中。将域分解为:选择MN正整数,并让dx = L / Mdt = T / N。然后只考虑任意整数的有限点集x = m dxt = n dtm = 0, 1, ..., Mn = 0, 1, ..., N

我将限制上面定义的有限点集上的所有函数,并对任意函数funct使用以下表示法

funct(x, t) = funct[m, n]funct(x) = funct[m]表示任何x = m dxt = 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])

也就是说,就像

代码语言:javascript
复制
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,..., Mn = 0,..., N

代码语言:javascript
复制
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,同时生成一个V1层。然后你移动到下一个水平水平。

代码语言:javascript
复制
o --eta--> o --eta--> o --eta--> o --eta--> o
|          |          |          |          | 
V          V          V          V          V
|          |          |          |          |
o --eta--> o --eta--> o --eta--> o --eta--> o 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60953818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档