Aiuto programma serie di fourier

Mega-X
PREMESSA:
Ho messo il topic su Università per attrarre l'attenzione, anche se in realtà dovevo metterlo nella sezione Informatica, abbiate pietà di un povero essere mortale! :-D

Se mi date una mano vi voglio bene.. :wink:

Ho un problema con questo programma (scritto in Visual Basic), che come si intuisce dal titolo da una lista di funzioni periodiche che vengono sviluppate in serie di fourier.

Il problema è questo, quando vado a disegnare la forma d'onda di una funzione resa da me periodica in un intervallo $[I, S]$, se accade che $I = -S$ ovvero il periodo è simmetrico è tutto OK, riesco a visualizzare la forma d'onda correttamente.

I problemi vengono quando $I != -S$, cioè la forma d'onda viene visualizzata correttamente, però viene spostata verso sopra quando $I > -S$ e verso sotto quando $I < -S$, e il fenomeno aumenta con l'aumentare del numero di armoniche sommate :shock:.

Anzitutto vediamo se sbaglio già in partenza, così almeno vi risparmio un bel pò di lettura.. :wink:

Una funzione $f(x)$ periodica $2\pi$ si può rappresentare come somma di un armonica fondamentale $a_0$ e una somma di seni e di coseni, moltiplicati rispettivamente per degli opportuni coefficienti $a_n$ e $b_n$.

Ora se il periodo risulta essere $P = S - I$ possiamo effettuare la seguente posizione:

$x = \frac{P}{2\pi} t$ ottenendo $f(x) = f(\frac{P}{2\pi}t)$

ottenendo

$a_n = \frac{1}{\pi} \int_{-\pi}^{+\pi} f(\frac{Pt}{2\pi})cos(nt)dt$
$b_n = \frac{1}{\pi} \int_{-\pi}^{+\pi} f(\frac{Pt}{2\pi})sin(nt)dt$

Effettuando la sostituzione $t = 2\pi\frac{x}{P}$, $dt = 2\pi \frac{dx}{P}$ abbiamo:

$a_{n} = \frac{2}{P} \int_{I}^{S} f(x) cos(2n\pi \frac{x}{P}) dx$
$b_{n} = \frac{2}{P} \int_{I}^{S} f(x) sin(2n\pi \frac{x}{P}) dx$

Se non ho sbagliato la teoria fino ad ora l'errore magari sarà o nei calcoli o nella stesura del codice.. :shock:

Prendiamo in esempio l'onda a dente di sega, perchè risulta più facile calcolare i coefficienti $a_0$, $a_n$ e $b_n$

Ecco i calcoli dei 3 coefficienti:

Anzitutto la funzione a dente di sega è così formalmente definita $f(x) = {(),(x " per " I + (S-I)i <= x < S + (S-I)i),():}, i in ZZ$

Dunque calcoliamoci per prima l'armonica fondamentale:

$a_0 = \frac{2}{S-I}\int_{I}^{S} xdx = \frac{2}{S-I}[ \frac{x^{2}}{2}]_{I}^{S} = \frac{2}{S-I}*\frac{S^2-I^2}{2} = \frac{S^2-I^2}{S-I}$

E fin qui non dovrebbero esserci errori...

Ora calcoliamoci le armoniche dispari e pari, ovvero $a_n$ e $b_n$:

$a_n = \frac{2}{S-I} \int_{I}^{S} xcos(\frac{2\pi}{S-I}nx)$ (1)

poniamo $t = \frac{2\pi}{S-I}$

$x = \frac{S-I}{2n\pi}t$
$dx = \frac{S-I}{2n\pi}dt$

Sostituendo nella (1)

$a_n = \frac{2}{S-I} \int_{I}^{S} \frac{S-I}{2n\pi} t cos(t) \frac{S-I}{2n\pi} dt$
$a_n = \frac{2}{S-I} \frac{S-I}{2n\pi} \frac{S-I}{2n\pi} \int_{I}^{S} t cos(t) dt$
$a_n = \frac{S-I}{2\pi^2n^2} \int_{I}^{S} t cos(t) dt$ (2)

Calcoliamoci $\int_{I}^{S} t cos(t) dt$

Prendendo $cos(t) dt$ come fattore differenziale possiamo integrare per parti nel seguente modo:

$\int_{I}^{S} t cos(t) dt = [t sin(t)]_{I}^{S} - \int_{I}^{S} sin(t) dt = [t sin(t)]_{I}^{S} + [cos(t)]_{I}^{S}$

