Professional Documents
Culture Documents
Sine interpolation
Interpolation of arbitrary series with multiplicative coecients
Scilab codes
Andrej Liptaj
1 Introduction
In my previous text [1] I gave detailed instructions concerning interpolation of data by Fourier series (with choice among
dierent possible cutos in case of even number of points).
interpolation based on pure cosine and sine series. Meanwhile I realized that interpolation for any series with multiplicative
coecients is trivial - probably no surprise for an educated reader. Still, for pedagogical reasons, I give a description of
the latter in a dedicated section and provide Scilab code for all procedures.
2.1 Cosine
We start with a data set
S1 = (xi , yi ).
One can dene a mirror-symmetric (with respect to the
y -axis)
data set
S2 = (xi , yi )
and their union
S = S2 S1
and use the general Fourier interpolation method. Because the set
automatically ltered out from the Fourier series whereas all sine coecients will vanish. The only cumbersomeness which
remains because of the even number of points is, that, depending on the high-frequency cuto, one cosine too much could
a
be present. Indeed, if the number of points is N , we are supposed to have one constant term 0 and N 1 cosine terms.
2
a0
By adding the symmetric data set we get 2N points, which can be described by one
2 term, N cosine and N sine terms
(these ones vanishing) with, however, cuto freedom. Carrying out the cuto properly we can use this freedom to remove
the high-frequency (N -th) cosine. The general procedure for doing it is described in Section 4 of [1]. I refer the reader to
that text for what follows. In case of the high-cosine cuto one has
cN
cN
1
ibn ,
2
1
= ibn ,
2
=
leading to
1
K = ibn
2
Institute of Physics, Bratislava, Slovak Academy of Sciences
I am willing to publish any of my ideas presented on Scribd in a journal, if someone (an editor) judges them interesting enough. Journals in
the
and
p0 + qK =
This results to
K=
1
ibn .
2
p0
.
1+q
With this constant we construct the interpolation polynomial (as described in [1]) and read-out the interpolation coecients. An alternative way of interpreting this procedure is as follows: we add to the symmetrized data set a new point at
x = 0, thus keeping the symmetry and preventing any sine function from appearing, and we
(y -coordinate) so as to make vanish the coecient in front of the highest-frequency cosine.
2.2 Sine
The sine interpolation is straightforward, cumbersomeness-free. We produce an anti-symmetric data set (symmetry w.r.t.
the origin)
S2 = (xi , yi ),
and make the union
S = S2 (0, 0) S1 ,
since each sine interpolation needs to go through the origin. Adding this point (the origin) we get an odd number of data
points which leads to unambiguous Fourier interpolation with vanishing cosine terms. The Scilab code is in Appendix.
FN (x) =
an fn (x)
n=1
can be interpolated through data points using linear algebra. This holds of course on some general conditions, assuming
the functions
fn
xi
with nonzero
yi ,
the method described in this section is equivalent to any other interpolation method. It is of course as genuine as any
special recipe which is based on the properties of the functions
fn .
we apply it for example on the Fourier-type series, it automatically allows for an arbitrary cuto (high-frequency sine or
cosine, symmetric cuto, see [1]) or even for cutting terms inside the series. The only true question when comparing to
other approaches is the computing time (computational complexity).
In this general approach we can forget about details of the functions
at
xi ,
yi
fi,n .
fn ,
These numbers naturally build a matrix, which, when multiplied by the coecient vector
values,
ai ,
fi,n an = yi ,
n
or written with full explicitness
f1 (x1 )
f1 (x2 )
f2 (x1 )
f2 (x2 )
.
.
.
.
.
.
f1 (xN 1 ) f2 (xN 1 )
f1 (xN )
f2 (xN )
One then needs to invert the matrix
(f )i,n
...
...
fN 1 (x1 )
fN 1 (x2 )
..
.
.
.
...
...
a1
a2
.
.
fN (xN 1 ) aN 1
fN (xN )
aN
.
.
.
fN 1 (xN 1 )
fN 1 (xN )
ai =
fN (x1 )
fN (x2 )
f 1
)
i,n
y1
y2
..
= .
yN 1
yN
an
yn .
n=1
The summary is
1 Finding
several text with this topic on internet, I was thinking only in the given direction, forgetting other possibilities. It is maybe pity
that the matrix inversion approach, as a natural way of nding the interpolation, is not mentioned on (most) Web resources related to the
trigonometric interpolation.
fn
in case of the Fourier-series and even number of data points, to cuto the high-frequency cosine, your sequence
1
should end with a high-frequency sine term: f1 =
, f = cos (x), f3 = sin (x), f4 = cos (2x), f5 = sin (2x), ... ,
( N 2 )
( N 2 )
( 2N 12 )
fN 2 = cos 2 x , fN 1 = sin 2 x , fN = sin 2 x .
(f )i,n
)
1
(f )i,n ,
getting
i,n
xi .
yi ,
an
coecients as elements.
4 Closing remarks
For what concerns the interpolation based on trigonometric functions, the symmetrization procedure can lead to
two separate group of points (S1 and
any impact on the interpolation procedure. To concentrate the data (in any case, not only when symmetrizing)
one is completely free to move their
x-coordinates
2 ,
length.
Numerical calculations I have performed seem to suggest that the Fourier series interpolation gets very quickly
numerically unstable with increasing number of data points. It seems to be an intrinsic issue, independent on the
method. The problem starts at such small number of points as 10. I see two possible go-arounds:
Use an arbitrary-precision computation software. Doing this, I was able to interpolate approximately 100 data
points (on a standard computer). I failed at 300 points: the required numerical precision is so high that the
computational time becomes very long.
inversion) the Scilab software contains an implementation of the pseudo-inverse of a matrix with, when desired,
user given precision (the commented line iM = pinv(M)).
Appendix
[ f ]
= interpolation_poly (x , y)
nData = l e n g t h ( x )
atom ( 1 ) = p o l y ( 1 , " x " , " c o e f f " )
for
i =2: nData
atom ( i ) = atom ( i
1) p o l y ( x ( i 1 ) , " x " )
end
poly_interpol = poly (0 ," x " ," c o e f f ")
for
i =1: nData
const = (
y( i )
horner ( poly_interpol , x ( i ) )
) / h o r n e r ( atom ( i ) , x ( i ) )
p o l y _ i n t e r p o l = p o l y _ i n t e r p o l + c o n s t atom ( i )
end
f = poly_interpol
endfunction
/ / COMPUTING COEFFICIENTS
function
[ a ,N]
= t r i g o _ c f s (X, Y)
dim =1;
Z = f l i p d i m (X, dim )
1.0.Z
Z =
x = c a t ( dim , Z , X)
W = f l i p d i m (Y, dim )
y = c a t ( dim ,W, Y)
nDat = l e n g t h ( x )
N = nDat /2
for
i =1: nDat
z ( i )=
e x p ( %i
x ( i
))
Y( i ) = ( z ( i ) ) ^N y ( i )
end
z _ p o l y n o m i a l = i n t e r p o l a t i o n _ p o l y ( z , Y)
//
p0 =
Cut
h i g h f r e q u e n c y
COSINE
c o e f f ( z_polynomial , 0 )
q = 1
for
i =1: nDat
q = q ( z ( i ) )
end
K =
p0 /(1+ q )
cfs
for
END
c o e f f ( z_polynomial )
i =N : N
if
i <0 t h e n
continue
end
coef =
c f s ( i +N+1)
a ( i +1)=2 r e a l ( c o e f )
end
endfunction
/ / COMPUTING TRIGONOMETRIC INTERPOLATION
function
[ f ]
= i n t e r p o l a t i o n _ t r i g o ( x , a , N)
f = a (1)/2
for
i =1:N
f = f + a ( i +1) c o s ( i
x )
end
endfunction
/ / START OF THE PROGRAM FLOW
d a t a S e t = r e a d ( " twoColumnDataFile . dat " , 1 ,2)
nDat = l e n g t h ( d a t a S e t ) / 2
x = dataSet ( : , 1 )
y = dataSet ( : , 2 )
[ a_cfs ,N]
= trigo_cfs (x , y)
d i s p (N)
d i s p ( a _ c f s (N+ 1 ) )
//
should
be
zero
xmin = min ( x )
xmax = max ( x )
dx = ( xmaxxmin ) / 1 0
xmin = xmindx
xmax = xmax+dx
x_ax =
[ xmin : 0 . 0 1 : xmax ]
y_ax = i n t e r p o l a t i o n _ t r i g o ( x_ax , a _ c f s , N)
ymin = min ( y )
ymin = min ( ymin , 0 )
ymax = max ( y )
ymax = max ( ymax , 0 )
dy = ( ymaxymin ) / 1 0 ;
ymin = ymindy
ymax = ymax+dy
p l o t 2 d ( x_ax , y_ax , r e c t =[ xmin , ymin , xmax , ymax ] )
plot (x , y , ' ')
[ f ]
= interpolation_poly (x , y)
nData = l e n g t h ( x )
atom ( 1 ) = p o l y ( 1 , " x " , " c o e f f " )
for
i =2: nData
atom ( i ) = atom ( i
1) p o l y ( x ( i 1 ) , " x " )
end
poly_interpol = poly (0 ," x " ," c o e f f ")
for
i =1: nData
const = (
y( i )
horner ( poly_interpol , x ( i ) )
) / h o r n e r ( atom ( i ) , x ( i ) )
p o l y _ i n t e r p o l = p o l y _ i n t e r p o l + c o n s t atom ( i )
end
f = poly_interpol
endfunction
/ / COMPUTING COEFFICIENTS
function
[ b ,N]
= t r i g o _ c f s (X, Y)
dim =1;
Z = f l i p d i m (X, dim )
Z =
1.0.Z
x = c a t ( dim , Z , 0 , X)
W = f l i p d i m (Y, dim )
W =
1 . 0 . W
y = c a t ( dim ,W, 0 , Y)
nDat = l e n g t h ( x )
N = ( nDat 1)/2
for
i =1: nDat
z ( i )=
e x p ( %i
x ( i
))
Y( i ) = ( z ( i ) ) ^N y ( i )
end
z _ p o l y n o m i a l = i n t e r p o l a t i o n _ p o l y ( z , Y)
cfs
c o e f f ( z_polynomial )
i =N : N
for
if
i <0 t h e n
continue
end
coef =
c f s ( i +N+1)
b ( i +1)=2 imag ( c o e f )
end
endfunction
/ / COMPUTING TRIGONOMETRIC INTERPOLATION
function
[ f ]
= i n t e r p o l a t i o n _ t r i g o ( x , b , N)
f = 0
for
i =1:N
f = f + b ( i +1) s i n ( i
x )
end
endfunction
/ / START OF THE PROGRAM FLOW
d a t a S e t = r e a d ( " twoColumnDataFile . dat " , 1 ,2)
nDat = l e n g t h ( d a t a S e t ) / 2
x = dataSet ( : , 1 )
y = dataSet ( : , 2 )
[ b_cfs ,N]
= trigo_cfs (x , y)
/ / d i s p (N)
// d i s p ( b_cfs )
xmin = min ( x )
xmax = max ( x )
dx = ( xmaxxmin ) / 1 0
xmin = xmindx
xmax = xmax+dx
x_ax =
[ xmin : 0 . 0 1 : xmax ]
y_ax = i n t e r p o l a t i o n _ t r i g o ( x_ax , b _ c f s , N)
ymin = min ( y )
ymin = min ( ymin , 0 )
ymax = max ( y )
ymax = max ( ymax , 0 )
dy = ( ymaxymin ) / 1 0 ;
ymin = ymindy
ymax = ymax+dy
p l o t 2 d ( x_ax , y_ax , r e c t =[ xmin , ymin , xmax , ymax ] )
basicFns .
The code contains a commented line with pseudo-inversion of the matrix (iM = pinv(M)). One can use it in case of
numerical instabilities.
function
n =
if
[ f ]
= basicFns (x , Z)
f l o o r (Z/2)
Z==1 t h e n
f = 1.0
elseif
modulo ( Z,2)==0
then
f = c o s ( nx )
else
f = s i n ( nx )
end
endfunction
function
[M]
= buildMatrix (x , y)
L = length (x)
for
i =1:L
for
j =1:L
M( i , j )= b a s i c F n s ( x ( i ) , j )
end
end
endfunction
function
[ c f s ]= g e t C f s ( x , y )
M = buildMatrix (x , y)
iM = i n v (M)
// iM = p i n v (M)
cfs
= iM y
endfunction
function
[ f ]= g e n I n t e r p o l a t i o n ( x , c f s )
L = length ( c f s )
f = 0
for
i =1:L
f = f +
c f s ( i ) basicFns (x , i )
end
endfunction
= getCfs (x , y)
xmin = min ( x )
xmax = max ( x )
dx = ( xmaxxmin ) / 1 0
xmin = xmindx
xmax = xmax+dx
x_ax =
[ xmin : 0 . 0 1 : xmax ]
y_ax = g e n I n t e r p o l a t i o n ( x_ax , c f s )
ymin = min ( y )
ymin = min ( ymin , 0 )
ymax = max ( y )
ymax = max ( ymax , 0 )
dy = ( ymaxymin ) / 1 0 ;
ymin = ymindy
ymax = ymax+dy
p l o t 2 d ( x_ax , y_ax , r e c t =[ xmin , ymin , xmax , ymax ] )
plot (x , y , ' ')
References
[1] A. Liptaj, Short notice on (exact) trigonometric interpolation, https://www.scribd.com/doc/270904435