Собственные значения оператора Laplace

Этот пример показов, как решить собственное значение задачу оператора Laplace на L-образной области.

Мембранная задача

Рассмотрим мембрану, которая зафиксирована на контуре Ω области Ω в плоскости. Его перемещение u(x,y) описывается задачей собственного значения Δu=λu, где Δu=uxx+uyy является оператором Laplace и λ является скалярным параметром. Граничное условие u(x,y)=0 для всех (x,y)Ω.

Оператор Лапласа самосопряжен и отрицательно определен, то есть только действительные отрицательные собственные значения λ существует. Существует максимальное (отрицательное) дискретное собственное значение, соответствующая собственная функция u называется основным состоянием. В этом примере, Ω является L-образной областью, и основное состояние, сопоставленное с этой областью, является L-образной мембраной, которая является логотипом MATLAB ®.

Девятиточечное приближение конечного различия

Самый простой подход к задаче собственных значений состоит в том, чтобы аппроксимировать лапласиан Δu конечным различием приближения (трафарет) на квадратной сетке точек с расстояниями hx в x направление и расстояния hy в y направление. В этом примере аппроксимируйте Δu с суммой S_h из девяти правильных точек сетки вокруг средней точки (x,y). Неизвестные - это веса a-1-1,,a11.

syms u(x,y) Eps a11 a10 a1_1 a01 a00 a0_1 a_11 a_10 a_1_1
syms hx hy positive
S_h = a_11 * u(x - Eps*hx,y + Eps*hy) +...
      a01  * u(x,y + Eps*hy) +...
      a11  * u(x + Eps*hx,y + Eps*hy) +... 
      a_10 * u(x - Eps*hx,y) +... 
      a00  * u(x,y) +... 
      a10  * u(x + Eps*hx,y) +...
      a_1_1* u(x - Eps*hx,y - Eps*hy) +...
      a0_1 * u(x,y - Eps*hy) +...
      a1_1 * u(x + Eps*hx,y - Eps*hy);

Используйте символьный параметр Eps чтобы отсортировать расширение этого выражения по степеням hx и hy. Зная веса, можно аппроксимировать лапласиан, задав Eps = 1.

t = taylor(S_h, Eps, 'Order', 7);

Используйте coeffs функция для извлечения их коэффициентов членов с одинаковыми степенями Eps. Каждый коэффициент является выражением, содержащим степени hx, hy, и производные u по отношению к x и y. Начиная с S_h представляет uxx+uyy, коэффициенты всех других производных u должно быть нулем. Извлечь коэффициенты путем замены всех производных u, кроме uxx и uyy, по 0. Заменить uxx и uyy по 1. Это уменьшает разложение Тейлора до коэффициента, который вы хотите вычислить, и приводит к следующим шести линейным уравнениям.

C = formula(coeffs(t, Eps, 'All'));
eq0  = subs(C(7),u(x,y),1) == 0;
eq11 = subs(C(6),[diff(u,x),diff(u,y)],[1,0]) == 0;
eq12 = subs(C(6),[diff(u,x),diff(u,y)],[0,1]) == 0;
eq21 = subs(C(5),[diff(u,x,x),diff(u,x,y),diff(u,y,y)],[1,0,0]) == 1;
eq22 = subs(C(5),[diff(u,x,x),diff(u,x,y),diff(u,y,y)],[0,1,0]) == 0;
eq23 = subs(C(5),[diff(u,x,x),diff(u,x,y),diff(u,y,y)],[0,0,1]) == 1;

Поскольку в S_h девять неизвестных весов, добавить дополнительные уравнения путем требования, чтобы все производные третьего порядка u 0.

eq31 = subs(C(4),[diff(u,x,x,x),diff(u,x,x,y),diff(u,x,y,y),diff(u,y,y,y)], [1,0,0,0]) == 0;
eq32 = subs(C(4),[diff(u,x,x,x),diff(u,x,x,y),diff(u,x,y,y),diff(u,y,y,y)], [0,1,0,0]) == 0;
eq33 = subs(C(4),[diff(u,x,x,x),diff(u,x,x,y),diff(u,x,y,y),diff(u,y,y,y)], [0,0,1,0]) == 0;
eq34 = subs(C(4),[diff(u,x,x,x),diff(u,x,x,y),diff(u,x,y,y),diff(u,y,y,y)], [0,0,0,1]) == 0;

