пятница, 18 апреля 2014 г.

Freemat. Аппроксимация

Допустим, вы провели серию экспериментов и получили некоторое множество данных, которые хотели бы интерполировать или экстраполировать. Freemat предлагает одну функцию на все случаи жизни:  interplin1().



Как понятно из названия, данная функция осуществляет линейную интерполяцию, однако, она также может и экстраполировать данные (естественно, линейно). Полное обращение к ней выглядит следующим образом:
interplin1(X, Y, t, flag),
где X, Y - координаты узлов, t - искомая точка, значение в которой рассчитывается. Параметр flag определяет поведение функции за пределами интервала значений X: 'nan' - расчёт не производится, 'zero' - все значения обращаются в нуль, 'endpoint' - принимаются значения крайних точек интервала X, 'extrap' - производится экстраполяция.
Если вас интересует полиномиальная зависимость, используйте функцию polyfit(X,Y,n). Здесь n - степень полинома, которая при интерполяции должна быть равна числу экспериментальных точек. Делать больше смысла нет, а если меньше - будет произведена аппроксимация методом наименьших квадратов.
А что, если функциональная зависимость известна, но она не описывается полиномом? В этом случае на помощь приходит функция fitfun(), которая использует метод наименьших квадратов для подбора коэффициентов искомой зависимости. Её полный вид:
[xopt, yopt] = fitfun(func, A, Y, weight, tol, par1 ... parN),
где F - теоретическая функциональная зависимость, A - начальный вектор коэффициентов, Y - полученные значения в точках, weigth - "веса" точек, tol - точность, par1 ... parN - дополнительные параметры. Функция возвращает вектор коэффициентов xopt и вектор рассчитанных значений при данных коэффициентах yopt. Рассмотрим пример. Будем искать наилучшее приближение для степенной функции y=x^a+b. Сначала необходимо задать искомую функцию, которая для данного вектора свободных коэффициентов init рассчитывает значения в заданных точках.
Теперь мы определяем начальное приближение для init, задаём экспериментальные значения функции и их весовые коэффициенты (в данном случае 1 для всех точек), а также относительную точность. Остаётся только воспользоваться функцией fitfun.
Многие статистические, да и физические, распределения описываются функцией Гаусса. Видимо, поэтому в Freemat имеется специальная функция для аппроксимации gausfit. При её использовании также можно задавать вектор весов, указывать дополнительные параметры и т.д., но часто достаточно простейшего вида:
[mu, sigma, dc, gain, Yhat] = gausfit(X, Y).
Здесь Y - вектор значений в точках X, mu - математическое ожидание, sigma - дисперсия, dc - смещение относительно Ox, gain - масштабный множитель, Yhat - вектор расчётных значений в точках X


Комментариев нет:

Отправить комментарий