В этом разделе рассматриваются эти аспекты Чебышевской конструкции сплайна:
Чебышевский сплайн C =Ct=Ck, t порядка k для последовательности узла t = (t i: i =1:n+k), уникальный элемент S k, t макс. нормы 1, который максимально колеблется на интервале [t k.. t n +1] и положителен около t n +1. Это означает, что существует уникальный строго увеличивающийся n - последовательность τ так, чтобы функциональный C =Ct∊Sk, t, данный C (τi) = (–1) n – 1, весь i, имел макс. норму 1 на [t k.. t n +1]. Это подразумевает что τ1=tk, τn=tn+1, и что t i <τi <t k +i, для всего i. На самом деле, t i+1 ≤ τi ≤ t i +k–1, весь i. Это поднимает точку, что последовательность узла принята, чтобы сделать такое неравенство возможным, т.е. элементы S k, t принят, чтобы быть непрерывным.
Короче говоря, Чебышевский сплайн взгляды C точно так же, как Полином Чебышева. Это выполняет подобные функции. Например, его экстремальные сайты τ являются особенно хорошими сайтами, чтобы интерполировать в от S k, t, потому что норма получившегося проектора является почти столь маленькой, как может быть; смотрите команду тулбокса chbpnt
.
Можно запустить Конструкцию в качестве примера Чебышевского Сплайна, чтобы создать C для конкретной последовательности узла t.
Вы имеете дело с кубическими сплайнами, i.e., с порядком
k = 4;
и используйте последовательность пропуска
breaks = [0 1 1.1 3 5 5.5 7 7.1 7.2 8]; lp1 = length(breaks);
и используйте простые внутренние узлы, i.e., используйте последовательность узла
t = breaks([ones(1,k) 2:(lp1-1) lp1(:,ones(1,k))]); n = length(t)-k;
Отметьте четырехкратный узел в каждом конце. Поскольку k = 4
, это делает [0.. 8] = [breaks(1)
.. breaks
(lp1
)] интервал [t k.. t n +1] интереса, с n = length(t)
K
размерность получившегося пробела сплайна S k, t. Та же последовательность узла была бы предоставлена
t=augknt(breaks,k);
Как исходное предположение для τ, используйте средние значения узла
рекомендуемый как хороший выбор сайта интерполяции. Они предоставляются
tau=aveknt(t,k);
Постройте получившееся первое приближение к C, т.е. сплайн c, который удовлетворяет c (τi) = (–1) n-–i, весь i:
b = cumprod(repmat(-1,1,n)); b = b*b(end); c = spapi(t,tau,b); fnplt(c,'-.') grid
Вот получившийся график.
Первое приближение к чебышевскому сплайну
Начиная с этого приближения, вы используете алгоритм Remez, чтобы произвести последовательность сплайнов, сходящихся к C. Это означает, что вы создаете новый τ как экстремальное значение вашего текущего приближения c к C и попробовали еще раз. Вот целый цикл.
Вы находите новую внутреннюю часть τi как нули Dc, т.е. первая производная c, на нескольких шагах. Во-первых, дифференцируйтесь:
Dc = fnder(c);
Затем возьмите нули многоугольника управления Dc как ваше первое предположение для нулей Dc. Для этого необходимо демонтировать сплайн Dc
.
[knots,coefs,np,kp] = fnbrk(Dc,'knots','coefs','n','order');
Многоугольник управления имеет вершины (tstar(i)
, coefs(i)
), с tstar
средние значения узла для сплайна, обеспеченного aveknt
:
tstar = aveknt(knots,kp);
Вот нули получившегося многоугольника управления Dc
:
npp = (1:np-1); guess = tstar(npp) -coefs(npp).*(diff(tstar)./diff(coefs));
Это уже обеспечивает очень хорошее первое предположение для фактических нулей.
Совершенствуйте эту оценку для нулей Dc двумя шагами метода секущей, беря tau
и получившийся guess
как ваши первые приближения. Во-первых, оцените Dc в обоих наборах:
sites = tau(ones(4,1),2:n-1); sites(1,:) = guess; values = zeros(4,n-2); values(1:2,:) = reshape(fnval(Dc,sites(1:2,:)),2,n-2);
Теперь приезжайте два шага метода секущей. Вы принимаете меры против деления на нуль путем установки различия в значении функции для 1 в случае, если это - нуль. Поскольку Dc является строго монотонным около разыскиваемых сайтов, это безопасно:
for j=2:3 rows = [j,j-1];Dcd=diff(values(rows,:)); Dcd(find(Dcd==0)) = 1; sites(j+1,:) = sites(j,:) ... -values(j,:).*(diff(sites(rows,:))./Dcd); values(j+1,:) = fnval(Dc,sites(j+1,:)); end
Проверка
max(abs(values.')) ans = 4.1176 5.7789 0.4644 0.1178
показывает улучшение.
Теперь возьмите эти сайты в качестве своего нового tau
,
tau = [tau(1) sites(4,:) tau(n)];
и проверяйте экстремальные значения своего текущего приближения там:
extremes = abs(fnval(c, tau));
Различие
max(extremes)-min(extremes) ans = 0.6905
оценка того, как далеко вы от общего выравнивания.
Создайте новый сплайн, соответствующий новому выбору tau
и постройте его сверху старого:
c = spapi(t,tau,b); sites = sort([tau (0:100)*(t(n+1)-t(k))/100]); values = fnval(c,sites); hold on, plot(sites,values)
Следующий код включает сетку и строит местоположения экстремального значения.
grid on plot( tau(2:end-1), zeros( 1, np-1 ), 'o' ) hold off legend( 'Initial Guess', 'Current Guess', 'Extreme Locations',... 'location', 'NorthEastOutside' );
Следующее является получившейся фигурой (легенда, не показанная).
Более близко сплайн уровня
Если это не достаточно близко, каждый просто повторяет цикл. В данном примере следующая итерация уже производит C для графической точности.