Решить получившиеся десять уравнений для девяти неизвестных весов. Использование ReturnConditions найти все решения, включая произвольные параметры.

[a11,a10,a1_1,a01,a00,a0_1,a_11,a_10,a_1_1,parameters,conditions] = ...
    solve([eq0,eq11,eq12,eq21,eq22,eq23,eq31,eq32,eq33,eq34], ...
          [a11,a10,a1_1,a01,a00,a0_1,a_11,a_10,a_1_1], ...
          'ReturnConditions',true);

expand([a_11,a01,a11;...
        a_10,a00,a01;...
        a1_1,a0_1,a_1_1])
ans = 

(z1hy2-2zz1hx2-2z4z-2hx2-2hy21hy2-2zz1hy2-2zz)[z, 1/hy ^ 2 - 2 * z, z; 1/hx ^ 2 - 2 * z, 4 * z - 2/hx ^ 2 - 2/hy ^ 2, 1/hy ^ 2 - 2 * z; z, 1/hy ^ 2 - 2 * z, z]

parameters
parameters = zz

Используйте subs функция для замены весов их вычисленными значениями.

C = simplify(subs(C));

Выражения C(7), C(6), и C(4) содержащие 0-е, 1-е и 3-е производные u исчезнуть.

[C(7), C(6), C(4)]
ans = (000)[sym (0), sym (0), sym (0)]

Выражение C(5) - лапласиан u.

C(5)
ans = 

2x2 u(x,y)+2y2 u(x,y)diff (u (x, y), x, 2) + diff (u (x, y), y, 2)

Таким образом, с значениями весов, вычисленными выше, трафарет S_h аппроксимирует лапласиан до порядка hx^2, hy^2 для любых значений произвольного параметра z, при условии, что z выбран таким образом, чтобы иметь порядок <reservedrangesplaceholder0>.

Термины, содержащие производные четвертого и высшего порядков

Хотя решение содержит свободный параметр z, выражение C(3) содержащие производные четвертого порядка u невозможно превратить в нуль подходящим выбором z. Другая опция - превратить его в произведение квадрата оператора Laplace.

syms d
Laplace = @(u) laplacian(u,[x,y]);
expand(d*Laplace(Laplace(u)))
ans(x, y) = 

d4x4 u(x,y)+2d2y2 2x2 u(x,y)+d4y4 u(x,y)d * diff (u (x, y), x, 4) + 2 * d * diff (diff (u (x, y), x, 2), y, 2) + d * diff (u (x, y), y, 4)

Выберите различные производные u в C(3), и приравнять их коэффициенты к соответствующим терминам.

subs(C(3),[diff(u,x,x,x,x),diff(u,x,x,y,y),diff(u,y,y,y,y)],[1,0,0]) == d
ans = 

hx212=dhx ^ 2/12 = = d

subs(C(3),[diff(u,x,x,x,x),diff(u,x,x,y,y),diff(u,y,y,y,y)],[0,1,0]) == 2*d
ans = hx2hy2z=2dhx ^ 2 * hy ^ 2 * z = = 2 * d
subs(C(3),[diff(u,x,x,x,x),diff(u,x,x,y,y),diff(u,y,y,y,y)],[0,0,1]) == d
ans = 

hy212=dhy ^ 2/12 = = d

Поэтому можно выбрать d = hx^2/12 = hy^2/12 и z = 2*d/(hx^2*hy^2), подразумевая, что hx = hy и z = 1/(6*hx*hy). Отсюда и трафарет S_h аппроксимирует измененный Лаплакиан на квадратной сетке с hx = hy = h.

Sh=Δu+h212Δ2u+O(h3).(1)

syms h
hx = h;
hy = h;
d = h^2/12;

Замените hx и hy по h.

C = subs(C);

Замените z по своему значению, 1/(6*h^2). Потому что z не существует в рабочей области MATLAB ®, вы можете получить к нему доступ только как к значению, хранящемуся в parameters массив.

C = subs(C,parameters,1/(6*h^2));

Проверьте формулу (1).

simplify(C(3) - d*Laplace(Laplace(u)))
ans(x, y) = 0sym (0)

