Вибрация круговой мембраны

Этот пример показывает, как вычислить режимы вибрации круговой мембраны.

Вычисление режимов вибрации требует решения собственного значения дифференциального уравнения с частными производными. Этот пример сравнивает решения, полученные при использовании solvepdeeig решатель из дифференциальных Toolbox™ с частными производными и eigs решатель от MATLAB ®. Собственные значения, рассчитанные по solvepdeeig и eigs практически идентичны, но в некоторых случаях один решатель удобнее другого. Для примера, eigs более удобно при вычислении заданного количества собственных значений в окрестности определенного целевого значения. Пока solvepdeeig требует, чтобы нижняя и верхняя границы окружали эту цель, eigs требует только целевое собственное значение и желаемое количество собственных значений.

Создайте модель УЧП.

model = createpde;

Создайте геометрию круга и включите ее в модель.

radius = 2;
g = decsg([1 0 0 radius]','C1',('C1')');

geometryFromEdges(model,g);

Постройте график геометрии с метками ребер.

figure
pdegplot(model,'EdgeLabels','on')
axis equal
title 'Geometry with Edge Labels'

Figure contains an axes. The axes with title Geometry with Edge Labels contains 5 objects of type line, text.

Задайте коэффициенты.

c = 1e2;
a = 0;
f = 0;
d = 10;
specifyCoefficients(model,'m',0,'d',d,'c',c,'a',a,'f',f);

Задайте, что решение равняется нулю на всех четырех внешних краях окружности.

bOuter = applyBoundaryCondition(model,'dirichlet','Edge',(1:4),'u',0);

Сгенерируйте mesh.

generateMesh(model,'Hmax',0.2);

Использование assembleFEMatrices вычислить глобальные матрицы массы и жесткости конечного элемента с граничными условиями, накладываемыми с помощью подхода nullspace.

FEMatrices = assembleFEMatrices(model,'nullspace');
K = FEMatrices.Kc;
B = FEMatrices.B;
M = FEMatrices.M;

Решите задачу собственного значения с помощью eigs функция.

sigma = 1e2; 
numberEigenvalues = 5;
[eigenvectorsEigs,eigenvaluesEigs] = eigs(K,M,numberEigenvalues,sigma);

Измените форму диагонального eigenvaluesEigs матрица в вектор.

eigenvaluesEigs = diag(eigenvaluesEigs);

Найдите самое большое собственное значение и его индекс в векторе собственных значений.

[maxEigenvaluesEigs,maxIndex] = max(eigenvaluesEigs);

Добавьте значения ограничений, чтобы получить полный собственный вектор.

eigenvectorsEigs = B*eigenvectorsEigs;

Теперь решите ту же задачу собственного значения, используя solvepdeeig. Установите область значений для solvepdeeig быть немного больше, чем область значений от eigs.

r = [min(eigenvaluesEigs)*0.99 max(eigenvaluesEigs)*1.01];
result = solvepdeeig(model,r);
              Basis= 10,  Time=   0.17,  New conv eig=  0
              Basis= 13,  Time=   0.19,  New conv eig=  2
              Basis= 16,  Time=   0.21,  New conv eig=  2
              Basis= 19,  Time=   0.22,  New conv eig=  2
              Basis= 22,  Time=   0.24,  New conv eig=  3
              Basis= 25,  Time=   0.26,  New conv eig=  3
              Basis= 28,  Time=   0.29,  New conv eig=  5
End of sweep: Basis= 28,  Time=   0.30,  New conv eig=  5
              Basis= 15,  Time=   0.35,  New conv eig=  0
End of sweep: Basis= 15,  Time=   0.35,  New conv eig=  0
eigenvectorsPde = result.Eigenvectors;
eigenvaluesPde = result.Eigenvalues;

Сравните решения.

eigenValueDiff = sort(eigenvaluesPde) - sort(eigenvaluesEigs);
fprintf('Maximum difference in eigenvalues from solvepdeeig and eigs: %e\n', ...
  norm(eigenValueDiff,inf));
Maximum difference in eigenvalues from solvepdeeig and eigs: 4.121148e-13

Обе функции вычисляют одинаковые собственные значения. Для любого собственного значения можно умножить собственный вектор на произвольный скаляр. The eigs и solvepdeeig функции могут выбрать другой произвольный скаляр для нормализации своих собственных векторов.

h = figure;
h.Position = [1 1 2 1].*h.Position;
subplot(1,2,1)
axis equal
pdeplot(model,'XYData', eigenvectorsEigs(:,maxIndex),'Contour','on')
title(sprintf('eigs eigenvector, eigenvalue: %12.4e', eigenvaluesEigs(maxIndex)))
xlabel('x')
ylabel('y')
subplot(1,2,2)
axis equal
pdeplot(model,'XYData',eigenvectorsPde(:,end),'Contour','on')
title(sprintf('solvepdeeig eigenvector, eigenvalue: %12.4e',eigenvaluesPde(end)))
xlabel('x')
ylabel('y')

Figure contains 2 axes. Axes 1 with title eigs eigenvector, eigenvalue: 1.2307e+02 contains 12 objects of type patch, line. Axes 2 with title solvepdeeig eigenvector, eigenvalue: 1.2307e+02 contains 12 objects of type patch, line.

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