我是Freefem++的新手,我想要解决的问题是费舍尔方程:
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);你能告诉我做错了什么吗?最后一项条款有问题。
发布于 2014-11-18 15:34:10
建立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-10-10 11:26:39
这是一个二维瞬态扩散/传导方程,具有温度相关的非线性生成项。
如果不考虑非线性生成项,方程应该看起来就像二维瞬态扩散/传导方程的弱形式。
freefem++如何线性化这个非线性项?你打算怎么处理?
当然,你会意识到,最后一个术语使解决方案变成了一种完全不同的动物。您必须在时间步骤内使用迭代来求解它(例如牛顿-拉夫森求解器)。
该算法是一种迭代非线性算法.您将不再为u求解;您将求解增量du并迭代直到收敛。
你把最后一项线性化如下:
d(k*u(1-u)) = k*du(1-u) - k*u*du = k*(1-2*u)*du ~ k*du你还有一个乘积u*du,它是非线性的。该怎么办呢?把它扔掉。
现在你正在为du解一个非线性瞬态方程。
https://stackoverflow.com/questions/26298004
复制相似问题