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

> restart; interface(displayprecision = 5):

> F:=proc(Y, m,h)

  (Y[m+1]-Y[m])^2/h^2+Y[m]^2+2*X[m]*Y[m]

  end proc;

Интеграл заменяем суммой по формуле прямоугольников

> S1:=proc(h, F,N) options operator, arrow;

  h*(sum(F(Y, i,h),i = 0 .. N-1))

  end proc;

Задаем пределы интегрирования:

> a := 0; b := 1;

Выбираем число узловых точек и определяем шаг интегрирования:

> N:=10: h:=(b-a)/N;

Вычисляем абсциссы вершин ломаной

> for j from 0 to N do X[j] := a+j*h end do:

Функционал как функция ординат вершин ломаной:

> Phi:=S1(h, F,N);

Учет граничных условий:

> Y[0]:=0; Y[N]:=0; Phi;

Составляем минимизирующую систему уравнений:

> for k to N-1 do

  eq[k]:=evalf(diff(Phi, Y[k]))=0

  end do:

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

  for k to N-1 do

  var:=`union`(var,{Y[k]}):

  eqns := `union`(eqns, {eq[k]}):

  end do:

  nops(var); nops(eqns);

Решаем систему:

> res:=solve(eqns, var);assign(res):

Сформируем список точек вершин ломаной:

> for j from 0 to N do P[j]:=[X[j],Y[j]] end do:

  L:=[seq(P[k-1],k = 1 .. N+1)]:

Построим график решения:

> plot(L, x=0..1,title=cat("Число узлов N =  ",

  convert(N, string)),titlefont=[roman,15],

  labelfont[Helvetica, roman,14],

  legend=["метод Эйлера"],gridlines=true);

Для сравнения найдем точное решение задачи.

НЕ нашли? Не то? Что вы ищете?

> with(VariationalCalculus):

> f:=(diff(y(x),x))^2+y(x)^2+2*x*y(x);

> ode:=EulerLagrange(f, x,y(x));

> problem := `union`(ode, {y(0) = 0, y(1) = 0});

> dsolve(problem, y(x));

> simplify(convert(%, trig));

> y := unapply(rhs(%), x);

Построим графики приближенного и точного решений:

> plot([L, y(x)],x=0..1,

  title=cat("Число узлов N =  ",

  convert(N, string)),titlefont=[roman,15],

  style=[point, line],labelfont[Helvetica, roman,14],

  legend=["метод Эйлера","Точное решение"],

  gridlines=true);

Пример 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.

Пример 4. Уравнение Эйлера для двойного интеграла.

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

.

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

> F:=proc(x, y,u, ux, uy) options operator, arrow;

  ux^2+uy^2+2*y*u*cos(x)

  end proc;

Уравнение Эйлера в этих обозначениях имеет вид:

.

Вычисляем последовательно производные в этом уравнении

> a1:=diff(F(x, y,u, ux, uy),u);

  a2:=diff(F(x, y,u, ux, uy),ux);

  a3:=diff(F(x, y,u, ux, uy),uy);

Составляем уравнение Эйлера для функционала

> EulerEq:=a1-(diff(subs(ux=diff(u(x, y),x),a2),x))-

  (diff(subs(uy=diff(u(x, y),y),a3),y))=0;

Таким образом, получили следующее уравнение

> pde:=-(1/2)*op(2,lhs(EulerEq))-

  (1/2)*op(3,lhs(EulerEq))=(1/2)*op(1,lhs(EulerEq));

Сформируем теперь граничные условия. Для этого определим граничную функцию

> f:=proc(x, y) options operator, arrow;

  (1/10)*x+(1/50)*y^2

  end proc;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10