\documentclass{beamer}
\usepackage{subcaption}
%\documentclass[ignorenoframetext,handout]{beamer}  % per stampare senza pause
\usetheme{Padova}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsopn}
\usepackage{amsthm}
\usepackage{mathrsfs}
\usepackage{soul}
\usepackage{enumerate}
\usepackage{txfonts}
\usepackage{marvosym}
\usepackage{xcolor}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{multirow}
\usepackage{graphicx}
\usepackage{esvect}
\usepackage{booktabs}
\usepackage{adjustbox}
\usepackage{caption}
\usepackage{tikz}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}
\usetikzlibrary{fillbetween}
\usepackage{listings}
\usepackage{calligra}
\usepackage[T1]{fontenc}
\lstset{basicstyle=\small\ttfamily,
	keywordstyle=\color{blue},
	commentstyle=\color{violet},
	backgroundcolor=\color{lightgray},
	language=[LaTeX]TeX,
	numbers=left, numberstyle=\tiny, frame=single,
	escapeinside={£!}{!£},
	morekeywords={lipsum, alert, pause}
}

\captionsetup{labelformat=empty}

\newtheorem{lem}{Lemma}
\newtheorem{rem}{Remark}
\newtheorem{thm}{Teorema}
\newtheorem{proposition}{Proposition}
\theoremstyle{definition}
% \newtheorem{definition}{Definizione}

