1+ """
2+ .. _fourier_diff :
3+
4+ Fourier Differentiation
5+ ========================================================
6+ An example of usage of our Fourier Differentiation Function on 1d data.
7+ """
8+
9+ # %%
10+ # Import the library
11+ # ------------------
12+ # We first import our `neuralop` library and required dependencies.
13+ import torch
14+ import numpy as np
15+ import matplotlib .pyplot as plt
16+ from neuralop .losses .fourier_diff import fourier_derivative_1d
17+
18+ device = torch .device ("cuda" if torch .cuda .is_available () else "cpu" )
19+
20+
21+
22+ # %%
23+ # Creating an example of periodic 1D curve
24+ # --------------------
25+ # Here we consider sin(x) and cos(x), which are periodic on the interval [0,2pi]
26+ L = 2 * torch .pi
27+ x = torch .linspace (0 , L , 101 )[:- 1 ]
28+ f = torch .stack ([torch .sin (x ), torch .cos (x )], dim = 0 )
29+ x_np = x .cpu ().numpy ()
30+
31+ # %%
32+ # Differentiate the signal
33+ # -----------------------------------------
34+ # We use the Fourier differentiation function to differentiate the signal
35+ dfdx = fourier_derivative_1d (f , order = 1 , L = L )
36+ df2dx2 = fourier_derivative_1d (f , order = 2 , L = L )
37+ df3dx3 = fourier_derivative_1d (f , order = 3 , L = L )
38+
39+
40+ # %%
41+ # Plot the results for sin(x)
42+ # ----------------------
43+ plt .figure ()
44+ plt .plot (x_np , dfdx [0 ].squeeze ().cpu ().numpy (), label = 'Fourier dfdx' )
45+ plt .plot (x_np , np .cos (x_np ), '--' , label = 'dfdx' )
46+ plt .plot (x_np , df2dx2 [0 ].squeeze ().cpu ().numpy (), label = 'Fourier df2dx2' )
47+ plt .plot (x_np , - np .sin (x_np ), '--' , label = 'df2dx2' )
48+ plt .plot (x_np , df3dx3 [0 ].squeeze ().cpu ().numpy (), label = 'Fourier df3dx3' )
49+ plt .plot (x_np , - np .cos (x_np ), '--' , label = 'df3dx3' )
50+ plt .xlabel ('x' )
51+ plt .legend ()
52+ plt .show ()
53+
54+ # %%
55+ # Plot the results for cos(x)
56+ # ----------------------
57+ plt .figure ()
58+ plt .plot (x_np , dfdx [1 ].squeeze ().cpu ().numpy (), label = 'Fourier dfdx' )
59+ plt .plot (x_np , - np .sin (x_np ), '--' , label = 'dfdx' )
60+ plt .plot (x_np , df2dx2 [1 ].squeeze ().cpu ().numpy (), label = 'Fourier df2dx2' )
61+ plt .plot (x_np , - np .cos (x_np ), '--' , label = 'df2dx2' )
62+ plt .plot (x_np , df3dx3 [1 ].squeeze ().cpu ().numpy (), label = 'Fourier df3dx3' )
63+ plt .plot (x_np , np .sin (x_np ), '--' , label = 'df3dx3' )
64+ plt .xlabel ('x' )
65+ plt .legend ()
66+ plt .show ()
67+
68+
69+
70+ # %%
71+ # Creating an example of non-periodic 1D curve
72+ # --------------------
73+ # Here we consider sin(16x)-cos(8x) and exp(-0.8x)+sin(x)
74+ L = 2 * torch .pi
75+ x = torch .linspace (0 , L , 101 )[:- 1 ]
76+ f = torch .stack ([torch .sin (3 * x ) - torch .cos (x ), torch .exp (- 0.8 * x )+ torch .sin (x )], dim = 0 )
77+ x_np = x .cpu ().numpy ()
78+
79+ # %%
80+ # Differentiate the signal
81+ # -----------------------------------------
82+ # We use the Fourier differentiation function with Fourier continuation to differentiate the signal
83+ dfdx = fourier_derivative_1d (f , order = 1 , L = L , use_FC = 'Legendre' , FC_d = 4 , FC_n_additional_pts = 30 , FC_one_sided = False )
84+ df2dx2 = fourier_derivative_1d (f , order = 2 , L = L , use_FC = 'Legendre' , FC_d = 4 , FC_n_additional_pts = 30 , FC_one_sided = False )
85+
86+
87+ # %%
88+ # Plot the results for sin(16x)-cos(8x)
89+ # ----------------------
90+ plt .figure ()
91+ plt .plot (x_np , dfdx [0 ].squeeze ().cpu ().numpy (), label = 'Fourier dfdx' )
92+ plt .plot (x_np , 3 * torch .cos (3 * x ) + torch .sin (x ), '--' , label = 'dfdx' )
93+ plt .plot (x_np , df2dx2 [0 ].squeeze ().cpu ().numpy (), label = 'Fourier df2dx2' )
94+ plt .plot (x_np , - 9 * torch .sin (3 * x ) + torch .cos (x ), '--' , label = 'df2dx2' )
95+ plt .xlabel ('x' )
96+ plt .legend ()
97+ plt .show ()
98+
99+ # %%
100+ # Plot the results for exp(-0.8x)+sin(x)
101+ # ----------------------
102+ plt .figure ()
103+ plt .plot (x_np , dfdx [1 ].squeeze ().cpu ().numpy (), label = 'Fourier dfdx' )
104+ plt .plot (x_np , - 0.8 * torch .exp (- 0.8 * x )+ torch .cos (x ), '--' , label = 'dfdx' )
105+ plt .plot (x_np , df2dx2 [1 ].squeeze ().cpu ().numpy (), label = 'Fourier df2dx2' )
106+ plt .plot (x_np , 0.64 * torch .exp (- 0.8 * x )- torch .sin (x ), '--' , label = 'df2dx2' )
107+ plt .xlabel ('x' )
108+ plt .legend ()
109+ plt .show ()
0 commit comments