Необходимо подобрать полином, используя полиномиальную основу Чебышева

Я подгонял линейные полиномы наименьших квадратов к данным, используя функцию polyfit в Matlab. Из того, что я читал, здесь используется стандартный полиномиальный базис (мономиальный базис). Я читал, что использование полиномиального базиса Чебышева для подгонки приводит к большей численной стабильности, поэтому я хотел бы сделать это. Есть ли в матлабе такая возможность?


person user1593853    schedule 16.08.2012    source источник


Ответы (2)


Я думаю, вам нужен набор инструментов Chebfun. Среди прочего, он перегружает polyfit с использованием точек Чебышева и интерполянтов Чебычева.

Помимо вышеперечисленного, вы всегда можете закодировать это самостоятельно. Это не так сложно. РЕДАКТИРОВАТЬ: см. сообщение mathematician1975 :). EDIT2: обновлен веб-сайт chebfun.

person Dennis Pennis    schedule 16.08.2012
comment
Спасибо за Ваш ответ. Этот набор инструментов кажется очень полезным и имеет некоторые другие полезные функции. На самом деле я еще не пробовал, но документация предполагает, что это может быть действительно полезно - person user1593853; 17.08.2012
comment
Обратите внимание, что chebfun не использует полиномы наименьших квадратов, но использует интерполяцию по всем точкам. - person Erik; 14.03.2013

Здесь я предполагаю, что вам нужны многочлены Чебышева первого рода. Насколько я знаю, в Matlab такого нет. Хотя кодить самому несложно. Полиномы Чебышева определены только на [-1,1], поэтому сначала вы должны сопоставить свои данные x с этим диапазоном. Затем используйте рекуррентное соотношение для построения полиномов Чебышева http://en.wikipedia.org/wiki/Chebyshev_polynomials#Definition

T_(n+1)(x) = 2xT_(n)x - T_(n-1)(x)

Если x - это ваши абсциссы, а y ваши точки данных, сгенерируйте матрицу наблюдений A (это эквивалент матрицы Вандермонда для мономиального базиса) для полиномиальной подгонки степени n, используя:

n = degree;
m = length(x);
%% Generate the z variable as a mapping of your x data range into the 
%% interval [-1,1]

z = ((x-min(x))-(max(x)-x))/(max(x)-min(x));

A(:,1) = ones(m,1);
if n > 1
   A(:,2) = z;
end
if n > 2
  for k = 3:n+1
     A(:,k) = 2*z.*A(:,k-1) - A(:,k-2);  %% recurrence relation
  end
end

то вы можете просто решить линейную систему для ваших параметров решения (коэффициентов аппроксимации) b с помощью деления матрицы

b = A \ y

Здесь вы должны помнить, что когда вы оцениваете свое приближение, вы должны сопоставить значение с интервалом [-1,1] перед его оценкой. Коэффициенты будут действительны только в начальном диапазоне x, указанном вами для аппроксимации. Вы не сможете оценить приближение (в правильном смысле) за пределами вашего исходного диапазона x. Если вы хотите сделать это, вы должны использовать более широкий интервал, чем ваши данные, таким образом, когда вы сопоставляете внутренние точки с использованием преобразования, ваши точки всегда будут лежать в [-1,1], и поэтому оценка вашего приближения действительна. .

Я некоторое время не использовал Matlab, поэтому в новых версиях может быть встроенная функция, которая сделает все это за вас. Это было не так, когда я в последний раз использовал его, и если ничего не помогает, вышеизложенное позволит вам генерировать полиномиальные приближения наименьших квадратов с использованием базиса Чебышева (первого рода)

person mathematician1975    schedule 16.08.2012