Теперь рассмотрим условия третьего порядка в hx, hy.

simplify(C(2))
ans = 0sym (0)

Поскольку в расширении трафарета таких терминов не существует, термин O(h3) в (1) находится на самом деле в порядке O(h4). Рассмотрим условия четвертого порядка трафарета.

factor(simplify(C(1)))
ans = 

(1360hhhh6x6 u(x,y)+52y2 4x4 u(x,y)+54y4 2x2 u(x,y)+6y6 u(x,y))[sym (1/360), h, h, h, h, diff (u (x, y), x, 6) + 5 * diff (diff (u (x, y), x, 4), y, 2) + 5 * diff (diff (u (x, y), x, 2), y, 4) + diff (u (x, y), y, 6)]

Проверьте, можно ли идентифицировать эти условия с помощью еще одной степени оператора Laplace. Однако сравнение с

Laplace(Laplace(Laplace(u)))
ans(x, y) = 

6x6 u(x,y)+32y2 4x4 u(x,y)+34y4 2x2 u(x,y)+6y6 u(x,y)diff (u (x, y), x, 6) + 3 * diff (diff (u (x, y), x, 4), y, 2) + 3 * diff (diff (u (x, y), x, 2), y, 4) + diff (u (x, y), y, 6)

показывает, что выражения порядка O(h4) не может быть идентифицировано как некоторое число, кратное третьей степени оператора Laplace, поскольку коэффициенты не могут совпадать.

Сводные данные

Для квадратной сетки с h расстояния между соседними точками сетки и вышеописанными вариантами весов вы получаете:

Sh=Δu+h212Δ2u+O(h4).(2)

Используйте это расширение для численного подхода к задаче собственного значения Δu=λu. Добавьте несколько кратных Δ2u=λ2u к собственному уравнению.

Δu+h212Δ2u=(λ+h212λ2)u.

Левая сторона этого уравнения хорошо аппроксимируется трафаретом Sh. Таким образом, использование (2), числового собственного значения μ трафарета удовлетворяющего Shu=μu должно быть приближением собственного значения λ оператора Laplace с

μ=λ+h212λ2+O(h4).

Для данного μ, решить для λ получить лучшее приближение собственного значения Лапласа. Обратите внимание, что в решении квадратичного уравнения в λ правильный знак квадратного корня задается требованием, что λμ для h0.

λ=6h2(1+μh23-1)=2μ1+μh23+1.(3)

Использование символьных матриц для решения задачи собственного значения

Рассмотрим L-образную область Ω состоящий из трех единичных квадратов.

Ω={(x,y);-1x0,-1y0}{(x,y);0x1,-1y0}{(x,y);-1x0,0y1}.

Задайте значения координат углов области.

xmin =-1;
xmax = 1; 
ymin =-1; 
ymax = 1;

Рассмотрим квадратную сетку, состоящую из нечетного числа Nx=2*nx-1 точек сетки в x направление и нечетное число Ny=2*ny-1 точек сетки в y направление.

nx = 6; 
Nx = 2*nx-1; 
hx = (xmax-xmin)/(Nx-1);

ny = 6; 
Ny = 2*ny-1; 
hy = (ymax-ymin)/(Ny-1);

Создайте Ny-by- Nx символьная матрица u. Его записи u(i,j) представлять значения u(xmin + (j - 1)*hx,ymin + (i - 1)*hy) решения u(x,y) задачи собственного значения Δu=λu.

u = sym('u',[Ny,Nx]);

Область контуров Ω соответствуют следующим индексам:

  • Левый контур соответствует (i = 1:Ny, j = 1).

  • Нижний контур соответствует (i = 1, j = 1:Nx).

  • Правый контур соответствует (i = 1:ny, j = Nx) и (i = ny:Ny, j = nx).

  • Верхний контур соответствует (i = Ny, j =1:nx) и (i = ny, j = nx:Nx).

u(:,1) = 0;      % left boundary
u(1,:) = 0;      % lower boundary
u(1:ny,Nx) = 0;  % right boundary, upper part
u(ny:Ny,nx) = 0; % right boundary, lower part
u(Ny,1:nx) = 0;  % upper boundary, left part
u(ny,nx:Nx) = 0; % upper boundary, right part

