# 切比雪夫样条构造
这一章讨论了关于切比雪夫样条构造的以下方面:
- 什么是切比雪夫样条
- 样条空间的选择
- 初始猜测
- Remez 迭代
# 什么是切比雪夫样条
给定节点序列 t=(ti,i=1:n+k) 的阶数为 k 的切比雪夫样条
简而言之,切比雪夫样条看上去就像是切比雪夫多项式。它们具有相似的功能。比如,它的边界位点 tau 是从
可以运行示例构造切比雪夫样条来为一个特别的节点序列 t 构造 C。
# 样条空间的选择
处理三次样条,即,阶数为
using TyCurveFitting
using TyBase
using TyPlot
using TyStatistics
k = 4
并且使用断点序列
breaks = [0, 1, 1.1, 3, 5, 5.5, 7, 7.1, 7.2, 8]
lp1 = length(breaks)
使用简单的内部节点,即使用节点序列
t = breaks[[ones(Int,k);2:(lp1-1);fill(lp1,k)]]
n = length(t)-k
关注每端的四重点。因为 k = 4,这使得 [0..8]=[breaks[1]..breaks[lp1]] 为感兴趣的区间
t, = augknt(breaks,k)
# 初始猜测
作为 tau 的初始猜测,使用节点均值
推荐的好的位点选择由下式生成
tau = aveknt(t,k)
绘制对 C 的第一个初始猜测,即满足对于所有 i,
b = cumprod(fill(-1,n))
b = b.*b[end]
c = spapi(t,tau,b')
fnplt(c,"-.")
grid("on")
这就是结果图像。
对切比雪夫样条的第一次逼近
# Remez 迭代
从这个逼近开始,你可以使用 Remez 算法得到收敛于 C 的样条序列。这意味着你用你当前的对 C 的估计 c 的极值构造新的 tau 然后再次尝试。这就是整个循环。
新的内点 taui 为 Dc 的零点,Dc 为 c 的一阶导。首先,对 c 进行微分
Dc = fnder(c)
使用 fnzeros 得到 Dc 的零点。零点值表示当前迭代的极值点。这个结果就作为 tau 的新猜测。
tau[2:n-1] = mean(fnzeros(Dc),dims=1)
然后检查你当前逼近的极值:
extremes = abs.(fnval(c,tau))
extremes的 极值差
maximum(extremes) - minimum(extremes)
ans = 0.6906044379462033
得到的结果表示你离总水平有多远。
使用 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(size(tau[2:end-1])),"o")
hold("off")
legend(["Initial Guess","Current Guess","Extreme Locations"],loc="south")
接下来就是结果图像。
一个更接近水平的样条
如果这不够接近,可以再进行循环。对于这个例子来说,下一次迭代构造的与 C 已经图像上重合了。