Aiuto programma serie di fourier
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!
Se mi date una mano vi voglio bene..
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
.
Anzitutto vediamo se sbaglio già in partenza, così almeno vi risparmio un bel pò di lettura..
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..
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
):
$[\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:
OK credo di avervi dato tutti i dati, datemi una mano per favoreeeee!
(Almeno per la pazienza che ho avuto nel scrivere tutto questo..
)
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!

Se mi date una mano vi voglio bene..

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

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

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..

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

$[\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!


Risposte
Dai per favore datemi una mano....
premetto che non ti sarò di grande aiuto perché non conosco il VB.
"Mega-X":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)$
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)$
Scusa errore di distrazione...
Quando scrivi tanto MathML ti assicuro che qualcosa sfugge..
Quando scrivi tanto MathML ti assicuro che qualcosa sfugge..

UP!

UP!
Per favore aiutatemi o ditemelo almeno se non volete aiutarmi
Per favore aiutatemi o ditemelo almeno se non volete aiutarmi