Здравствуйте уважаемые участники,
Пару дней ломаю голову, но решения нет либо работает все как-то криво.
Задача из области акустики - но вопрос мой как ее "запрограммировать".
Даны векторы
x,y, границы которых, как и шаг может быть задан и с другими параметрами. Далее создается "Сетка" с помощью
meshgrid.
Имеется точка
S с заданными координатами
(x,y), далее рассчитывается расстояние
R от точки
S ко всем точкам "сетки".
Имеется другая матрица такой же размерности где записана некая величина
K, которая зависит от
(x, y) и меняется по определенному закону по двум этим координатам. В простом случае величина
K является, так сказать, константой независящей от
(x, y).
В общем цель такая, чтобы найти произведение
K*R.
Но поскольку
K меняется, произведение
K*R можно выразить как сумму
к1*r1 + к2*r2 и тд...Для лучшего понимания прошу взглянуть на картинку.
В данный момент пусть необходимо найти
K*R для точки
М1. Прямая
S-М1 поделена на одинаковые отрезки - маленькие отрезки
r (прямая бирюзового цвета) , которые можно найти зная угол
Angle. В данном случае искомое произведение можно выразить как
r * (к1 + к2 + ... кn), где
n = R/step. Величина
к1 "лежит" в точке
S1, которая в данном случае не попадает на "сетку".
Зная значение
r и сравнивая его со значениями "сверху и снизу" в точках
S1 и S2, нужно найти индекс элемента (в данном случае точки S1 или S2) который имеет минимальное отклонение от
r. Далее зная индексы, из матрицы
K находим значение в данной точки, которое и будет
к1. Далее вдоль прямой ситуация повторяется и для следующей точки и в конечном итоге находится произведение
r * (к1 + к2 + ... кn).
Код:
step = 0.1;
x = 0: step : 10;
y = 0 : step : 9;
[X, Y] = meshgrid(x, y);
R = sqrt((X - x_s).^2 + (Y - y_s).^2);
Angle = acosd((X - x_s))./ R);
r = step./cosd(Angle);
UPDATEarseniiv, Спасибо за сообщение и желание помочь
Извините, наверное со стороны это действительно не очень понятно.
Я обновил картинку (на старой была ошибка)
Верно нужно посчитать поле от монополя, но проблема в том что скорость звука не постоянна и соответственно волновое число К тоже.
Итак
k это отдельная матрица, величины которой распределены по определенному закону и зависят от x,y.
Величину
r для каждой из точек в матрице R можно найти как r = step/cosd(Angle). По сути это расстояние. Координаты точек пересечения вектора и линий сетки по оси
x это
step а по оси
y это
step*tand(Angle) . Но в данном случае как видно из картинки значение координаты пересечения по
y попадает так сказать между сетки и вот мне нужно определить индекс (i,j) ячейки (верхней или нижней - в данном случае ячейки S1 и S2, у которых только y координата разная) в матрице расстояний R, которая по значению имеет наименьшее отклонение от значения r.
Далее я нахожу эти индексы и из матрицы K нахожу значение которое соответствует найденным индексам и далее использую его по своему назначению.
Вот и вся задача! Но нужно это сделать для
каждой из точек в матрице R n раз, где n для каждой из точек это R (расстояние которое записано в матрице R для каждой из точек в соответствующей "ячейке") / step.
Я надеюсь более понятно описал задачу. Если что-то не понятно прошу сообщить, поскольку очень заинтересован в получении помощи.