2012-07-02 2 views
2

Мне нужно построить интерполяционную функцию из 2D массива данных. Причина, по которой мне нужно что-то, возвращающее фактическую функцию, заключается в том, что мне нужно иметь возможность оценить функцию как часть выражения, которое мне нужно для численного интегрирования.Функциональная форма 2D-интерполяции в Matlab

По этой причине «interp2» не разрезает его: он не возвращает функцию.

Я мог бы использовать «TriScatteredInterp», но это тяжелый вес: моя сетка равномерно распределена (и большой); поэтому мне не нужна треугольная треугольня.

Есть ли альтернативы?

+0

Не можете ли вы обернуть его в [анонимную функцию] (http://www.mathworks.co.uk/help/techdoc/matlab_prog/f4-70115.html)? –

+0

Будет ли что-то вроде polyfit2 работать на вас? http://www.mathworks.com/matlabcentral/fileexchange/220 – Steve

ответ

0

Если вы правильно поняли, что хотите сделать поверхностный/линейный интеграл двухмерных данных. Есть способы сделать это, но, возможно, не так, как вы этого хотите. У меня была такая же проблема, и это раздражает! Единственный способ, которым я решил это, - использовать Surface Fitting Tool (sftool), создать поверхность, а затем интегрировать ее.

После создания подгонки с помощью инструмента (она имеет графический интерфейс, а), он будет генерировать sftool объект, который затем можно интегрировать в (2-D) с помощью quad2d

Я также попробовал ваш метод используя interp2 и получили результаты (похожие на sfobject), но я понятия не имел, как выполнить численное интегрирование (линия/поверхность) с данными. Создание sfobject, а затем интеграция была намного быстрее.

Это был первый раз, когда я делал что-то подобное, поэтому подтвердил его с помощью численно оцениваемого интеграла линии. Согласно теореме Стокса, интеграл поверхности и линейный интеграл должны быть одинаковыми, и это оказалось одинаковым.

Я спросил this вопрос в математике stackexchange, хотел сделать линейный интеграл из 2-х данных, в итоге сделал поверхностный интеграл, а затем подтвердил ответ, используя линейный интеграл!

+0

Хотя я ценю ваше предложение, я чувствую, что вы неправильно понимаете мою проблему. – reddish

+0

В Mathematica то, что я хочу сделать, легко достигается с помощью функции «Интерполяция» (http://reference.wolfram.com/mathematica/ref/Interpolation.html). В настоящее время я работаю для клиента, который настаивает на Matlab, поэтому мне было интересно, возможно ли это. – reddish

+0

По существу, мне нужно превратить 2D-таблицу в объект «f», для которого класс (f) возвращает «function_handle». Оценка f (x, y) должна выполнять интерполяцию при (x, y) с разумной степенью эффективности. – reddish

5

(Извинения для «конца» ответ, но у меня есть несколько предложений, которые могли бы помочь другим, если существующий ответ им не помогает)

Это не ясно из вашего вопроса, насколько точно полученная функция должна быть (или как большой, «большой»), но один из подходов, который вы можете принять, - это регрессировать точки данных, которые вы используете с использованием метода наименьших квадратов или фильтра на основе Калмана. Вам нужно будет сделать это с помощью нескольких форм-функций кандидата, а затем выбрать тот, который является «лучшим», например, используя меру, такую ​​как MAE или MSE.

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

Другим подходом, который может работать (и не требует знания того, что может быть для базовой функции), является использование нечеткого преобразования (F-transform) для создания сегментов линии, которые обеспечивают локальные приближения к поверхности.

Метод для этого будет:

  1. Определение 2D-вселенной, которая включает в х и у доменов входных данных
  2. Создание 2D-нечеткого разбиения этой вселенной - они выбрали размеры разделов, которые дают требуемая точность
  3. Применить дискретное F-преобразование с использованием ваших входных данных для создания нечетких точек данных в трехмерном нечетком пространстве
  4. Передайте обратное F-преобразование как дескриптор функции (вместе с точками нечеткой информации) к вашей интеграции функция

Если вы не знакомы с F-преобразования, то я отправил блог некоторое время назад о том, как F-преобразование может быть использовано в качестве универсального аппроксиматора в 1D случае: http://iainism-blogism.blogspot.co.uk/2012/01/fuzzy-wuzzy-was.html

Чтобы увидеть математику, лежащую в основе метода, и распространить ее на многомерный случай, тогда в Остравском университете была опубликована кандидатская диссертация, в которой объясняется ее применение к различным инженерным задачам, а также приводится пример того, как она построена для случая двумерной вселенной: http://irafm.osu.cz/f/PhD_theses/Stepnicka.pdf

3

Если вам нужен дескриптор функции, почему бы не определить f = @ (xi, yi) interp2 (X, Y, Z, xi, yi)? Это может быть немного медленнее, но я думаю, что это должно сработать.

Смежные вопросы