\definecolor{blu}{RGB}{0,155,135}
\newcommand{\new}[1]{\textcolor{magenta}{#1}}


\newenvironment{system}%
	{\left\lbrace \begin{array}{@{} l @{} }}%
	{ \end{array}\right.}

\newcommand{\bbR}{\mathbb{R}}
\newcommand{\bbN}{\mathbb{N}}
\newcommand{\bbP}{\mathbb{P}}
\newcommand{\bbZ}{\mathbb{Z}}
\newcommand{\calX}{\mathcal{X}}
\newcommand{\calV}{\mathcal{V}}
\newcommand{\calR}{\mathcal{R}}

\newcommand{\de}{\,\mathrm{d}}
\newcommand{\dist}{\,\mathrm{dist}}
\newcommand{\dx}{\,\mathrm{d} x_1 \ldots \mathrm{d} x_n}

\newcommand{\px}{p(x_1, \ldots, x_n)}
\newcommand{\bs}{\boldsymbol}

\DeclareMathOperator{\ctg}{ctg}
\DeclareMathOperator{\cst}{cst}

\usepackage[tikz]{bclogo}
\presetkeys{bclogo}{
ombre=true,
epBord=2,
couleur = white,
couleurBord = rossoPantano,
arrondi = 0.1,
logo= 
}{}

\definecolor{azzurro}{RGB}{0,155,135}
\newcommand{\gel}[1]{\textcolor{azzurro}{#1}}


\title[{\small{QUADRATURA SUBPERIODICA IN PYTHON}}\hspace{2em}\insertframenumber/
\inserttotalframenumber]{QUADRATURA SUBPERIODICA IN PYTHON}

\author{MATTIA STORGATO}
\institute{Universit\`a degli Studi di Padova}
\date{Laurea Triennale in Matematica \\ 19/09/2025}

\begin{document}

\frame{\titlepage}




\begin{frame}{Introduzione}

In questo lavoro implementiamo un algoritmo per il calcolo di formule di quadratura trigonometrica subperiodica in Python. 

{\vspace{0.25cm}}

Ci\'o significa determinare nodi $\{x_i\}_{i=1,\ldots,n+1}$ e pesi $\{w_i\}_{i=1,\ldots,n+1}$ tali che
$$
\int_{\alpha}^{\beta} f(x) dx = \sum_{k=1}^{n+1} w_i f(x_i), {\hspace{0.3cm}} [\alpha,\beta] \subseteq [0,2\pi]
$$
per ogni $f$ appartenente allo spazio ${\mathbb{T}}_n$ dei polinomi trigonometrici di grado $n$.

\begin{itemize}

\item Analizzaremo la sua implementazione nei codici \texttt{trigauss} in Matlab, offrendo una traduzione in Python come alternativa. 

\item Dopo aver verificato l'equivalenza numerica delle formule univariate implementate nei due sistemi di calcolo, valuteremo una applicazione di \texttt{trigauss} legata al calcolo di integrali in certi domini bivariati.

\end{itemize}
\end{frame}



\begin{frame}{Quadratura subperiodica}
    Fissati $0\leq \alpha < \beta \leq 2\pi$ e posto $\omega=\frac{\beta-\alpha}{2}$, siano $\{\xi_j,\lambda_j\}_{1\leq j\leq n+1}$ i nodi e i pesi  della formula di  Gaussiana per la funzione peso sono
    \begin{equation}
     w(x)=\frac{2\sin(\omega/2)}{\sqrt{1-x^2\sin^2(\omega/2)}}, \quad x\in(-1,1).
     \label{ftp}
\end{equation} \pause

Definiti
\begin{equation}
    \theta_j=2\arcsin(\xi_j\sin(\omega/2)) \in(-\omega,\omega),\quad j=1,2,...,n+1, \quad \omega=\frac{\beta-\alpha}{2}
    \label{trasf:angoli}
\end{equation}
si ha che 
\begin{equation}
    \int_\alpha^\beta f(\theta)d\theta=\sum^{n+1}_{j=1} \lambda_jf(\theta_j+\mu), \quad  \quad \mu=\frac{\alpha+\beta}{2},
\end{equation} 
per ogni $f \in {\mathbb{T}}_n$.
\end{frame}


\begin{frame}{Implementazione}
    Nella fase di implementazione vogliamo trovare nodi e pesi di quadratura in modo efficiente. Come proposto in 
    \begin{center}
    G. Da Fies, M. Vianello, Trigonometric Gaussian quadrature on subintervals of the period, \\ Electron. Trans. Numer. Anal. 39 (2012), 102-112. 
    \end{center}
    \pause
    utilizziamo:
    \begin{itemize}
    \item Algoritmo di Chebyshev modificato, che sfrutta il momento misto:
    \begin{equation}
    \sigma_{k,l}=\int_{\alpha}^{\beta}\pi_k(x)p_l(x)w(x)dx.
    \label{mom:misto}
    \end{equation}
    \pause
    \item Algoritmo di Golub-Welsch, che partendo dai coefficienti di ricorsione di una famiglia di polinomi ortogonali ricava i pesi e nodi della formula gaussiana associata a $w$.
    
    \end{itemize}
\end{frame}


\begin{frame}{Test su intervalli univariati}
    Per confrontare i codici scritti nei due linguaggi abbiamo fatto dei test su due intervalli univariati, esprimendo 
    
    \begin{itemize}
    \item il massimo errore su nodi e pesi:
    \begin{equation}\begin{split}
        E_{nodi}&=||x^{(m)}-x^{(p)}||_{\infty}, \\
        \end{split}
    \end{equation} 
    
\noindent dove $(x^{(m)},w^{(m)})$, $(x^{(p)},w^{(p)})$ sono i nodi e i pesi rispettivamente in Matlab e in Python;
    
    \item l'errore relativo $\tilde E=\frac{\left| I-I^{(p)}_n\right|}{I}$ dove fissato $n$
    \begin{eqnarray}
    f(x)&=&5+\frac{1}{2}\sin(17x)-6\cos(14x) ,\nonumber \\
        I&=&\int_{\pi/6}^{\pi/4} f(x) dx \approx 2.062453518370601, \nonumber \\
        I^{(p)}_n&=& \sum_{i=1}^{n+1} w^{(p)}_{i} f(x^{(p)}_{i}). \nonumber
    \end{eqnarray}
\end{itemize}
\end{frame}

\begin{frame}{Risultati}
\begin{table}[htbp]
    \centering
    \begin{tabular}{|c|p{4cm}|p{4cm}|}
    \hline
    $n$ & \makebox[4cm][c]{$E_{nodi}$} & \makebox[4cm][c]{$E_{pesi}$ } \\
    \hline
    5 & \makebox[4cm][c]{$0$} & \makebox[4cm][c]{$9.02\times10^{-17}$} \\
    \hline
    10 & \makebox[4cm][c]{$1.11\times10^{-16}$} & \makebox[4cm][c]{$1.35\times10^{-16}$} \\
    \hline
    15 & \makebox[4cm][c]{$1.11\times10^{-16}$} & \makebox[4cm][c]{$1.70\times10^{-16}$} \\
    \hline
    20 & \makebox[4cm][c]{$0$} & \makebox[4cm][c]{$4.51\times10^{-17}$} \\
    \hline
    \end{tabular}
    \caption{Massimi errori nei nodi e nei pesi, tra le formule ottenute in Matlab e Python, relativamente al primo intervallo $(\pi/6,\pi/4)$.}
    \label{tab:1.1}
\end{table}
\begin{table}[H]
    \centering
    \begin{tabular}{|c|p{4cm}|p{4cm}|}
    \hline
    $n$ & \makebox[4cm][c]{$E_{assoluto}$} & \makebox[4cm][c]{$E_{relativo}$} \\
    \hline
    5 & \makebox[4cm][c]{$1.78\times10^{-15}$} & \makebox[4cm][c]{$3.31\times10^{-11}$} \\
    \hline
    10 & \makebox[4cm][c]{$4.44\times10^{-16}$} & \makebox[4cm][c]{$6.46\times10^{-16}$} \\
    \hline
    15 & \makebox[4cm][c]{$8.88\times10^{-16}$} & \makebox[4cm][c]{$1.51\times10^{-15}$} \\
    \hline
    20 & \makebox[4cm][c]{$4.44\times10^{-16}$} & \makebox[4cm][c]{$1.29\times10^{-15}$} \\
    \hline
    \end{tabular}
    \caption{Errori relativi agli integrali calcolati sul primo intervallo $(\pi/6,\pi/4)$.}
    \label{tab:1.2}
\end{table}

    
\end{frame}



\begin{frame}{Blending lineare di archi ellittici}
Una applicazione \`e il calcolo di formule algebriche, con grado di precisione fissato su domini {\it{blending lineare di archi ellittici}}.

\vspace{0.1cm}

Date 2 curve 
\begin{eqnarray}
P(\theta)&=&A_1\cos(\theta)+B_1\sin(\theta)+C_1 \nonumber \\
Q(\theta)&=&A_2\cos(\theta)+B_2\sin(\theta)+C_2  \nonumber
\end{eqnarray}
con $A_i, B_i, C_i \in {    \mathbb{R}}^2$, $i=1,2$, definiamo il dominio
    $$
    \Omega=\{(x,y)=U(t,\theta)=tP(\theta)+(1-t)Q(\theta),\; (t,\theta)\in [0,1]\times [\alpha,\beta]\}.
$$ 
\end{frame}



\begin{frame}{Blending lineare di archi ellittici}

\begin{figure}[h]
\centering
\begin{subfigure}{0.2\textwidth}
\centering
\begin{tikzpicture}[scale=0.8]
 \fill[gray!20, draw=black] plot[domain=-30:30, samples=100, variable=\x] ({3*cos(\x)}, {3*sin(\x)}) -- (0,0) -- cycle;

\end{tikzpicture}
\end{subfigure}
\begin{subfigure}{0.3\textwidth}
\centering
\begin{tikzpicture}[scale=0.8]
  \fill[gray!20, draw=black] (60:-2) arc (-60:60:2) -- cycle;

\end{tikzpicture}
\end{subfigure}

{\vspace{0.3cm}}
\caption{Esempi di domini che sono blending lineare di archi ellittici. A sinistra un settore circolare, a destra un segmento circolare.}
\end{figure}

\end{frame}

\begin{frame}{Formula di quadratura per linear blending di archi {ellittici}}
In 
\begin{center}
    G. Da Fies, A. Sommariva, M. Vianello, Algebraic cubature by linear blending of elliptical arcs, \\ Applied Numerical Mathematics, 74 (2013), 49-61. 
\end{center}

{\vspace{0.3cm}}

\noindent gli autori hanno descritto come, utilizzando {\tt{trigauss}}, si possano ottenere su domini di questo tipo formule di cubatura a nodi interni, pesi positivi e grado di precisione fissato, proponendo dei codici Matlab.

{\vspace{0.3cm}}

\noindent Abbiamo tradotto le relative routines in Python e verificato che corrispondano numericamente a quelle implementate nell'articolo sopracitato.
\end{frame}



\begin{frame}{Esempio 1}

Quale primo esempio consideriamo un segmento circolare $\Omega_1$ (linear blending di due archi $P$ e $Q$).

{\vspace{0.3cm}}

Utilizziamo la routine \texttt{gqcircsegm} per produrre una formula di grado di precisione $n$ con cardinalità di $\lceil \tfrac{n+1}{2} \rceil \cdot \lceil \tfrac{n+2}{2} \rceil$ e pesi positivi.


    \begin{figure}[H]
    \centering
    \begin{tikzpicture}[scale=0.6]
    \begin{axis}[
        axis equal,
        axis lines=middle,
        %xlabel={$x$},
        %ylabel={$y$},
        ticks=none
    ]

% Area riempita tra ellissi
    \addplot [
        domain=0:60,
        samples=200,
        name path=A
    ] ({cos(x)},{sin(x)});

    \addplot [
        domain=0:60,
        samples=200,
        name path=B
    ] ({cos(x)},{-sin(x)});

    \addplot [
        fill=blue!25, opacity=0.4
    ] fill between[of=A and B];

% Contorno ellissi
    \addplot[domain=0:60,samples=200,thick,blue] ({cos(x)},{sin(x)}) node[pos=0.05,anchor=south east] {$Q$};
    \addplot[domain=0:60,samples=200,thick,red] ({cos(x)},{-sin(x)}) node[pos=0.05,anchor=north east] {$P$};

    \addplot[only marks,blue,mark=*,mark size=1.5pt] 
                coordinates {(0.5383  ,  0.6528) (0.6807  ,  0.5675) (0.8603  ,  0.3949) (0.9829  ,  0.1426) (0.5383 ,   0.0000) (0.6807 ,   0.0000) (0.8603 ,   0.0000) (0.9829 ,   0.0000) (0.5383  , -0.6528) (0.6807 ,  -0.5675) (0.8603 ,  -0.3949) (0.9829  , -0.1426)};

    \end{axis}
    \end{tikzpicture}
    \label{fig:blending2}
    \caption{Segmento circolare e formula di grado 5.}
\end{figure}
\end{frame}

\begin{frame}{Esempio 1}
Approssimiamo con le formule indicate $$I=\int_{\Omega_1} x-y^3+x^7y \quad dx dy$$ sul dominio bivariato. 

\vspace{0.5cm}
\begin{table}[H]
    \centering
    \begin{tabular}{|c|c|p{4cm}|p{4cm}|}
    \hline
    $n$ &nodi& \makebox[4cm][c]{$E_{assoluto}$} & \makebox[4cm][c]{$E_{relativo}$} \\
    \hline
    5 &12& \makebox[4cm][c]{$1.13\times10^{-16}$} & \makebox[4cm][c]{$5.13\times10^{-16}$} \\
    \hline
    10 &36& \makebox[4cm][c]{$2.56\times10^{-16}$} & \makebox[4cm][c]{$3.85\times10^{-16}$} \\
    \hline
    15 & 72&\makebox[4cm][c]{$3.89\times10^{-16}$} & \makebox[4cm][c]{$2.18\times10^{-15}$} \\
    \hline
    20 &121& \makebox[4cm][c]{$3.41\times10^{-16}$} & \makebox[4cm][c]{$6.41\times10^{-16}$} \\
    \hline
    \end{tabular}
    \caption{Errori relativi all'approssimazione di $I$, calcolati sul segmento circolare generato da linear blending, al variare di $n$.}
    \label{tab:2.3}
\end{table}

\end{frame}

\begin{frame}{Esempio 2}
Come secondo esempio consideriamo una sezione di una corona circolare $\Omega_2$ (linear blending di due archi $P$ e $Q$). 

{\vspace{0.3cm}}

Utilizziamo la routine \texttt{gqcircsect} che determina formule di cardinalità $\lceil \tfrac{n+2}{2} \rceil \cdot (n+1)$ e grado di precisione $n$.
    \begin{figure}[H]
    \centering
    \begin{tikzpicture}[scale=0.6]
    \begin{axis}[
        axis equal,
        axis lines=middle,
        %xlabel={$x$},
        %ylabel={$y$},
        ticks=none
    ]

% Area riempita tra ellissi
    \addplot [
        domain=-30:30,
        samples=200,
        name path=A
    ] ({cos(x)},{sin(x)});

    \addplot [
        domain=-30:30,
        samples=200,
        name path=B
    ] ({3*cos(x)},{3*sin(x)});

    \addplot [
        fill=blue!25, opacity=0.4
    ] fill between[of=A and B];

% Contorno ellissi
    \addplot[domain=-30:30,samples=200,thick,blue] ({cos(x)},{-sin(x)}) node[pos=0.05,anchor=south east] {$Q$};
    \addplot[domain=-30:30,samples=200,thick,red] ({3*cos(x)},{-3*sin(x)}) node[pos=0.7,anchor=north east] {$P$};

    \addplot[only marks,blue,mark=*,mark size=1.5pt] 
                coordinates {(1.1034  , -0.5330) (1.2063 ,  -0.2155) (1.2063 ,   0.2155) (1.1034   , 0.5330) (1.8009 ,  -0.8699) (1.9688 ,  -0.3518) (1.9688 ,   0.3518) (1.8009  ,  0.8699) (2.4984 ,  -1.2068) (2.7313,   -0.4880) (2.7313  ,  0.4880) (2.4984   , 1.2068) };

    \end{axis}
    \end{tikzpicture} 
    \caption{Formula di grado 3 sulla sezione di una corona circolare $\Omega_2$.}
\end{figure}



\end{frame}


\begin{frame}{Esempio 2}
    \begin{table}[H]
    \centering
    \begin{tabular}{|c|c|p{4cm}|p{4cm}|}
    \hline
    $n$ &nodi& \makebox[4cm][c]{$E_{assoluto}$} & \makebox[4cm][c]{$E_{relativo}$} \\
    \hline
    5 &24& \makebox[4cm][c]{$2.56\times10^{-13}$} & \makebox[4cm][c]{$7.09\times10^{-14}$} \\
    \hline
    10 &66& \makebox[4cm][c]{$1.55\times10^{-13}$} & \makebox[4cm][c]{$3.98\times10^{-14}$} \\
    \hline
    15 &144& \makebox[4cm][c]{$1.88\times10^{-13}$} & \makebox[4cm][c]{$8.42\times10^{-14}$} \\
    \hline
    20 &231& \makebox[4cm][c]{$1.20\times10^{-13}$} & \makebox[4cm][c]{$2.37\times10^{-14}$} \\
    \hline
    \end{tabular}
    \caption{Errori relativi all'approssimazione di  $I=\int_{\Omega_2} x-y^3+x^7y \quad dx dy$, al variare di $n$.}
\end{table}

\end{frame}

\begin{frame}{Confronto tempi di calcolo}
    Per concludere il lavoro abbiamo paragonato i tempi di calcolo nei due sistemi.

{\vspace{0.3cm}}
    
    Si riscontra una maggiore rapidità in Matlab ma i risultati Python sono comunque rimasti sull'ordine di $10^{-2}$. {Elenchiamo} i risultati ottenuti relativamente al primo dominio di tipo linear blending.
    
    \begin{table}[H]
    \centering
    \begin{tabular}{|c|p{4cm}|p{4cm}|}
    \hline
    $n$ & \makebox[4cm][c]{$t_p [s]$} & \makebox[4cm][c]{$t_m [s]$} \\
    \hline
    5 & \makebox[4cm][c]{1.07 $\times 10^{-3}$} & \makebox[4cm][c]{3.31 $\times 10^{-4}$} \\
    \hline
    10 & \makebox[4cm][c]{1.80 $\times 10^{-3}$} & \makebox[4cm][c]{3.06 $\times 10^{-4}$} \\
    \hline
    15 & \makebox[4cm][c]{5.69 $\times 10^{-3}$} & \makebox[4cm][c]{3.41 $\times 10^{-4}$} \\
    \hline
    20 & \makebox[4cm][c]{7.22 $\times 10^{-3}$} & \makebox[4cm][c]{4.55 $\times 10^{-4}$} \\
    \hline
    \end{tabular}
    \caption{Tempi medi di applicazione $t_p$, $t_m$ del programma \texttt{gqcircsegm} nei 2 linguaggi (rispettivamente Python e Matlab).}
    
\end{table}
\end{frame}



\begin{frame}
  \centering
  
  \calligra{\textcolor{white}{\Huge{Grazie!}}}
\end{frame}



\begin{frame}{Appendice: Formula di cubatura per domini linear blending di archi ellittici}

    \begin{equation*}
\iint_{\Omega} f(x, y) \, dx  dy = I_n(f) =
\sum_{j=1}^{n + k + 1} \sum_{i=1}^{\left\lceil \frac{n + h + 1}{2} \right\rceil}
W_{ij} \, f(x_{ij}, y_{ij}), \quad \forall f \in \mathbb{P}^2_n
\label{formula:int}
\end{equation*}
\begin{equation*}
(x_{ij}, y_{ij}) = U(t^{GL}_i, \theta_j + \mu),
\qquad
W_{ij} = \left| \det JU\big(t^{GL}_i, \theta_j + \mu\big) \right| \, \omega^{GL}_i \, \lambda_j,
\end{equation*}
dove $\{(\theta_j + \mu, \lambda_j)\}$ sono i nodi e i pesi della formula Gaussiana trigonometrica su $[\alpha, \beta]$,  
e $\{(t^{GL}_i, \omega^{GL}_i)\}$ i nodi e i pesi della formula di Gauss-Legendre su $[0, 1]$. \pause
\\ Paragoniamo i 2 linguaggi nel calcolo di 
\begin{equation}
    \int_{-\omega}^{\omega}\int_{r_1}^{r_2}g(r,\theta)r\;dr\;d\theta,
\end{equation} con $g(r,\theta)=f(r  \cos(\theta), r  \sin(\theta))$.
\end{frame}

\end{document}