Sostituendo il valore originario di $t$ ovvero $t = \frac{2\pi}{S-I}$ otteniamo (Forse l'errore è proprio qua :shock:):

$[\frac{2\pi}{S-I}nxsin(\frac{2\pi}{S-I}nx)]_{I}^{S} + [cos(\frac{2\pi}{S-I}nx)]_{I}^{S}$

Sostituendo e aggiustando un pò abbiamo:

$\frac{2\pi}{S-I}[nSsin(\frac{2\pi}{S-I}nS) - nIsin(\frac{2\pi}{S-I}nI)]+[cos(\frac{2\pi}{S-I}nS)-cos(\frac{2\pi}{S-I}nI)]$

Sostituendo quest'ultimo valore nella (2) abbiamo:

$a_n = \frac{S-I}{2\pi^2n^2} * \frac{2\pi}{S-I}[nSsin(\frac{2\pi}{S-I}nS) - nIsin(\frac{2\pi}{S-I}nI)]+[cos(\frac{2\pi}{S-I}nS)-cos(\frac{2\pi}{S-I}nI)]$

E finalmente abbiamo $a_n$ ora calcoliamoci $b_n$:

$b_n = \frac{2}{S-I} \int_{I}^{S} xsin(\frac{2\pi}{S-I}nx)$

Siccome il procedimento è analogo possiamo scrivere direttamente:

$b_n = \frac{S-I}{2\pi^2n^2} \int_{I}^{S} t sin(t) dt$ (3)

con

$t = \frac{2\pi}{S-I}nx$
$x = \frac{S-I}{2n\pi}t$
$dx = \frac{S-I}{2n\pi}dt$

Ci calcoliamo dunque $\int_{I}^{S} t sin(t) dt$

Scegliendo $sin(t) dt$ come fattore differenziale, dunque procedendo per parti, abbiamo (Svolgo l'integrale direttamente, aggiustando per non scrivere troppo):

$[sin(\frac{2\pi}{S-I}nx)]_{I}^{S}-\frac{2\pi}{S-I}[nxcos(\frac{2\pi}{S-I})]_{I}^{S}$

Svolgendo tutti i calcoli abbiamo:

$[sin(\frac{2\pi}{S-I}nS)-sin(\frac{2\pi}{S-I}nI]+\frac{2\pi}{S-I}[nIcos(\frac{2\pi}{S-I}nI)-nScos(\frac{2\pi}{S-I}nS)]$

E sostituendo nella (2) abbiamo infine:

$b_n = \frac{S-I}{2\pi^2n^2}*{[sin(\frac{2\pi}{S-I}nS)-sin(\frac{2\pi}{S-I}nI)]+\frac{2\pi}{S-I}[nIcos(\frac{2\pi}{S-I}nI)-nScos(\frac{2\pi}{S-I}nS)]}$

Se non ho commesso errori nei calcoli, il codice Visual Basic, corrispondente ai miei calcoli, dovrebbe essere:


Public Sub Disegna_Onda_DenteDiSega(ByRef e As System.Windows.Forms.PaintEventArgs, _
        ByVal Livello_Precisione As Single, ByVal Numero_Armoniche As Integer, _
        ByVal Inf_X As Single, ByVal Sup_X As Single, _
        ByVal Inf_Y As Single, ByVal Sup_Y As Single, ByVal Sup_P As Single, ByVal Inf_P As Single, _
        ByVal Pendenza As Single)

        Dim Somma_Armoniche As Single, Armonica As Integer
        Dim x As Single, y As Single
        Dim a_0 As Single, a_n As Single, b_n As Single
        Dim scala_periodo As Single = (2 * Math.PI) / (Sup_P - Inf_P)

        For x = Inf_X To Sup_X Step Livello_Precisione
            Somma_Armoniche = 0
            For Armonica = 1 To Numero_Armoniche
                a_0 = ((Sup_P) ^ 2 - (Inf_P) ^ 2) / (Sup_P - Inf_P)
                a_n = ((Sup_P - Inf_P) / (2 * (Math.PI) ^ 2 * (Armonica) ^ 2)) * (scala_periodo * (Armonica * Sup_P * Math.Sin(scala_periodo * Armonica * Sup_P) - Armonica * Inf_P * Math.Sin(scala_periodo * Armonica * Inf_P) + (Math.Cos(scala_periodo * Armonica * Sup_P) - Math.Cos(scala_periodo * Armonica * Inf_P))))
                b_n = ((Sup_P - Inf_P) / (2 * (Math.PI) ^ 2 * (Armonica) ^ 2)) * (scala_periodo * (Armonica * Inf_P * Math.Cos(scala_periodo * Armonica * Inf_P) - Armonica * Sup_P * Math.Cos(scala_periodo * Armonica * Sup_P) + (Math.Sin(scala_periodo * Armonica * Sup_P) - Math.Sin(scala_periodo * Armonica * Inf_P))))

                Somma_Armoniche = Somma_Armoniche + a_0 / 2 + a_n * Math.Cos(Armonica * x) + b_n * Math.Sin(Armonica * x)
            Next
            y = Pendenza * Somma_Armoniche
            PSet((x - Inf_X) * (470) / (Sup_X - Inf_X), (y - Sup_Y) * (470) / (Inf_Y - Sup_Y), e, Pens.Black)
        Next
    End Sub



OK credo di avervi dato tutti i dati, datemi una mano per favoreeeee! :-D (Almeno per la pazienza che ho avuto nel scrivere tutto questo.. :))

Risposte
Mega-X
Dai per favore datemi una mano....

raff5184
premetto che non ti sarò di grande aiuto perché non conosco il VB.
"Mega-X":
Ora se il periodo risulta essere $P = S - I$ possiamo effettuare la seguente posizione:

$x = \frac{P}{2\pi} t$ ottenendo $f(x) = f(\frac{P}{2\pi}s)$
qui ho notato qualcosa di strano, però sembra essere solo un errore di distrazione. Quella $s$ da dove viene fuori? Se $f(x)$ è periodica di periodo $P!=2pi$ allora trasformo l'intervallo $[0,P]$ in $[0,2pi]$ con la posizione: $x=P/(2pi)t-> t=(2pi)/Px$ la nostra $f(x)$ periodica di T diventa una $g(t)$ periodica di periodo di $2pi$ più precisamente diventa: $g(t)=f(P/(2pi)t)$

Mega-X
Scusa errore di distrazione...

Quando scrivi tanto MathML ti assicuro che qualcosa sfugge.. :-D

Mega-X
UP! :-D

Mega-X
UP!

Per favore aiutatemi o ditemelo almeno se non volete aiutarmi

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.