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