Пример 3. Метод Ритца для двойного интеграла

Используя метод Ритца, найти экстремали функционала

Исследовать сходимость. Построить графики.

Решение. Будем решать задачу в среде Maple. Выбираем базисные функции и определяем аппроксимирующую функцию:

> restart;

> phi0:=(x,y)->x/10+y^2/50;

> phi:=(x,y,i,j)->

sin(i*Pi*(x-x1)/(x2-x1))*sin(j*Pi*(y-y1)/(y2-y1));

> U:=proc(x,y,M,N)option operator,arrow;

local n,m;

phi0(x,y)+

sum(sum(a[m,n]*phi(x,y,m,n),'m'=1..M),'n'=1..N);

end proc;

Здесь также удобно разработать процедуру для автоматического составления и решения уравнений метода Ритца. Например, такую

> Ritz:=proc(F,M,N,a)local Fu,eqns,var,eq,i,j,res;

Fu:=simplify(int(int(F,x=0..1),y=0..2));

eqns:={}:var:={}:

for i from 1 to M do

for j from 1 to N do

    var:=var union {a[i,j]}:

    eq[i,j]:=diff(Fu,a[i,j])=0:

    eqns:=eqns union {eq[i,j]}:

od:

od:

res:=solve(eqns,var);

assign(res);

end proc:

Вводим теперь граничные точки

> x1:=0;x2:=1;y1:=0;y2:=2;

Определяем подынтегральную функцию

> F:=diff(u(x,y),x)^2-2*diff(u(x,y),y)^2+

  2*y*u(x,y)*(sin(Pi*x)+x/5);

Задаемся числом аппроксимирующих функций и решаем задачу

> M:=2:N:=2:a:=array(1..M,1..N):

> F2:=subs(u(x,y)=U(x,y,M,N),F):Ritz(F2,M,N,a):

Посмотрим результат на графике

> p||M:=

> plot(U(0.5,y,M,N),y=0..2,color=black,linestyle=4,

legend=cat(`M=N=`,convert(M,string))):

plots[display]({p2});

Увеличим на единицу (по каждой переменной) число слагаемых в аппроксимации и повторим расчет

> M:=3:N:=3:a:=array(1..M,1..N):

> F3:=subs(u(x,y)=U(x,y,M,N),F):Ritz(F3,M,N,a):

> p||M:=

plot(U(0.5,y,M,N),y=0..2,color=black,linestyle=1,

legend=cat(`M=N=`,convert( > M,string))):

> plots[display]({p2,p3});

> M:=4;N:=4;a:=array(1..M,1..N):

> F4:=subs(u(x,y)=U(x,y,M,N),F):Ritz(F4,M,N,a);

> p||M:=

plot(U(0.5,y,M,N),y=0..2,color=black,linestyle=3,

legend=cat(`M=N=`,convert(M,string))):

> plots[display]({p2,p3,p4});

Видим, что приближенные решения хорошо сходятся, и можно ограничиться значениями M = N = 4.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: