Freefem Fisher的等式

时间:2014-10-10 11:07:49

标签: pde freefem++

我是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);
你能说出我做错了吗?最后的条款出了点问题。

2 个答案:

答案 0 :(得分:0)

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

如果省略非线性生成项,则方程看起来应该与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的非线性瞬态方程。

答案 1 :(得分:0)

模拟Fisher方程的最简单方法是线性化非线性部分,使计算方法保持稳定。在我们的例子中,它意味着在离散公式中我们用u_ {i-1}(1 - u_i)(其中我是时间计数器)替换术语u_i(1 - u_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); 
}