Этот пример показов, как использовать функциональные производные в 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) == Ceqn3 =
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.
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')

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