0

我是 Freefem++ 的新手,我要解决的问题是 Fisher 方程:

du/dt = d^2u/dx^2 + d^2u/dy^2 + k * u * (1-u)

du/dn = 0 - border condition

我试图以弱形式重新表述问题,但是 Freefem 显示公式错误:

problem Fisher(uh, vh) = int2d(Th)(uh * vh/dt + Grad(uh)' * Grad(vh) ) - int2d(Th)(k * uh * vh) + int2d(Th)(uh0 * vh/dt) - int2d(Th)(k * uh * vh * uh);

你能告诉我我做错了什么吗?最后条款有问题。

4

2 回答 2

0

这是一个二维瞬态扩散/传导方程,具有与温度相关的非线性生成项。

如果不考虑非线性生成项,方程应该看起来与 2D 瞬态扩散/传导方程的弱形式完全一样。

freefem++ 如何线性化该非线性项?你打算如何处理它?

当然,您意识到最后一项使解决方案成为一种非常不同的动物。您必须在时间步内使用迭代来解决它(例如 Newton-Raphson 求解器)。

该算法变成了一种迭代的、非线性的算法。你不再为你解决;您将求解增量 du 并迭代直到收敛。

你像这样线性化最后一个术语:

d(k*u(1-u)) = k*du(1-u) - k*u*du = k*(1-2*u)*du ~ k*du

你仍然有一个非线性的产品 u*du。该怎么办?把它扔掉。

现在您正在求解 的非线性瞬态方程du

于 2014-10-10T11:26:39.000 回答
0

对 Fisher 方程建模的最简单方法是将非线性部分线性化,以使计算方法保持稳定。在我们的例子中,这意味着在离散公式中,我们将术语 u_i(1 - u_i) 替换为 u_{i-1}(1 - u_i)(其中 i 是时间计数器),并仔细选择空间和时间步长。在这里,我提供了一个生成代码的示例:

verbosity=0.;
real Dx=.1,Dy=.1; 
mesh Th=square(floor(10./Dx),floor(10./Dy), [-5 + 10*x, -5 + 10*y]);
fespace Vh(Th,P1);
Vh uh, vh, uh0 = ((x)^2+(y)^2)<=1; 

real mu = 0.1, dt=0.01, Tf=10., k = 3.0;
macro Grad(u)[dx(u),dy(u)]//

problem KFisher(uh,vh) = int2d(Th)(uh*vh/dt + Grad(uh)'*Grad(vh)*mu) - int2d(Th)(uh0*vh/dt) + int2d(Th)(k*uh0*uh*vh) - int2d(Th)(k*vh*uh0);

for (real t=0.;t<Tf;t+=dt)  
{
  KFisher;
  uh0 = uh;
  plot(uh0, cmm="t="+t+"[sec]", dim=2, fill=true, value=true, wait=0); 
}
于 2014-11-18T15:34:10.247 回答