Область с 0<x1 и 0<y1 не принадлежит Ω. Установите соответствующие записи матрицы (i = ny + 1:Ny, j = nx + 1:Nx) в нуль. Они не играют никакой дальнейшей роли и будут проигнорированы.

u(ny + 1:Ny,nx + 1:Nx) = 0;

Неизвестными о задаче являются следующие матричные записи:

u
u = 

(000000000000u2,2u2,3u2,4u2,5u2,6u2,7u2,8u2,9u2,1000u3,2u3,3u3,4u3,5u3,6u3,7u3,8u3,9u3,1000u4,2u4,3u4,4u4,5u4,6u4,7u4,8u4,9u4,1000u5,2u5,3u5,4u5,5u5,6u5,7u5,8u5,9u5,1000u6,2u6,3u6,4u6,50000000u7,2u7,3u7,4u7,50000000u8,2u8,3u8,4u8,50000000u9,2u9,3u9,4u9,50000000u10,2u10,3u10,4u10,500000000000000000)[sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0); sym (0), u2_2, u2_3, u2_4, u2_5, u2_6, u2_7, u2_8, u2_9, u2_10, sym (0); sym (0), u3_2, u3_3, u3_4, u3_5, u3_6, u3_7, u3_8, u3_9, u3_10, sym (0); sym (0), u4_2, u4_3, u4_4, u4_5, u4_6, u4_7, u4_8, u4_9, u4_10, sym (0); sym (0), u5_2, u5_3, u5_4, u5_5, u5_6, u5_7, u5_8, u5_9, u5_10, sym (0); sym (0), u6_2, u6_3, u6_4, u6_5, sym (0), sym (0), sym (0), sym (0), sym (0), sym (0); sym (0), u7_2, u7_3, u7_4, u7_5, sym (0), sym (0), sym (0), sym (0), sym (0), sym (0); sym (0), u8_2, u8_3, u8_4, u8_5, sym (0), sym (0), sym (0), sym (0), sym (0), sym (0); sym (0), u9_2, u9_3, u9_4, u9_5, sym (0), sym (0), sym (0), sym (0), sym (0), sym (0); sym (0), u10_2, u10_3, u10_4, u10_5, sym (0), sym (0), sym (0), sym (0), sym (0), sym (0); sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0), sym (0)]

Внутренние точки области ΩΩ соответствуют индексам (i,j) которые содержат неизвестные значения u(i,j) задачи. Соберите этих неизвестных в вектор vars.

[I,J] = find(u~=0);
vars = u(u~=0);

Ассоциируйте символьное выражение (заданное трафаретом, выведенным в первой части этого примера) с каждым индексом (то есть с каждым неизвестным).

n = length(vars);
Lu = sym(zeros(n,1));
for k=1:n
   i = I(k);
   j = J(k);
   Lu(k) =   1/6*u(i+1,j-1) +  2/3*u(i+1,j) + 1/6*u(i+1,j+1) ...
           + 2/3*u( i ,j-1) - 10/3*u( i ,j) + 2/3*u( i ,j+1) ...
           + 1/6*u(i-1,j-1) +  2/3*u(i-1,j) + 1/6*u(i-1,j+1); 
end
Lu = Lu/hx^2;

Потому что это выражение линейно в неизвестных элементах u (хранится в vars), можно рассматривать его как матрицу, действующую на вектор vars.

S_h = jacobian(Lu, vars);

Можно лечить S_h как матричное приближение оператора Лапласа. Вычислите его собственные векторы и собственные значения.

[V,D] = eig(vpa(S_h));

Три максимальных собственных значений заданы первыми диагональными элементами D.

[D(1,1), D(2,2), D(3,3)]
ans = (-9.5214641572625960021345709535953-14.431096242107969492574666743957-18.490392088545609858994660377955)[-vpa ('9.5214641572625960021345709535953'),-vpa ('14.431096242107969492574666743957'),-vpa ('18.490392088545609858994660377955')]

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

Третье по величине собственное значение оператора Laplace на L-образной области Ω Точно известно. Точная собственная функция оператора Laplace является функцией u(x,y)=sin(πx)sin(πy) сопоставлен с (точным) собственным значением -2π2=-19.7392.... Действительно, используя уравнение (3) выше, можно вывести лучшее приближение собственного значения Лапласа λ из собственного значения трафарета μ:

