Calcolare trasformata di Fourier numericamente
Ciao a tutti, ho il seguente quesito. Premetto che non sono un esperto di analisi numerica e quindi spero di non dire stupidaggini.
Devo calcolare numericamente $z(k)=(1/{2\pi})int_{-\infty}^{+\infty}exp(-ivk)f(v)\,dv$ dove $z(k)$, per completezza, rappresenta il prezzo di un'opzione con prezzo d'esercizio $k$ e $f(v)=exp(ivrT}(\phi(v-i)-1)/(iv(1+iv))$, $r,T$ sono costanti e $\phi$ rappresenta la funzione caratteristica di una variabile aleatoria.
Numericamente, supponiamo di considerare un inetrvallo $[-a/2,a/2]$ sul quale effettuare l'integrazione. E' possibile approssimarlo usando la regola di Simpson senza ricorrere a DFT o FFT?
Grazie dell'aiuto!
Devo calcolare numericamente $z(k)=(1/{2\pi})int_{-\infty}^{+\infty}exp(-ivk)f(v)\,dv$ dove $z(k)$, per completezza, rappresenta il prezzo di un'opzione con prezzo d'esercizio $k$ e $f(v)=exp(ivrT}(\phi(v-i)-1)/(iv(1+iv))$, $r,T$ sono costanti e $\phi$ rappresenta la funzione caratteristica di una variabile aleatoria.
Numericamente, supponiamo di considerare un inetrvallo $[-a/2,a/2]$ sul quale effettuare l'integrazione. E' possibile approssimarlo usando la regola di Simpson senza ricorrere a DFT o FFT?
Grazie dell'aiuto!
Risposte
Se non vuoi usare la fft puoi usare un qualsiasi metodo di integrazione numerica.
In matlab puoi usare trapz(v,g), dove v è un vettore delle $v$ molto esteso (devi mimare l'integrazione su tutto l'asse reale) e g è l'integranda valutata su v.
In alternativa, puoi usare dei metodi di quadratura. Nel tuo caso, definisci prima la funzione da integrare:
dove f(v) è una funzione da scrivere separatamente (ti basta implementare la formula che riporti).
Poi, per ogni valore di k che desideri calcoli l'integrale con
Questo metodo è migliore del primo perché supporta intervalli di integrazione infiniti ma occhio al risultato perché se l'integranda non è abbastanza well-behaved puoi ottenere cose strane (in genere comunque ti dà degli warning).
Se però cerchi velocità (ad esempio se devi ripetere molte volte l'integrazione), la fft è imbattibile. Fammi indovinare, non la vuoi usare perché se lo fai ottieni delle funzioni che oscillano?
In matlab puoi usare trapz(v,g), dove v è un vettore delle $v$ molto esteso (devi mimare l'integrazione su tutto l'asse reale) e g è l'integranda valutata su v.
In alternativa, puoi usare dei metodi di quadratura. Nel tuo caso, definisci prima la funzione da integrare:
fun = @(v) 1/(2*pi)*exp(-i*v*k).*f(v);
dove f(v) è una funzione da scrivere separatamente (ti basta implementare la formula che riporti).
Poi, per ogni valore di k che desideri calcoli l'integrale con
z = quadgk(fun,-Inf,Inf);
Questo metodo è migliore del primo perché supporta intervalli di integrazione infiniti ma occhio al risultato perché se l'integranda non è abbastanza well-behaved puoi ottenere cose strane (in genere comunque ti dà degli warning).
Se però cerchi velocità (ad esempio se devi ripetere molte volte l'integrazione), la fft è imbattibile. Fammi indovinare, non la vuoi usare perché se lo fai ottieni delle funzioni che oscillano?
Grazie della risposta. In realtà devo prezzare delle opzioni e non ho bisogno di usare la FFT perchè tutte queste hanno maturity differente. Cercavo quindi un metodo (anche non particolarmente veloce, non è una necessità primaria nel mio caso) per calcolare l'integrale!Ti ringrazio della risposta, vedrò di implementare una qualche formula di quadratura in C++ allra!
Buona serata,
Luca
Buona serata,
Luca