Уравнение на Freefem Fisher

Нов съм с 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);

Бихте ли казали какво правя грешно? Нещо не е наред с последните условия.


person Tatiana    schedule 10.10.2014    source източник


Отговори (2)


Най-лесният начин за моделиране на уравненията на Фишър е да се линеаризира нелинейната част, така че изчислителният метод да остане стабилен. В нашия случай това означава, че в дискретни формулировки заменяме термина 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); 
}
person Tatiana    schedule 18.11.2014

Това е 2D преходно уравнение на дифузия/проводимост със зависим от температурата, нелинеен генериращ член.

Ако оставите термина за нелинейно генериране, уравненията трябва да изглеждат точно като слабата форма за 2D преходното уравнение на дифузия/проводимост.

Как freefem++ линеаризира този нелинеен термин? Как смяташе да се справиш?

Вие осъзнавате, разбира се, че последният член прави решението много различно животно. Трябва да използвате итерация в рамките на времеви стъпки, за да го решите (напр. решаване на Нютон-Рафсън).

Алгоритъмът става итеративен, нелинеен. Повече няма да решавате вместо вас; ще решите за увеличение du и ще повторите до конвергенция.

Вие линеаризирате последния член по следния начин:

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

Все още имате продукт u*du, който е нелинеен. Какво да правя? Хвърли го.

Сега решавате нелинейно преходно уравнение за du.

person duffymo    schedule 10.10.2014
comment
Благодаря Ви за отговора! Все още обаче не разбирам дали е възможно да се комбинира методът на Freefem с метода на Newton. Бихте ли уточнили алгоритмичната схема? - person Tatiana; 15.10.2014
comment
Не, това не е разумно искане. Не можете да решавате нелинейни проблеми с линейни методи. Това е голяма тема. Върнете се към вашата документация. - person duffymo; 15.10.2014