Этот пример показывает, как использовать функциональные производные в 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
является плотностью на единицу длины, кинетическая энергия
Потенциальная энергия
где 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) =
Упростите уравнение с помощью simplify
. Преобразуйте уравнение в его ожидаемую форму путем заменения r/d
с квадратом скорости волны v
.
eqn = simplify(eqn)/r; eqn = subs(eqn,r/d,v^2)
eqn(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) =
tmp = children(eqn2);
Обе стороны уравнения зависят от различных переменных, все же равны. Это только возможно, если каждая сторона является константой. Приравняйте каждую сторону к произвольной постоянной C
, чтобы получить два дифференциальных уравнения.
syms C
eqn3 = tmp(1) == C
eqn3 =
eqn4 = tmp(2) == C
eqn4 =
Решите дифференциальные уравнения с помощью 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) =
U(x) = simplify(U(x),'Steps',50)
U(x) =
Получите константы в уравнениях.
p1 = setdiff(symvar(U(x)),sym([C,x]))
p1 =
p2 = setdiff(symvar(V(t)),sym([C,v,t]))
p2 =
Строка фиксируется в положениях 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 =
param =
cond =
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) =
Строка имеет различные режимы вибрации для различных значений 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')
Уравнение волны линейно. Это означает, что любая линейная комбинация позволенных режимов является допустимым решением уравнения волны. Следовательно, полное решение уравнения волны с данными граничными условиями и начальными значениями является суммой по позволенным режимам
где обозначает произвольные постоянные.
Используйте 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')
Данные показывают, что подведение итогов режимов позволяет вам моделировать качественно различную форму волны. Здесь, мы указали, что начальное условие \forall .
Можно вычислить значения в уравнении путем определения условия для начальной скорости
Соответствующее суммирование режимов может представлять любую форму волны, которая совпадает с использованием ряда Фурье, чтобы представлять движение строки.