exponenta event banner

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

В этом примере показано, как решить проблему собственных значений оператора Лапласа в L-образной области.

Проблема с мембраной

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

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

Аппроксимация конечных разностей в девяти точках

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

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 выбрано для порядка O(1/hx^2,1/hy^2).

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

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

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(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) не могут быть идентифицированы как несколько кратные третьей степени оператора Лапласа, поскольку коэффициенты не могут быть сопоставлены .

Резюме

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

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

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

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

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

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

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

λ = 6h2 (1 + мкх23-1) = 2 мк1 + мкх23 + 1. (3)

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

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

Λ = {(x, y); - 1≤x≤0, - 1≤y≤0}∪ {(x, y); 0≤x≤1, - 1≤y≤0}∪ {(x, y); - 1≤x≤0,0≤y≤1}.

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

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около- 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<x≤1 и 0<y≤1 не относится к Λ. Установка соответствующих записей матрицы (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), 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)]

Внутренние точки области Ω∖∂Ω соответствовать индексам (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')]

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

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

mu = D(3,3)
mu = -18.490392088545609858994660377955-vpa('18.490392088545609858994660377955')
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 функция вычисляет собственные функции оператора Лапласа различными методами.

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

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