mu = D(3,3)
mu = -18.490392088545609858994660377955-vpa ('18.49039208854560985899460377955')
lambda = 2*mu / (sqrt(1 + mu*hx^2/3) + 1)
lambda = -19.796765119155672176257649532142-vpa ('19.796765119155672176257649532142')

Постройте график собственной функции, связанной с третьим самым высоким собственным значением.

v = V(:,3);
for k=1:n
  u(I(k),J(k)) = v(k);
end
u = double(u);
surf(xmin:hx:xmax,ymin:hy:ymax,u');
view(125, 30);

Figure contains an axes. The axes contains an object of type surface.

Использование матриц двойной точности для решения задачи собственного значения

Когда вы используете символьные матрицы, резкое увеличение количества точек сетки не рекомендуется, потому что символьные расчеты значительно медленнее, чем численные расчеты с матрицами двойной точности MATLAB. Эта часть примера демонстрирует, как использовать разреженную двойную арифметику, которая позволяет уточнить числовую сетку. L-образная область Ω настраивается так же, как и раньше. Вместо обозначения внутренних точек символическими неизвестными, инициализируйте значения сетки u по таковым и определить Ω путем установки значений краевых точек и внешних точек в нуль. Вместо того, чтобы определять символическое выражение для каждой внутренней точки и вычислять трафарет как якобиан, настройте шаблонную матрицу непосредственно как разреженную матрицу.

xmin =-1; 
xmax = 1; 
ymin =-1; 
ymax = 1;

nx = 30; 
Nx = 2*nx-1; 
hx = (xmax-xmin)/(Nx-1);

ny = 30; 
Ny = 2*ny-1; 
hy = (ymax-ymin)/(Ny-1);

u = ones(Ny,Nx); 
u(:,1) = 0;      % left boundary
u(1:ny,Nx) = 0;  % right boundary, upper part
u(ny:Ny,nx) = 0; % right boundary, lower part
u(1,:) = 0;      % lower boundary
u(Ny,1:nx) = 0;  % upper boundary, left part
u(ny,nx:Nx) = 0; % upper boundary, right part
u(ny + 1:Ny,nx + 1:Nx) = 0;

[I,J] = find(u ~= 0);
n = length(I);
S_h = sparse(n,n);
for k=1:n 
  i = I(k);
  j = J(k);
  S_h(k,I==i+1 & J==j+1)=  1/6;
  S_h(k,I==i+1 & J== j )=  2/3;
  S_h(k,I==i+1 & J==j-1)=  1/6;
  S_h(k,I== i  & J==j+1)=  2/3;
  S_h(k,I== i  & J== j )=-10/3;
  S_h(k,I== i  & J==j-1)=  2/3;
  S_h(k,I==i-1 & J==j+1)=  1/6;
  S_h(k,I==i-1 & J== j )=  2/3;
  S_h(k,I==i-1 & J==j-1)=  1/6;
end
S_h = S_h./hx^2;

Здесь, S_h - (разреженная) шаблонная матрица. Использование eigs который обрабатывает разреженные матрицы, чтобы вычислить три крупных собственных значений.

[V,D] = eigs(S_h,3,'la');

Три максимальных собственных значений являются первыми диагональными элементами D.

[D(1,1), D(2,2), D(3,3)]
ans = 1×3

   -9.6493  -15.1742  -19.7006

D(3,3) аппроксимирует точное собственное значение -2π2=-19.7392088.... Используя уравнение (3) выше, выведите более точное приближение собственного значения Лапласа λ из собственного значения трафарета μ.

mu = D(3,3)
mu = -19.7006
lambda = 2*mu / (sqrt(1 + mu*hx^2/3) + 1)
lambda = -19.7393

Постройте график собственной функции, связанной с третьим самым высоким собственным значением.

v = V(:,3);
for k=1:n
  u(I(k),J(k)) = v(k);
end
surf(xmin:hx:xmax, ymin:hy:ymax,u');
view(125, 30);

Figure contains an axes. The axes contains an object of type surface.

Обратите внимание, что MATLAB membrane функция вычисляет собственные функции оператора Laplace различными методами.

membrane(3, nx - 1, 8, 8);

Figure contains an axes. The axes contains an object of type surface.