Spline Toolbox | ![]() ![]() |
Remez Iteration
Starting from this approximation, we use the Remez algorithm to produce a sequence of splines converging to . This means that we construct new
as the extrema of our current approximation
to
and try again. Here is the entire loop.
We find the new interior as the zeros of
, i.e., the first derivative of
, in several steps. First, we differentiate:
Next, we take the zeros of the control polygon of as our first guess for the zeros of
. For this, we must take apart the spline
Dc
.
The control polygon has the vertices (tstar(i)
,coefs(i)
), with tstar
the knot averages for the spline, provided by aveknt
:
Here are the zeros of the resulting control polygon of Dc
:
This provides already a very good first guess for the actual zeros.
We refine this estimate for the zeros of by two steps of the secant method, taking
tau
and the resulting guess
as our first approximations. First, we evaluate at both sets:
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);
Now come two steps of the secant method. We guard against division by zero by setting the function value difference to 1 in case it is zero. Since is strictly monotone near the sites sought, this is harmless:
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
Now we take these sites as our new tau
,
and check the extrema values of our current approximation there:
is an estimate of how far we are from total leveling.
We construct a new spline corresponding to our new choice of tau
and plot it on top of the old:
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)
Here is the resulting picture.
Figure 2-18: A More Nearly Level Spline
If this is not close enough, one simply reiterates the loop. For this example, the next iteration already produces to graphic accuracy.
![]() | Initial Guess | Example: Approximation by Tensor Product Splines | ![]() |