/
BestTrigApprox.m
111 lines (98 loc) · 3.76 KB
/
BestTrigApprox.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
%% Best trigonometric approximation with `trigremez`
% Mohsin Javed and Nick Trefethen, February 2015
%%
% (Chebfun example fourier/BestTrigApprox.m)
% [Tags: #REMEZ, #TRIGREMEZ, #bestapproximation]
%%
% Chebfun's $\verb|trigremez|$ command can be used to find best
% (i.e. infinity-norm or minimax) trigonometric polynomial
% approximations of a real-valued continuous function on a
% periodic interval. For example, here is a periodic function
% on $[-\pi, \pi]$ and its best approximation by a
% trigonometric polynomial of degree $5$:
f = chebfun(@(x) exp(sin(2*x)+cos(3*x)), [-pi, pi], 'trig');
[p,err] = trigremez(f,5);
plot(f,'k',p,'r')
title('Function (black) and best trigonometric approximation (red)')
%%
% The error equioscillates, and the number of equioscillating
% extreme points is at least one more than the dimension
% of the approximation space. In the
% present case of a degree $5$ trigonometric
% approximation, the dimension of the approximation
% space is $11$, and hence the error curve must have at
% least 12 points of equioscillation:
plot(f-p), hold on
plot([-pi pi], err*[1 1],'--k')
plot([-pi pi],-err*[1 1],'--k')
ylim(5*err*[-1, 1]), hold off
title('Degree 5 trigonometric error curve')
%%
% The $\verb|trigremez|$ command works for any chebfun, even
% a chebfun that is constructed without the `trig` flag, as
% long as it is continuous in the interior of the domain
% and takes the same value at both endpoints. Here is an example:
fh = @(x) 10*abs(x) + sin(20*pi*x) + 10*exp(-50*(x-.1)^2);
f = chebfun(fh, 'splitting', 'on' );
%%
[p, err] = trigremez(f, 8);
plot(f,'k',p,'r')
title('Function (black) and best trigonometric approximation (red)')
%%
% And here is a plot of the error curve:
plot(f-p), hold on
plot([-pi pi], err*[1 1],'--k')
plot([-pi pi],-err*[1 1],'--k')
ylim(5*err*[-1 1]), hold off
title('Degree 8 trigonometric error curve')
%%
% Here is another example where we first define
% a zig-zag function, which is aperiodic, but then
% make it periodic by subtracting off an appropriate linear
% term:
x = chebfun('x');
g = cumsum(sign(sin(20*exp(x))));
m = (g(1) - g(-1))/2;
y = m*(x - 1) + g(1);
f = g - y;
[p, err] = trigremez(f, 15);
plot(f,'k',p,'r')
title('Function (black) and best trigonometric approximation (red)')
%%
% Again, the error plot equioscillates beautifully:
plot(f-p), hold on
plot([-1 1], err*[1 1],'--k')
plot([-1 1],-err*[1 1],'--k')
ylim(5*err*[-1 1]), hold off
title('Degree 15 trigonometric error curve')
%%
% Experienced best approximators are used to seeing error curves that
% look approximately like Chebyshev polynomials, and indeed, there are
% theorems to the
% effect that for functions satisfying appropriate smoothness
% conditions, the best polynomial approximation error curves
% approach Chebyshev polynomials as the degree approaches
% infinity. In trigonometric rather than algebraic best
% approximation, however, the error curves tend to look like
% sine waves, not Chebyshev polynomials. To the experienced
% eye, this can be quite a surprise. The following example illustrates
% this:
f = chebfun('1/(1.01-cos(x))',[-pi,pi],'trig');
plot(f-trigremez(f,40)), ylim([-1 1])
title('Almost sinusoidal error curve')
%%
% The flavor of $\verb|trigremez|$ and the periodic
% Remez algorithm that it utilizes could not be
% more classical. Nevertheless, we are unaware of any
% previous computations of general periodic best
% approximations. Electrical engineers compute
% approximations all the time that appear to be
% periodic---the Parks-McClellan algorithm---but
% because of a symmetry, these computations are
% carried out using the ordinary polynomial
% Remez algorithm.
%% References
%
% 1. M. Javed, _Algorithms for Trigonometric Polynomial
% and Rational Approximation_, DPhil dissertation, University
% of Oxford, 2016.