---
# System prepended metadata

title: 9-0. Chebyshev approximations - Coefficients
tags: [Spectral method]

---

---
title: 9-0. Chebyshev approximations - Coefficients
tags: Spectral method
---

**Textbook**
1. [Spectral method in Matlab](https://people.maths.ox.ac.uk/trefethen/spectral.html) by *Lloyd N. Trefethen*
2. [Finite difference and Spectral methods](https://people.maths.ox.ac.uk/trefethen/pdetext.html) by *Lloyd N. Trefethen*
3. A practical guide to pseudospectral method by *Bengt Fornberg*

---

## Examples in `Matlab`

### Example 1: 

Consider $f(x) = x^5$, the corresponding Chebyshev coefficients are $f_k=[0, \frac{5}{8}, 0, \frac{5}{16}, 0, \frac{1}{16}]$


#### Method 1: `Matlab`

Chebyshev points of the second kind:

```Matlab=
% generate grid points
N = 5;
x = cos((0:N)*pi/N)';

% evaluate at grid points
f = x.^5;

% extend the function and take scaled FFT
f_extend = [f; f(N:-1:2)];
f_hat = fft(f_extend)/(2*N);

% obtain the Chebyshev coefficients
a = zeros(N+1,1);
a(1) = real(f_hat(1));
a(2:N) = 2*real(f_hat(2:N));
a(N+1) = real(f_hat(N+1));

% Clenshaw–Curtis weights
w = zeros(1,N+1);
if(mod(N,2)==0)
    M = N/2;
else
    M = (N-1)/2;
end
w(1:2:end) = 2./(1-4*(0:M).^2);

% Clenshaw–Curtis quadrature
w*a
```

##### Clenshaw–Curtis weights

```Matlab=
N=25;

w = zeros(1,N+1);
if(mod(N,2)==0)
    M=N/2;
else
    M = (N-1)/2;
end
w(1:2:end) = 2./(1-4*(0:M).^2);

w2 = [w, w(N:-1:2)];
CCW = ifft(w2');
CCW = [CCW(1), 2*CCW(2:N)', CCW(N+1)];
```


#### Method 2: `Matlab`

Chebyshev points of the second kind:

```Matlab=
% generate grid points
N = 5;
x = -sin((-N:2:N)'*pi/(2*N));

% evaluate at grid points
f = x.^5;

% extend the function and take scaled FFT
f_extend = [f; f(N:-1:2)];
f_hat = fft(f_extend)/(2*N);

% obtain the Chebyshev coefficients
a = zeros(N+1,1);
a(1) = real(f_hat(1));
a(2:N) = 2*real(f_hat(2:N));
a(N+1) = real(f_hat(N+1));
```

#### Method 2: `Julia`

Chebyshev points of the second kind:

```Julia=
# generate grid points
N = 5;
x = -sin.((-N:2:N)*pi/(2*N));

# evaluate at grid points
f = x.^5;

# extend the function and take scaled FFT
f_extend = [f; f[N:-1:2]];
f_hat = real(fft(f_extend)./(2*N));

# obtain the Chebyshev coefficients
a = zeros(N+1,1);
a[1] = real(f_hat[1]);
a[2:N] = 2*real(f_hat[2:N]);
a[N+1] = real(f_hat[N+1]);
```

#### Method 3: `Matlab`

Chebyshev points of the first kind using `dct`:

```Matlab=
% generate grid points
N = 5;
x = sin((N:-2:-N)'*pi/(2*(N+1)));

% evaluate at grid points
f = x.^5;

% Use DCT to obtain the Chebyshev coefficients
a = dct(f);
a(1) = a(1)/sqrt(N+1);
a(2:end)=a(2:end)/sqrt((N+1)/2);
```
