2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Нахожд. инд. эл-та ближайшего по знач от задан. (перем. усл)
Сообщение28.10.2018, 13:33 
Здравствуйте уважаемые участники,
Пару дней ломаю голову, но решения нет либо работает все как-то криво.
Задача из области акустики - но вопрос мой как ее "запрограммировать".

Даны векторы 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);



Изображение

UPDATE

arseniiv, Спасибо за сообщение и желание помочь

Извините, наверное со стороны это действительно не очень понятно.

Я обновил картинку (на старой была ошибка)

Верно нужно посчитать поле от монополя, но проблема в том что скорость звука не постоянна и соответственно волновое число К тоже.

Итак 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.


Я надеюсь более понятно описал задачу. Если что-то не понятно прошу сообщить, поскольку очень заинтересован в получении помощи.

 
 
 
 Re: Нахожд. инд. эл-та ближайшего по знач от задан. (перем. усл)
Сообщение28.10.2018, 19:53 
Прочитал три раза — понял, что без толку. И, видимо, вот это место является самым вопросительным:
    acstc в сообщении #1349734 писал(а):
    В общем цель такая, чтобы найти произведение K*R.

    Но поскольку K меняется, произведение K*R можно выразить как сумму к1*r1 + к2*r2 и тд...Для лучшего понимания прошу взглянуть на картинку.
Можно ещё раз аккуратно определить, что требуется найти? Потому что следующие построения — это магия какая-то.

У меня есть лишь одно предположение, но скорее всего оно неверно — у вас есть поле, значение которого известно лишь в некоторых точках, есть две точки (в качестве второй, видимо, $(0,0)$?) где-то не очень далеко, и вы хотите найти интеграл этого поля по отрезку между теми двумя точками, но так как значения поля известны не везде, нужна интерполяция. Ну вот эту самую интерполяцию, если я случайно угадал, можно сделать, видимо, не таким странным способом, хотя я его так и не понял. (Можно сказать одно: вычислять арккосинус, чтобы потом сразу же брать от него косинус, совершенно бессмысленно.)

-- Вс окт 28, 2018 21:54:39 --

(Можно, конечно, подождать, вдруг кто-то точно поймёт, хотя это видится сомнительным.)

 
 
 
 Posted automatically
Сообщение28.10.2018, 22:33 
 i  Тема перемещена из форума «Околонаучный софт» в форум «Карантин»
по следующим причинам:

- очевидно необходима более внятная формулировка вопроса; лучше, если она будет в формульном виде (краткие инструкции: «Краткий FAQ по тегу [math]» и видеоролик Как записывать формулы).

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group