2026a

# 切比雪夫样条构造



这一章讨论了关于切比雪夫样条构造的以下方面:
  • 什么是切比雪夫样条
  • 样条空间的选择
  • 初始猜测
  • Remez 迭代

# 什么是切比雪夫样条

给定节点序列 t=(ti,i=1:n+k) 的阶数为 k 的切比雪夫样条 为在 中最大模为 1,在区间 具有最大震荡,且在 附近为正的唯一元素。这意味着存在唯一一个严格递增的 n 长度序列 tau 使得由对于所有 i, 给出的函数 上具有最大模 1。这意味着 ,并且对于所有 i,。事实上,对于所有 i,。这意味着这样的节点序列使得这样的不等式不成立,也就是说 的元素连续。

简而言之,切比雪夫样条看上去就像是切比雪夫多项式。它们具有相似的功能。比如,它的边界位点 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]] 为感兴趣的区间 ,其中 n=length(t)-k 为结果样条空间 的维度。同样的节点序列也可以使用

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 已经图像上重合了。