Mi è venuta voglia di scrivere un articolo di matematica leggero, da leggere in una pausa o mentre si sorseggia un caffé.
In questo articolo vorrei esporre il metodo di calcolo per alcuni integrali, usando un approccio ricorsivo. Questo metodo consente di ridurre gradualmente il grado della funzione integrata, semplificando il calcolo, producendo una formula generale.
Il primo integrale che ho selezionato è l'integrale di log(x)n
Indice |
Integrale di log(x)n usando la ricorsione
Per ottenere la formula ricorsiva, iniziamo derivando la funzione xlog(x)n:

Quindi, possiamo integrare ambo i membri e riscrivere l'equazione come segue:

Questa formula permette di ridurre la complessità del problema passando dal grado n al grado n-1.
E' quindi possibile applicarla ricorsivamente fino ad ottenere il caso n=0, banale.
Per gli affezionati al metodo di integrazione per parti: sì, lo so, si può ottenere integrando per parti, però, quando si ha a che fare con la ricerca di formule ricorsive per il calcolo degli integrali conviene pensare direttamente a quale può essere la funzione che derivata produca due integrali in n ed n-1.
Molti studenti sono portati a usare l'integrazione per parti per forza d'abitudine, ma se si inizia cercando una funzione la cui derivata produce sia il termine che vogliamo integrare sia una versione semplificata di esso, si ottiene una formula ricorsiva in modo più diretto, elegante e spesso meno faticoso. (Risparmiare tempo all'esame è oro!)
Calcolando un po' di integrali per ricorsione il vantaggio di questo approccio diventa evidente.
Una funzione Mathematica per implementare la ricorsione
A questo punto è già possibile scrivere una funzione Mathematica che, dato n, calcoli direttamente l'integrale
di log(x)n
Eccola, molto semplicemente:
logPowerRec[x_, n_] := If[n == 0, x, x Log[x]^n - n logPowerRec[x, n - 1]] // Expand
Esempio:
logPowerRec[x, 4]
Che restituisce:
24 x - 24 x Log[x] + 12 x Log[x]^2 - 4 x Log[x]^3 + x Log[x]^4
Il problema delle formule ricorsive è che riempiono lo stack di immondizia.
Usando un PC questo non è un grosso problema, a meno di non voler calcolare il valore dell'integrale per n enormi.
Nel caso però sia necessario implementare quella formula su un Raspberry, per esempio, di potrebbero avere problemi già con n modesti.
E' quindi il caso di cercare una formula iterativa che, fortunatamente, in questo caso non è molto complessa da ricavare.
Dalla ricorsione alla iterazione
Applicando la stessa formula ricorsiva al termine
, otteniamo:

Continuando con la ricorsione, otteniamo:


Ogni termine successivo riduce il grado di log(x) di una unità, cambia il segno e moltiplica per il prodotto dei numeri decrescenti
.
Attenzione: non si tratta di un fattoriale, perché il primo termine è n, il secondo è n(n-1), il terzo è n(n-1)(n-2) eccetera.
Bisogna quindi arrestare il fattoriale all'ordine pari all'iterazione: la prima iterazione ha un solo termine, la seconda due, la terza tre, ecc... per cui la formula corretta sarà (indicando con k la profondità delle iterazioni) n!/(n-k-1)! o, più mnemonicamente
Formula iterativa
La formula generale per
è dunque:

dove c è la solita costante di integrazione.
In Mathematica è quindi sufficiente inserire questa formula:
logPowerIt[x_, n_] := Sum[(-1)^k*Binomial[n, k]*k!*x*Log[x]^(n - k), {k, 0, n}]
Tabella con primi cinque integrali di log(x)n
Vediamo ora il secondo pezzo facile, ma alziamo leggermente il livello:
Integrale di tan(x)n usando la ricorsione
Per ottenere la formula ricorsiva, iniziamo derivando la funzione tan(x)n:
A questo punto, possiamo integrare entrambi i membri e riscrivere l'equazione come segue:

Sembra che la formula non sia quella che cercavamo, poiché vorremmo che il primo membro contenesse n e non n+1 per avviare la ricorsione.
A questo punto però ricorriamo ad uno sporco trucco: scaliamo n di una unità e la formula dovrà restare valida.
In pratica n+1 diverrà n e n diverrà n-1 e n-1 diverrà n-2.
La formula è quindi:

Notiamo che qui la ricorsione "salta" di due ogni volta e non di uno come per il logaritmo.
Bisogna quindi fare un po' attenzione, perché se n è pari l'ultimo integrale da valutare sarà con n=0, cioè l'integrale di tan(x)0 che vale x.
Se invece n è dispari dovremo arrestarci ad n=1 e quindi dovremo valutare l'integrale di tan(x), che, come noto, vale log(1/cos(x)) oppure anche -log(cos(x)).
Una funzione Mathematica per implementare la ricorsione
Come prima è già possibile scrivere una funzione Mathematica che, dato n, calcoli direttamente l'integrale
di tan(x)n
Come già detto dobbiamo controllare l'ultimo valore e per farlo possiamo usare la funzione
Switch
Basta controllare se l'iterazione ha raggiunto n=0 oppure n=1 per biforcare la terminazione, perché prima o poi la ricorsione arriverà a considerare un caso o l'altro.
Per chi non la conoscesse, in Mathematica, la funzione Switch funziona così: Switch[variabile, primo valore, cosa fare se variabile==primo valore, secondo valore, cosa fare se variabile==secondo valore, ..., default (si indica con _), cosa fare in default] e serve per evitare tonnellate di If annidati ( If annidati := debug nightmare)
Eccola:
TanPowRec[x_, n_] := Switch[n, 0, x, 1, -Log[Cos[x]], _, 1/(n - 1)*Tan[x]^(n - 1) - TanPowRec[x, n - 2]]
Esempio pari:
TanPowerRec[x, 4]
Che restituisce:
x - Tan[x] + Tan[x]^3/3
Esempio dispari:
TanPowerRec[x, 5]
Che restituisce:
-Log[Cos[x]] - Tan[x]^2/2 + Tan[x]^4/4
Dalla ricorsione alla iterazione
Capire come funziona la progressione della primitiva è davvero semplice, in questo caso.
Consideriamo separatamente il caso pari e il caso dispari.
Prendiamo n=20 e n=22, otteniamo:
n=20 -> x - Tan[x] + Tan[x]^3/3 - Tan[x]^5/5 + Tan[x]^7/7 - Tan[x]^9/9 + Tan[x]^11/11 - Tan[x]^13/13 + Tan[x]^15/15 - Tan[x]^17/17 + Tan[x]^19/19
n=22 -> -x + Tan[x] - Tan[x]^3/3 + Tan[x]^5/5 - Tan[x]^7/7 + Tan[x]^9/9 - Tan[x]^11/11 + Tan[x]^13/13 - Tan[x]^15/15 + Tan[x]^17/17 - Tan[x]^19/19 + Tan[x]^21/21
Notiamo che: tan(x) è elevata, partendo dal termine maggiore, sempre alla n-1, poi diminuisce di due ad ogni iterazione, fino ad arrivare ad uno, poi c'è la x.
Il segno parte sempre dal positivo e poi si alterna. La x ha segno opposto del termine tan(x).
Scrivere una sommatoria è quindi piuttosto semplice.
Vediamo elemento per elemento:
1. chiamiamo k l'indice della sommatoria e poniamo che k parta da 0.
2. Il valore da cui parte l'esponente della tangente è n-1, poi scende di 2 in 2. Quindi il termine generale è n-1-2k, partendo k da zero.
3. La sommatoria si deve arrestare quando n-2k-1 (l'esponente della tangente) raggiunge il valore uno. Cioè n-2k-1=1 o anche k= (n-2)/2
4. Il segno di x (il termine "resto") deve essere opposto all'ultimo segno. L'ultimo segno sarà (-1)^((n-2)/2) (per effetto del punto 3 sulla condizione di arresto) per cui basta sommare uno all'esponente di -1, ottenendo (-1)^(n/2).
Mettendo tutto insieme otteniamo la formula iterativa per gli n pari:

Passiamo al caso n dispari
Prendiamo n=21 e n=23, otteniamo:
n=21 -> -Log[Cos[x]] - Tan[x]^2/2 + Tan[x]^4/4 - Tan[x]^6/6 + Tan[x]^8/8 - Tan[x]^10/10 + Tan[x]^12/12 - Tan[x]^14/14 + Tan[x]^16/16 - Tan[x]^18/18 + Tan[x]^20/20
n=23 -> Log[Cos[x]] + Tan[x]^2/2 - Tan[x]^4/4 + Tan[x]^6/6 - Tan[x]^8/8 + Tan[x]^10/10 - Tan[x]^12/12 + Tan[x]^14/14 - Tan[x]^16/16 + Tan[x]^18/18 - Tan[x]^20/20 + Tan[x]^22/22
Possiamo quindi ripetere le stesse considerazioni fatte prima.
Notiamo che: tan(x) è elevata, partendo dal termine maggiore, sempre alla n-1, poi diminuisce di due ad ogni iterazione, fino ad arrivare a due, poi c'è log(cos(x)).
Il segno parte sempre dal positivo e poi si alterna. log(cos(x)) ha lo stesso segno del termine tan(x)2.
Anche in questo caso scrivere una sommatoria è quindi piuttosto semplice.
Vediamo elemento per elemento:
1. chiamiamo k l'indice della sommatoria e poniamo che k parta da 0.
2. Il valore da cui parte l'esponente della tangente è n-1, poi scende di 2 in 2. Quindi il termine generale è n-1-2k, partendo k da zero, come prima.
3. La sommatoria si deve arrestare quando n-2k-1 (l'esponente della tangente) raggiunge il valore due. Cioè n-2k-1=2 o anche k= (n-3)/2
4. Il segno di log(cos(x)) (il termine "resto") deve essere lo stesso dell'ultimo segno. L'ultimo segno sarà (-1)^((n-3)/2) (per effetto del punto 3 sulla condizione di arresto) per cui basta riportarlo uguale all'esponente di -1, ottenendo (-1)^((n-3)/2).
Mettendo tutto insieme otteniamo la formula iterativa per gli n dispari:

Dove, nell'unico caso in cui n sia uguale ad uno, la sommatoria non si calcola e resta solo il logaritmo del coseno.
Formula iterativa
Volendo unificare le due formule possiamo scrivere:

Per unificare le due formule ho utilizzato la funzione "floor".
So che molti di voi programmano, ma, per chi non lo sapesse, è una funzione che restituisce l'intero più vicino e più piccolo del valore calcolato.
Per esempio: Floor(3.7)=3 e Floor (-2.3)=-3.
Ho invece lasciato distinte nel caso dispari e pari le funzioni "resto". E' possibile utilizzare una formula matematica che valga 0 oppure 1 a seconda che n sia pari o dispari, ma la notazione diventerebbe davvero troppo pesante.
In Mathematica è sufficiente utilizzare questa formula:
TanPowIt[x_, n_] := Sum[(-1)^k*Tan[x]^(n - 2 k - 1)/(n - 2 k - 1), {k, 0, Floor[(n - 2)/2]}] + (-1)^Floor[(n - 3)/2]*If[OddQ[n], Log[Cos[x]], x]
Tabella con primi undici integrali di tan(x)n
Integrale di sin(x)n e cos(x)n usando la ricorsione
Alziamo ancora un po' l'asticella, sempre restanto entro la definizione di "pezzi facili".
Cominciamo con sin(x)n, derivando la funzione:

adesso scriviamo
e semplifichiamo la formula, ottenendo:

Adesso integriamo ambo i membri e riscriviamo bene la formula

Abbiamo ancora il problema che la ricorsione è in n+1 e non in n, ma sappiamo già come procedere.
Come già fatto per la tangente, "scaliamo" n di una unità e otteniamo:

Ora possiamo dividere per n ed ottenere la formula finale ricorsiva:

Notiamo che, anche in questo caso, la formula ricorsiva salta da n a n-2, per cui se n è pari dobbiamo arrestarci a n=0, mentre, se n è dispari, dobbiamo arrestarci al caso n=1.
Il caso n=0 è l'integrale di 1 che fa x;
il caso n=1 è l'integrale di sin(x) che fa -cos(x).
Passiamo a cos(x)n, così capiremo anche perché li voglio trattare insieme.
Possiamo ripetere tutta la trattazione svolta in precedenza, scambiando sin(x) con cos(x).
Cominciamo col derivare

adesso scriviamo
e semplifichiamo la formula, ottenendo:

Adesso integriamo ambo i membri e riscriviamo bene la formula

Procedendo come prima arriviamo alla formula ricorsiva:

Ora possiamo mettere a confronto le due formule:


Le due formule sono talmente simili che si può ricavare la prima e poi modificarla per ottenere la seconda.
1. La seconda si ottiene dalla prima scambiando sin(x) con cos(x);
2. il segno meno nella formula di sin(x)n fa si che tutti i termini ricorsivi siano negativi, fatta eccezione (se n è pari) per il termine che si ottiene integrando sin(x)0 (cioè x). Essendo l'ultimo termine questo non ricorre e quindi conserva il segno positivo. Se n è dispari, invece, la ricorsione termina con n=1, cioè viene integrato sin(x), che fa -cos(x), motivo per il quale quel termine conserverà il segno negativo anche senza ricorrere.
3. nel caso del coseno tutti i termini sono positivi senza eccezione alcuna, perché se n è pari la ricorsione termina con l'integrale di 1 che fa x, mentre se è dispari termina con l'integrale di cos(x) che fa sin(x).
Una, anzi due, funzioni Mathematica per implementare la ricorsione
Cominciamo con sin(x) implementando le considerazioni fatte:
La funzione ricorsiva é:
SinPowRec[x_, n_] := Switch[n, 1, -Cos[x], 0, x, _, -1/n*Sin[x]^(n - 1)*Cos[x] + (n - 1)/n*SinPowRec[x, n - 2]] //Expand
Mentre, per il coseno è:
CosPowRec[x_, n_] := Switch[n, 1, Sin[x], 0, x, _, 1/n*Cos[x]^(n - 1)*Sin[x] + (n - 1)/n*CosPowRec[x, n - 2]] //Expand
Dalla ricorsione alla iterazione
Cominciamo dal sin(x).
Questo integrale richiede di fare le cose con un pochino di attenzione in più rispetto ai precedenti.
Quando si hanno integrali di questo tipo conviene inseguire la ricorsione per un po' per vedere come evolvono i coefficienti e ricavare un termine generale. Per vedere invece quando arrestarsi conviene scrivere degli esempi per n=2,3,4 ecc... e osservare quando le iterazioni si arrestano. Proviamo a farlo, che forse è più immediato che spiegarlo.
Scriviamo un po' di termini:

Da questi ricaviamo una tabella:

Adesso l'andamento dei coefficienti è chiaro: sia il numeratore che il denominatore saltano di due in due, con i numeri dispari il primo, con i pari il secondo.
Se chiamiamo l'indice iterativo k e se facciamo partire k da zero possiamo scrivere il numeratore come: 
se k=0 il numeratore varrà 1, mentre se k=1 si ha
ecc...
Passiamo al denominatore: con la stessa logica possiamo scrivere il denominatore come
, infatti se k=0 si ha
ecc...
Il coefficiente generale da inserire nella sommatoria è quindi: 
Attenzione: n!! e (n-1)!! NON si semplificano fra di loro.
Il coefficiente a cui è elevato sin(x) parte da n-1 e va indietro di 2 ad ogni iterazione, per cui il termine generale è n-1-2k.
Adesso dobbiamo ricavare l'ultimo coefficiente per stabilire quando arrestare la sommatoria. Per farlo, come dicevo, conviene scrivere un po' di integrali.

Guardiamo bene cosa succede: i termini pari si arrestano quando sin(x) arriva ad essere elevato ad 1, mentre i termini dispari si arrestano quando sin(x) arriva ad essere elevato a 2.
Dopo di loro ci sono i termini resto: x oppure -cos(x) che possiamo, nella sommatoria, agevolmente scrivere a parte.
Se per i termini pari sin(x) deve arrivare ad essere uguale ad 1 possiamo scrivere che il suo coefficiente generale debba essere uguale ad uno, cioè possiamo scrivere n-2k-1=1, cioè k=(n-2)/2, condizione di arresto per i termini pari.
Per i termini dispari, invece, deve essere n-2k-1=2, cioè k=(n-3)/2, condizione di arresto per i termini dispari.
Dobbiamo ancora stabilire il coefficiente numerico da mettere di fronte ad x oppure a -cos(x).
Dalla tabella qui sopra si può osservare che il coefficiente di x è uguale al coefficiente di sin(x) elevato alla 1.
Dato che il coefficiente generale è
e la sommatoria si arresta se k=(n-2)/2, possiamo banalmente ricavare il coefficiente della x sostituendo quel k entro il coefficiente generale, ricavando il coefficiente 
Per quanto riguarda invece -cos(x) possiamo osservare che è sempre il doppio del coefficiente di sin(x)2.
In questo caso la sommatoria si arresta quando k=(n-3)/2, che sostituita nel coefficiente generale
restituisce
cioè
.
Essendo il termine di -cos(x) pari al doppio dell'ultimo termine si ha che il coefficiente di -cos(x) debba essere (n-1)!!/n, che è uguale al coefficiente di x del caso pari.
Questo capita in quasi la totalità delle sommatorie che esplicitano la versione iterativa di una versione ricorsiva di una formula.
In questo caso ho ricavato il coefficente passo passo, ma, in genere, (se per esempio fossi ad un esame, per risparmiare tempo) proverei a controllare se il caso pari funzioni anche nel caso dispari, cosa che, ripeto, quasi sempre è vera (se poi non è vera, questo vuole dire diverse altre cose che esulano dallo scopo di questo articolo).
Formula iterativa
Abbiamo quindi ora tutti gli ingredienti per confezionare la formula iterativa generale per il caso pari:

mentre, per il caso n dispari si ha:

E' possibile scrivere una formula compatta che comprenda sia il caso pari che quello dispari? Certo, come abbiamo fatto per la tangente, usando la funzione floor.

Ho mantenuto al divisione fra caso pari e dispari per il termine resto per non appesantire troppo la formula.
E adesso sotto con il coseno!
Come dicevo basta seguire le regole che avevamo considerato all'inizio: si scambia sin(x) con cos(x) e si considerano tutti i termini come positivi.

In Mathematica si può utilizzare questa funzione per implementare la formula iterativa di sin(x)n:
SinPowIt[x_, n_] := -Cos[x]* Sum[(n - 1)!!*(n - 2 k - 2)!!/(n!!*(n - 2 k - 1)!!)* Sin[x]^(n - 2 k - 1), {k, 0, Floor[(n - 2)/2]}] + (n - 1)!!/n!!* If[OddQ[n], -Cos[x], x] // Expand
e questa per cos(x)n:
CosPowIt[x_, n_] := Sin[x]*Sum[(n - 1)!!*(n - 2 k - 2)!!/(n!!*(n - 2 k - 1)!!)* Cos[x]^(n - 2 k - 1), {k, 0, Floor[(n - 2)/2]}] + (n - 1)!!/n!!* If[OddQ[n], Sin[x], x] // Expand
Tabella con primi sette integrali di sin(x)n e cos(x)n

Conclusione
Ho cercato di fornire le tecniche di base per affrontare il calcolo di integrali ricorsivi, ridotte al minimo indispensabile per non risultare noioso, ma cercando di scrivere comunque qualcosa di utile. Spero di essere riuscito nel mio intento.
Se posso migliorare qualcosa o se qualcosa non è ben chiaro vi prego di segnalarmelo nei commenti.
Ho cercato di aumentare la difficoltà di volta in volta, senza fare passi troppo grandi. In fondo volevo scrivere un articolo leggero.
Le maggiori difficoltà che si incontrano con questi integrali sono, in generale, la funzione da derivare per ottenere successivamente un integrale modulare e come riuscire a comprendere l'andamento dei coefficienti quando si vuole passare dalla versione ricorsiva a quella iterativa.
Questo articolo non è assolutamente completo ed esistono molte altre tecniche per il calcolo di questi integrali, che però esulerebbero da un articolo che tratta "pezzi facili".
Le difficoltà maggiori nel calcolo dei coefficienti iterativi si hanno quando ci sono dei coefficienti di fronte all'integrale ricorsivo e l'integrale ricorsivo "saltella" di due in due oppure di tre in tre o anche saltella diversamente fra casi pari e dispari.
Non a caso i temi di esame erano pieni di coefficienti di fronte all'integrale ricorsivo che rendevano necessario fare molti casi e rendersi conto bene di come l'integrale doveva terminare, oppure inserire delle funzioni non elementarmente integrabili, che quindi dovevano essere trattate con funzioni speciali (per esempio Bessel). Per affrontare questi tipi di integrali bisogna aver capito bene la teoria e aver fatto una quantità enorme di esercizi. Per non parlare poi della ricorsione su integrali doppi o multipli, quando l'indice k della sommatoria diventa un vettore. Credo che se adesso tornassi ad affrontare analisi, che all'epoca avevo superato, mi boccerebbero senza pietà, ma è anche vero che ricordo quegli anni, adesso come adesso, con un pizzico di nostalgia. Così è la vita, in fondo, o almeno credo...

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)