Функциональный пример по производным

Этот пример показывает, как использовать функциональные производные в Symbolic Math Toolbox™ с помощью примера уравнения волны. Уравнение волны для строки, зафиксированной в ее концах, решено с помощью функциональных производных. Функциональная производная является производной функционального относительно функции, от которой зависит функциональное. Symbolic Math Toolbox™ реализует функциональные производные с помощью функции functionalDerivative.

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

Считайте строку длины L приостановленный между двумя точками x = 0 и x = L. Строка имеет характеристическую плотность на единицу длины и характеристическую силу. Задайте длину, плотность и силу как константы для дальнейшего использования. Для простоты, набор эти константы к 1.

Length = 1;
Density = 1;
Tension = 1;

Если строка находится в движении, кинетические и потенциальные энергии строки являются функцией ее смещения от отдыха S(x,t), который меняется в зависимости от положения x и время t. Если d является плотностью на единицу длины, кинетическая энергия

T=0Ld2(ddtS(x,t))2dx.

Потенциальная энергия

V=0Lr2(ddxS(x,t))2dx,

где r является силой.

Введите эти уравнения в MATLAB™. Поскольку длина должна быть положительной, установить это предположение. Это предположение позволяет simplify упрощать получившиеся уравнения в ожидаемую форму.

syms S(x,t) d r v L
assume(L>0)
T(x,t) = int(d/2*diff(S,t)^2,x,0,L);
V(x,t) = int(r/2*diff(S,x)^2,x,0,L);

Действием A является T-V. Принцип наименьшего действия утверждает, что действие всегда минимизируется. Определите условие для минимального действия, путем нахождения функциональной производной A относительно S с помощью functionalDerivative и приравняйте его, чтобы обнулить.

A = T-V;
eqn = functionalDerivative(A,S) == 0
eqn(x, t) = 

Lr2x2 S(x,t)-Ld2t2 S(x,t)=0

Упростите уравнение с помощью simplify. Преобразуйте уравнение в его ожидаемую форму путем заменения r/d с квадратом скорости волны v.

eqn = simplify(eqn)/r;
eqn = subs(eqn,r/d,v^2)
eqn(x, t) = 

2t2 S(x,t)v2=2x2 S(x,t)

Решите уравнение с помощью метода разделения переменных. Установите S(x,t) = U(x)*V(t) разделять зависимость от положения x и время t. Разделите обе стороны получившегося уравнения с помощью children.

syms U(x) V(t)
eqn2 = subs(eqn,S(x,t),U(x)*V(t));
eqn2 = eqn2/(U(x)*V(t))
eqn2(x, t) = 

2t2 V(t)v2V(t)=2x2 U(x)U(x)

tmp = children(eqn2);

Обе стороны уравнения зависят от различных переменных, все же равны. Это только возможно, если каждая сторона является константой. Приравняйте каждую сторону к произвольной постоянной C, чтобы получить два дифференциальных уравнения.

syms C
eqn3 = tmp(1) == C
eqn3 = 

2t2 V(t)v2V(t)=C

eqn4 = tmp(2) == C
eqn4 = 

2x2 U(x)U(x)=C

Решите дифференциальные уравнения с помощью dsolve с условием, что смещением является 0 в x = 0 и t = 0. Упростите уравнения до их ожидаемой формы с помощью simplify с набором опции Steps к 50.

V(t) = dsolve(eqn3,V(0)==0,t);
U(x) = dsolve(eqn4,U(0)==0,x);
V(t) = simplify(V(t),'Steps',50)
V(t) = -2C5sinh(Ctv)
U(x) = simplify(U(x),'Steps',50)
U(x) = 2C8sinh(Cx)

Получите константы в уравнениях.

p1 = setdiff(symvar(U(x)),sym([C,x]))
p1 = C8
p2 = setdiff(symvar(V(t)),sym([C,v,t]))
p2 = C5

Строка фиксируется в положениях x = 0 и x = L. Условие U(0) = 0 уже существует. Примените граничное условие, которое U(L) = 0 и решает для C.

eqn_bc = U(L) == 0;
[solC,param,cond] = solve(eqn_bc,C,'ReturnConditions',true)
solC = 

-k2π2L2

param = k
cond = C801kkZ
assume(cond)

Решение S(x,t) является продуктом U(x) и V(t). Найдите решение и замените характеристическими значениями строки в решение получить конечную форму решения.

S(x,t) = U(x)*V(t);
S = subs(S,C,solC);
S = subs(S,[L v],[Length sqrt(Tension/Density)]);

Параметры p1 и p2 определяют амплитуду колебаний. Установите p1 и p2 к 1 для простоты.

S = subs(S,[p1 p2],[1 1]);
S = simplify(S,'Steps',50)
S(x, t) = 4sin(πkt)sin(πkx)

Строка имеет различные режимы вибрации для различных значений k. Постройте первые четыре режима для произвольного значения времени t. Используйте аргумент param, возвращенный solve, чтобы обратиться к параметру k. До R2016a используйте ezplot вместо fplot.

Splot(x) = S(x,0.3);
figure(1)
hold on
grid on
ymin = double(coeffs(Splot));
for i = 1:4
    yplot = subs(Splot,param,i);
    fplot(yplot,[0 Length])
end
ylim([-ymin ymin])
legend('k = 1','k = 2','k = 3','k = 4','Location','best')
xlabel('Position (x)')
ylabel('Displacement (S)')
title('Modes of a string')

Уравнение волны линейно. Это означает, что любая линейная комбинация позволенных режимов является допустимым решением уравнения волны. Следовательно, полное решение уравнения волны с данными граничными условиями и начальными значениями является суммой по позволенным режимам

F(x,t)=k=nmAksin(πkt)sin(πkx),

где Ak обозначает произвольные постоянные.

Используйте symsum, чтобы суммировать первые пять режимов строки. На новой фигуре отобразите получившуюся форму волны в тот же момент времени как предыдущие формы волны для сравнения.

figure(2)
S5(x) = 1/5*symsum(S,param,1,5);
fplot(subs(S5,t,0.3),[0 Length])
ylim([-ymin ymin])
grid on
xlabel('Position (x)')
ylabel('Displacement (S)')
title('Summation of first 5 modes')

Данные показывают, что подведение итогов режимов позволяет вам моделировать качественно различную форму волны. Здесь, мы указали, что начальное условие S(x,t=0)=0 \forall x.

Можно вычислить значения Ak в уравнении F(x,t)=k=nmAksin(πkt)sin(πkx) путем определения условия для начальной скорости

ut(x,t=0)=Ft(x,0).

Соответствующее суммирование режимов может представлять любую форму волны, которая совпадает с использованием ряда Фурье, чтобы представлять движение строки.

Для просмотра документации необходимо авторизоваться на сайте