-
Примеры выполнения заданий
-
Пример 1a
-
Найти экстремаль функционала
(1.0)
Исследовать полученную экстремаль на достаточные условия экстремума. Построить график решения.
В этом примере подынтегральная функция F(x,y,y) является функцией общего вида, поэтому составим уравнение Эйлера в виде (1.5) и решим его. Затем построим график решения. Попутно исследуем на выполнение достаточных условия экстремума.
Применим для решения задачи систему программирования MATLAB. Рекомендуется после написания каждой группы команд запустить её и посмотреть результаты.
Вначале очистим память от решавшихся ранее задач. Зададим формат отображения действительных чисел с 14 знаками. Напечатаем заголовок решаемой задачи. Зададим число точек для построения графика. Опишем символические переменные.
clear all % очищаем память
format long % формат отображения чисел с 14 знаками
disp('Решаем пример 1a') % выводим заголовок задачи
syms x y Dy D2y % описали символические переменные
Решаем пример 1a
Уравнение Эйлера является дифференциальным уравнением второго порядка. Для его решения используем принятые в MATLAB обозначения производных: Dy для y и D2y для y. Вводим подынтегральную функцию и граничные условия. Здесь Вы должны поставить свои исходные данные.
F=x^2+y^2+Dy^2; % вводим подынтегральную функцию
x1=-1; % вводим граничные условия
y1=1;
x2=1;
y2=2;
fprintf('Подынтегральная функция: F=%s\n',char(F))
fprintf('Граничные условия: y(%d)=%d; y(%d)=%d\n',x1,y1,x2,y2)
Подынтегральная функция: F=x^2+y^2+Dy^2
Граничные условия: y(-1)=1; y(1)=2
Подынтегральная функция F – символическое выражение, граничные условия x1, y1, x2 и y2 – действительные переменные. Найдём частные производные Fy и Fy.
dFdy=diff(F,y) % вычисляем Fy
dFdy1=diff(F,Dy) % вычисляем Fy'
dFdy =
2*y
dFdy1 =
2*Dy
В уравнение Эйлера входит полная производная dFydx. Вычисляем её по формуле
. (1.0)
Вычислим частные производные Fyx, Fyy и Fyy, а затем найдём полную производную dFydx по (1.7).
d_dFdy1_dx = diff(dFdy1,x) % (Fy')/x
d_dFdy1_dy=diff(dFdy1,y) % (Fy')/y
d_dFdy1_dy1 = diff(dFdy1,Dy) % (Fy')/y'=Fy'y' - условие Лежандра
dFy1dx = d_dFdy1_dx + d_dFdy1_dy*Dy + d_dFdy1_dy1*D2y % d(Fy')/dx
d_dFdy1_dx =
0
d_dFdy1_dy =
0
d_dFdy1_dy1 =
2
dFy1dx =
2*D2y
Составим левую часть дифференциального уравнения Эйлера и упростим её. Для решения дифференциального уравнения нужно представить его в виде строковой переменной. Преобразуем символическую переменную Euler в строку и добавим в конце равенство нулю.
Euler = simple(dFdy-dFy1dx) % левая часть уравнения Эйлера
deqEuler = [ char(Euler) '=0' ]; % составили уравнение
fprintf('Уравнение Эйлера: %s\n',deqEuler)
Euler =
2*y-2*D2y
Уравнение Эйлера: 2*y-2*D2y=0
Команда dsolve позволяет находить как общее решение дифференциального уравнения, так и частное его решение, удовлетворяющее заданным начальным или граничным условиям. В следующих главах при решении других примеров нам нужно будет иметь общее решение уравнения Эйлера. Поэтому найдём вначале общее решение, а потом подставим в него граничные условия. Решаем уравнение Эйлера и проверяем, является ли решение единственным. Если нет, прекращаем работу программы.
Sol = dsolve(deqEuler,'x') % решаем уравнение Эйлера
if length(Sol)~=1 % решений нет или более одного
error('Нет решений или более одного решения!');
end
Sol =
(C1*exp(x)^2+C2)/exp(x)
Программа будет работать дальше, если решение существует и единственное. Сформируем теперь уравнения для граничных условий. Подставим в найденное аналитическое решение Sol граничные точки x1 и x2, преобразованные в символические переменные. Затем преобразуем эти символические выражения в строки, и приравняем их соответственно y1 и y2.
SolLeft = subs(Sol,x,sym(x1)); % подставляем x1
SolRight = subs(Sol,x,sym(x2)); % подставляем x2
EqLeft = [char(SolLeft) '=' char(sym(y1))] % приравняли y1
EqRight = [char(SolRight) '=' char(sym(y2))] % приравняли y2
EqLeft =
(C1*exp(-1)^2+C2)/exp(-1)=1
EqRight =
(C1*exp(1)^2+C2)/exp(1)=2
Решаем полученную систему уравнений – находим значения произвольных постоянных C1 и C2. Подставим найденные константы в аналитическое решение Sol. Ограничим полученное решение 14 знаками – этого вполне достаточно для построения графика решения.
Con = solve(EqLeft,EqRight); % решаем систему уравнений
C1=Con.C1 % присваиваем полученные решения
C2=Con.C2 % символическим константам C1 и C2
Sol1a = vpa(eval(Sol),14); % подставляем C1, C2, вычисляем с 14 знаками
fprintf('Уравнение экстремали:\n%s\n',char(Sol1a))
C1 =
(-2*exp(1)+exp(-1))/(exp(-1)^2-exp(1)^2)
C2 =
exp(1)*exp(-1)*(-exp(1)+2*exp(-1))/(exp(-1)^2-exp(1)^2)
Уравнение экстремали:
(.69877023730776*exp(x)^2+.27331117318808)/exp(x)
Зададим массив аргументов для рисования графика функции и вычислим значения функции. Нарисуем график, подпишем заголовок и координатные оси.
xpl = linspace(x1,x2); % задаём массив абсцисс
y1a = subs(Sol1a,x,xpl); % вычислили ординаты
plot ( xpl, y1a, '-r' ) % рисуем график
title ( '\bfExample 1a' ) % заголовок
