- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 Matlab 函数 Pdepe ( https://www.mathworks.com/help/matlab/ref/pdepe.html ) 求解平流扩散 react 问题的一维耦合偏微分方程。与扩散项相比,在平流项较高的情况下,此函数无法正常工作。因此,我搜索并找到了使用Python库FiPy来解决我的偏微分方程系统的选项。我的初始条件是 u1=1 for 4*L/10
我的耦合方程具有以下形式:
du1/dt = d/dx(D1 * du1/dx) + g * x * du1/dx - mu1 * u1/(K + u1) * u2
du2/dt = d/dx(D2 * du2/dx) + g * x * du2/dx + mu2 * u1/(K + u1) * u2
我尝试通过结合 FiPy 示例(examples.convection.exponential1DSource.mesh1D、examples.levelSet.advection.mesh1D、examples.cahnHilliard.mesh2DCoupled)来编写它。
以下几行不是一个有效的示例,而是我第一次尝试编写代码。这是我第一次使用 FiPy(在文档的测试和示例之外),因此对于普通用户来说,这似乎完全没有捕获要点。
from fipy import *
g = 0.66
L = 10.
nx = 1000
mu1 = 1.
mu2 = 1.
K = 1.
D1 = 1.
D2 = 1.
mesh = Grid1D(dx=L / 1000, nx=nx)
x = mesh.cellCenters[0]
convCoeff = g*(x-L/2)
u10 = 4*L/10 < x < 6*L/10
u20 = 1.
u1 = CellVariable(name="u1", mesh=mesh, value=u10)
u2 = CellVariable(name="u2", mesh=mesh, value=u20)
## Neumann boundary conditions
u1.faceGrad.constrain(0., where=mesh.facesLeft)
u1.faceGrad.constrain(0., where=mesh.facesRight)
u2.faceGrad.constrain(0., where=mesh.facesLeft)
u2.faceGrad.constrain(0., where=mesh.facesRight)
sourceCoeff1 = -1*mu1*u1/(K+u1)*u2
sourceCoeff2 = 1*mu2*u1/(K+u1)*u2
eq11 = (TransientTerm(var=u1) == DiffusionTerm(coeff=D1, var=u1) + ConvectionTerm(coeff=convCoeff))
eq21 = (TransientTerm(var=u2) == DiffusionTerm(coeff=D2, var=u2) + ConvectionTerm(coeff=convCoeff))
eq12 = ImplicitSourceTerm(coeff=sourceCoeff1, var=u1)
eq22 = ImplicitSourceTerm(coeff=sourceCoeff2, var=u2)
eq1 = eq11 & eq12
eq2 = eq21 & eq22
eqn = eq1 & eq2
vi = Viewer((u1, u2))
for t in range(100):
u1.updateOld()
u2.updateOld()
eqn.solve(dt=1.e-3)
vi.plot()
感谢您的任何建议或指正。如果您碰巧知道针对此类特定问题的好教程,我会很乐意阅读它,因为我没有找到比 FiPy 文档中的示例更好的内容。
最佳答案
几个问题:
u10 = (4*L/10 < x) & (x < 6*L/10)
此外,这使得 u10
成为 bool 值字段,这使 FiPy 感到困惑,因此写 u10 = ((4*L/10 < x) & (x < 6*L/10)) * 1.
或者,更好的是,写 u1 = CellVariable(name="u1", mesh=mesh, value=0., hasOld=True)
u2 = CellVariable(name="u2", mesh=mesh, value=1., hasOld=True)
u1.setValue(1., where=(4*L/10 < x) & (x < 6*L/10))
ConvectionTerm
采用矢量系数。获得这个的一种方法是 convCoeff = g*(x-L/2) * [[1.]]
代表一维 1 级变量Term
适用于哪个 Variable
,则必须对所有 Term
执行此操作,因此请编写,例如: ConvectionTerm(coeff=convCoeff, var=u1)
ConvectionTerm(coeff=g*x, var=u1)
不代表 g * x * du1/dx。它表示 d(g * x * u1)/dx。所以,我相信你会想要 ConvectionTerm(coeff=convCoeff, var=u1) - ImplicitSourceTerm(coeff=g, var=u1)
ImplicitSourceTerm(coeff=sourceCoeff1, var=u1
不代表-1*mu1*u1/(K+u1)*u2
,而是代表-1*mu1*u1/(K+u1)*u2*u1
。因此,为了获得方程之间的最佳耦合,请编写
sourceCoeff1 = -mu1*u1/(K+u1)
sourceCoeff2 = mu2*u2/(K+u1)
... ImplicitSourceTerm(coeff=sourceCoeff1, var=u2) ...
... ImplicitSourceTerm(coeff=sourceCoeff2, var=u1) ...
正如 @wd15 在评论中所指出的,您正在为两个未知数声明四个方程。 &
并不表示“将两个方程相加”(可以使用 +
完成),而是表示“同时求解这两个方程”。所以,写一下
sourceCoeff1 = mu1*u1/(K+u1)
sourceCoeff2 = mu2*u2/(K+u1)
eq1 = (TransientTerm(var=u1)
== DiffusionTerm(coeff=D1, var=u1)
+ ConvectionTerm(coeff=convCoeff, var=u1)
- ImplicitSourceTerm(coeff=g, var=u1)
- ImplicitSourceTerm(coeff=sourceCoeff1, var=u2))
eq2 = (TransientTerm(var=u2)
== DiffusionTerm(coeff=D2, var=u2)
+ ConvectionTerm(coeff=convCoeff, var=u2)
- ImplicitSourceTerm(coeff=g, var=u2)
+ ImplicitSourceTerm(coeff=sourceCoeff2, var=u1))
eqn = eq1 & eq2
hasOld=True
声明 CellVariable
才能调用 updateOld()
,因此 u1 = CellVariable(name="u1", mesh=mesh, value=u10, hasOld=True)
u2 = CellVariable(name="u2", mesh=mesh, value=u20, hasOld=True)
似乎有效的完整代码是 here
关于python - 如何将平流扩散 react 偏微分方程与 FiPy 耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977269/
我是 fipy 的新手,所以如果这是一个愚蠢的问题,我深表歉意(并且 this 似乎对我没有帮助)。但是,除了上面问题中建议的之外,还有其他方法可以以人类可读(或 python 可读)的形式存储 fi
我是 FiPy 的新手,我正在求解 3D 体积内电势的泊松方程。它对于表面边界条件工作得很好,但现在我需要在里面放置一个导体。这将是一个恒定的势表面,我意识到您不能将势能.constrain 用于内表
在 Mac(OS X 10.10.2 和 Python 2.7.6)上全新安装 FiPy 后,我尝试了文档中的一些示例,但它们没有用。因此,我使用内置测试例程(从 python shell 键入“fi
我正在尝试在 Python 中使用 FiPy 求解一些微分方程,作为新手,我仍然遇到一些问题。我所做的如下:定义一个单元变量,求解该变量的方程并更新它。我想在每次迭代后存储它的值。这是一个例子: a
我正在使用 fipy 对线性化的 Poisson-Boltzmann equation 建模, 这本质上是 我假设我可以将 f(x) 建模为边界条件。如果 epsilon(x) 是常量,fipy 可以
当我意识到命令 sweep 没有按照我想象的方式工作时,我试图使用 FiPy 来求解一组偏微分方程。这是包含我的部分代码的示例: from pylab import * import sys from
我正在尝试用 Python 求解偏微分方程组,使用 Fipy .我有一个至少包含 3 个 PDE 的系统。 我想知道哪种方法最适合解决此类系统? Fipy 同时支持 coupled and uncou
我正在尝试求解在给定域内几何变化的两个自变量。我想在单个查看器显示中绘制它们的方差。如何获得两个不同的等高线图,每个用于单个查看器框中的自变量?我对双轮廓使用了以下代码,但无法为两个变量(在我的例子中
我正在寻找使用 FiPy 求解扩散方程并阅读了他们的一些文档,但似乎找不到任何与编写包含作为自变量函数的附加项的扩散项相关的内容(即空间).我找到的最接近的东西是 FAQ ,他们建议将附加项重写为 C
我已经尝试了几个小时来安装 FiPy我已经安装了 Pip 和许多其他东西来让它工作。 Pip 成功安装了许多我需要的东西,但我无法让它为 PySparse 或 FiPy 工作。为什么我尝试安装 PyS
是否可以连接两个(或更多)网格?示例: import fipy meshA = fipy.Grid2D(nx=5, ny=3) meshB = fipy.Grid2D(nx=5, ny=6) mesh
我最近通过 MacPorts 将 FiPy 包及其所有依赖项安装到我的 Macbook 上。我可以轻松地将 FiPy 和 NumPy 作为 Python 中的包进行调用。 现在我已经可以使用它了,我想
我正在尝试在深度 ( h(t) ) 随时间变化的域上求解简单的扩散方程 (dT/dt = K d2T/dx2 )。因此,所得方程为: dT/dt = K/h^2 d2T/dx2 + z/h dh/dt
我尝试使用 Matlab 函数 Pdepe ( https://www.mathworks.com/help/matlab/ref/pdepe.html ) 求解平流扩散 react 问题的一维耦合偏
我想知道如何在 Fipy 中将 Dirac delta 函数表示为源项。我想解下面的方程 我尝试过以下代码 from fipy import * nx = 50 ny = 1 dx = dy = 0.
我正在尝试使用 FiPy 求解复杂的 PDE。 FiPY 似乎不支持复杂参数,一般建议似乎是拆分 PDE,分别求解然后重新组合。现在还是这样吗? 其次,我看不出有什么方法可以设置非常量初始条件。假设我
如何在不限制面内通量分量的情况下,将 fipy 网格中边界面的法向通量明确设置为特定值? Neumann 边界条件可以指定为:(1) 固定的垂直于边界面的通量分量,或 (2) 作为面处通量的完整规范。
我正在尝试使用 FiPy 解决非线性 PDE HJB 方程,但是我在将 PDE 转换为正确的 FiPy 语法时遇到了一些困难: 我试过类似的东西: eqX = TransientTerm() == -
我已经生成了一个 gmsh 网格,并通过 Gmsh2D 导入到 FiPy 中。我想解决表面问题以设置边界条件,但我不知道如何操作。 在我在文档中发现的 FiPy 示例中,建议命名某些行以便稍后处理它们
我在 3D 网格上有一个变量,我正在尝试切割一个平面图。我很惊讶以前没有人问过这个问题,它看起来是一个简单而常见的问题,但我还没有找到任何好的方法。如果有任何建议,我将不胜感激。 假设我有一个 3x3
我是一名优秀的程序员,十分优秀!