|
Модераторы: Poseidon |
|
Burka |
|
|||
Опытный Профиль Группа: Участник Сообщений: 429 Регистрация: 11.5.2007 Репутация: 1 Всего: 2 |
У меня сложность в реализации двумерной сплайн интерполяции.
Для одномерной интерполяции все просто(есть исходники ). Например: дан массив известных точек A[N] и для каждого необходимого X мы вызываем функцию допустим y=spline(X1, A, N) Таким образом мы получаем необходимые значения функции. Все просто. Но я не могу разобраться с двумерной интерполяцией. Нашел, на мой взгляд, хорошее описание того как это делается: http://community.livejournal.com/ru_algorithms/24344.html Цитата из ЖЖ:
С математикой туго, поэтому разобратся как это сделать я не смог. Прошу помощи в реализации двумерной сплайн интерполяции на основе одномерной. -------------------- Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей. |
|||
|
||||
HoTMetaL |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 107 Регистрация: 15.4.2007 Репутация: 1 Всего: 4 |
Предупреждаю - по вычмату у меня за экзамен "удовл."
Тем не менее, если у тебя есть функция одномерной интерполяции, то делаешь следующее: Значение, полученное на каждом шаге интерполяции, запоминаешь и полученный массив загоняешь снова в функцию одномерной итнерполяции. y ^ | * * * * * | * * * * * | * * * * * | * * * * * -------------->x Например, сначала интерполируешь 5 раз по Х, а потом 1 раз по Y. или наоборот - 4 раза по Y и 1 - по X. PS Тебя "удовл." мой ответ? Это сообщение отредактировал(а) HoTMetaL - 29.6.2007, 17:00 |
|||
|
||||
Burka |
|
|||
Опытный Профиль Группа: Участник Сообщений: 429 Регистрация: 11.5.2007 Репутация: 1 Всего: 2 |
Не очень)) Вот смотри. Есть такая функция: y=spline(X, A, N), где A - это массив известных точек по Х, и где N это количество этих известных точек. X - Это X, Y которого мы хотим получить(X может входить в A) то есть прокрутив эту функцию в цикле, меняя X (допустим от 1 до 10) мы получим массив Y[M], в котором точки более или менее похожи на нужные. Тут ясно. А теперь мне так же объясни что делать этой функцией для двух переменных))) Допустим у нас есть двумерный массив известных точек B[K, F] Вот дальше что-то никак вникнуть не могу.. что с ним делать. Это сообщение отредактировал(а) Burka - 29.6.2007, 19:56 -------------------- Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей. |
|||
|
||||
HoTMetaL |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 107 Регистрация: 15.4.2007 Репутация: 1 Всего: 4 |
Двумерная интерполяция означает, что нам дана функция от двух переменных z=f(x,y). Для удобства будем считать, что значения известны на прямоугольной сетке интерполяции - массив B[K][F]. Допустим, что нам нужно найти одно значение z0 в точке (x0,y0), т.е. z0=f(x0,y0). Поступим следующим образом: K раз интерполируем функцию по X, т.е.
1)y=y1; 2)y=y2; 3)y=y3; ........... K)y=yK; Затем один раз интерполируем по Y. Таким образом, в рамках нашей задачи делаем следующее: 1) Создаём одномерный массив Temp[K] 2) В цикле заполняем этот массив значениями-результатами работы функции spline();. 3) На выход выдаём значение функции spline(); при подстановке в неё Temp[K]. Т.е. на шаге 2 в функцию spline(); нужно подставлять строки длиной F (K раз) из массива B[K][F]. Это может выглядеть примерно так:
Порядок интерполяции можно менять, т.е. сначала пробегаем по столбцам, а потом интерполируем по X. А теперь "удовл."? Это сообщение отредактировал(а) HoTMetaL - 30.6.2007, 09:29 |
|||
|
||||
Burka |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 429 Регистрация: 11.5.2007 Репутация: 1 Всего: 2 |
Так, вопросик есть.
Извиняюсь что первый пример немного отличается от реальности, хотел упростить. Вот сложность у меня в создании цикла для заполнения всей матрицы То есть, мне нужно заполнить матрицу Z[S][D], в которой S>K, D>F так как матрица B входит в Z.
По-моему это, как минимум, должно быть в одиночном цикле. ------------------------------------------------- Вроде в таком роде что-то должно быть.
UPD че, то стормозил, последний вариант не подходит, так как массив Temp не сформирован полностью. Это сообщение отредактировал(а) Burka - 30.6.2007, 16:43 -------------------- Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей. |
||||||
|
|||||||
HoTMetaL |
|
||||||||||
Шустрый Профиль Группа: Участник Сообщений: 107 Регистрация: 15.4.2007 Репутация: 1 Всего: 4 |
К первому листингу
Один сплошной баг. Ты его вообще запускал? При заполнении StrokaX[] и StrokaY[] ошибок разве не возникает? Spline3BuildTable() - что это за функция? Number где изменяется?
А вот это зря.
Это ещё чё такое? Ко второму листингу Никакого цикла для нахождения одной точки не нужно. Если хочешь много значений - вбивай их в массив. К третьему листингу
Если честно - эту строку я тоже не понял. В этом случае массив Temp[] будет не до конца сформирован и ты получишь огромные порешности (или даже ошибки) при малых i. А теперь ВНИМАНИЕ!!!! Больше повторять не буду. Для определённости: spline() - на входе получает -точку, для которой идёт одномерная интерполяция; -массивы известных аргументов и соответстующих им значений; -размер этих массивов; spline() - возвращает значение для входной точки. Теперь дописываешь мой код, согласно этим поправкам. Вот здесь ->
PSЕдинственное что добавлю, так это то, что я не учёл наличие массива известных аргументов для массива изветных значений (как можно увидеть из "определённостей" я эту багу исправил) Дальше сам. Удачи! Это сообщение отредактировал(а) HoTMetaL - 30.6.2007, 20:16 |
||||||||||
|
|||||||||||
Burka |
|
||||||||||
Опытный Профиль Группа: Участник Сообщений: 429 Регистрация: 11.5.2007 Репутация: 1 Всего: 2 |
Вот пример использования этих функций для одномерной интерполяции, все работает.
Тут сразу будет видно что для чего.
Забыл добавить просто: Inc(Numbers); //в цикле где формируеются массивы опорных точек И перед циклом SetLength(StrokaX, 50); //с запасом SetLength(StrokaY, 50);
UPD да, пожалуй тут это не нужно.(спать пора). Надо бы представить двумерный массив опорных точек как-нибудь по-другому. в одномерных как-нибудь.
Массив я не могу потставить, потому что я не понимаю как можно с помощью "z0=spline(y0,Temp,K);" заполнить двумерный массив с количеством элементов K*F. Это сообщение отредактировал(а) Burka - 30.6.2007, 22:30 -------------------- Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей. |
||||||||||
|
|||||||||||
teesync |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.7.2022 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
Queuego |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 4.11.2022 Репутация: нет Всего: нет |
Модератор: Сообщение скрыто. |
|||
|
||||
Правила форума "Центр помощи" | |
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |