Построение волнового уравнения

Я пытался построить уравнение плоской волны в Matlab. Я пытаюсь построить действительную часть $(1/R)E^i(kR+wT)$, т.е. $(1/R)cos(kR+wT)$. Поэтому я использовал следующий код в Matlab (на одно мгновение, скажем, t=5):

x=-5:0.1:5;
y=-5:0.1:5;

t=5;

w=1.3;
k=1.3;

[X,Y]=meshgrid(x,y);
R=(X.^2+Y.^2)^1/2;
u=20*cos(k*R+w*t);
surf(X,Y,u);

Когда я запускаю этот код, я получаю следующий поверхностный график: введите здесь описание изображения можно было бы ожидать. Но если я увеличу коэффициенты волнового числа и угловой частоты до 15, я получу следующее: введите здесь описание изображения быть интерференционной картиной, но я понятия не имею, почему я получаю это, потому что я не добавлял эффекты интерференции. Кто-нибудь может объяснить, что здесь происходит?

Что я действительно пытаюсь сделать, так это построить функцию для радиально направленной наружу сферической волны (на поверхности, такой как поверхность воды) для демонстрации в моем классе. Как я могу превратить это в анимацию, которая показывает волны волн, выходящих из точечного источника?

Спасибо за вашу помощь


person Shaz    schedule 24.12.2014    source источник
comment
Если у вас есть доступ к набору инструментов PDE, вы можете взглянуть на этот пример nl.mathworks.com/help/pde/ug/hyperbolic-problem.html. Просто введите «edit pdedemo6» в оболочке Matlab, чтобы увидеть код примера.   -  person Kostya    schedule 24.12.2014


Ответы (1)


Вы видите алиасинг, вызванный недостаточной выборкой. У этого псевдонима есть (как минимум) две возможные причины:

  1. Выборка функции, определяемой x,y-сеткой значений, недостаточна.
  2. Matlab строит график на фигуре с ограниченным количеством пикселей экрана. Графический рендеринг включает некоторую субдискретизацию, если матрица, которая должна быть представлена, велика по сравнению с количеством пикселей рисунка. В этом процессе понижения дискретизации может появиться алиасинг.

Что касается первого типа алиасинга: при увеличении волнового числа волна меняется быстрее в направлениях x и y. Итак, чтобы правильно визуализировать функцию, вам нужно уменьшить период выборки в той же пропорции.

Это ваш исходный код, только с k=15 и w=15; и с заменой surf на imagesc для большей наглядности (рисунок похож на ваш, но виден "сверху"):

x=-5:0.1:5;
y=-5:0.1:5;
t=5;
w=15;
k=15;
[X,Y]=meshgrid(x,y);
R=(X.^2+Y.^2)^1/2;
u=20*cos(k*R+w*t);
imagesc(x,y,u);

Полученный рисунок демонстрирует артефакты алиасинга:

введите здесь описание изображения

Теперь, используя более точную выборку

x=-5:0.01:5; %// note: 0.01: finer grid
y=-5:0.01:5;
t=5;
w=15;
k=15;
[X,Y]=meshgrid(x,y);
R=(X.^2+Y.^2)^1/2;
u=20*cos(k*R+w*t);
imagesc(x,y,u);

уменьшает первый тип алиасинга. Однако некоторые артефакты все же видны на рисунке:

введите здесь описание изображения

Вероятно, это вызвано упомянутым выше вторым типом псевдонимов. Чтобы убедиться в этом, я запустил тот же код в Matlab R2014b, который выполняет лучшая работа по предотвращению алиасинга, вызванного графическим рендерингом (обратите внимание, что цветовая карта по умолчанию была изменена в этой версии Matlab). Вы можете видеть, что по сравнению с предыдущим рисунком результаты улучшились:

введите здесь описание изображения

Итог: используйте более точную выборку и, если возможно, перейдите на Matlab R2014b.

person Luis Mendo    schedule 24.12.2014
comment
ВАУ... это было хорошо объяснено. Спасибо! - person Shaz; 24.12.2014