[NumAn] PC-Oef2

2273 days ago by Niels.Neirynck

Recursie en onstabiele berekeningen

Beschouw opnieuw de integraal uit Oefening 2, m.a.w $I_n = \int_{0}^{1} e^{x} x^{n} \;dx$.

n = 30; 
       
We berekenen $I_n$ exact (symbolisch) in de rij i[n].
i = [ 1 - 1/exp(1) ]; #waarde voor i[0] for k in range(n): i.append(1 - (k+1)*i[k]) show(i) 
       

                                
                            

                                
Vervolgens berekenen we $I_n$ in vlottende-puntvoorstelling, waarbij we digits=10 nemen. Hiertoe stellen we de vlottende-puntvoorstelling van $I_0$ in j[0], en rekenen nu gewoon verder (alle verdere berekeningen gebeuren dan in vlottende-puntvoorstelling).
Digits = 10; j = [N( 1 - 1/exp(1) , digits=Digits)]; for k in range(n): j.append(1 - (k+1)*j[k]) show(j) 
       

                                
                            

                                
parent(j[n-1]) #controle op het type van het laatste element 
       
Real Field with 37 bits of precision
Real Field with 37 bits of precision

Om begrijpelijke redenen loopt deze berekening helemaal fout.

Als we trachten te vergelijken met de exacte waarden van $I_n$, is ook nog enige voorzichtigheid nodig. Stel dat we digits op 10 laten staan, en gewoon de vlottende-puntvoorstelling van de eerder berekende exacte waarden i[n] uitschrijven, dan komt er:

Digits = 10; # !!! pas deze waarde later aan. i_num = [N(i[k] , digits=Digits) for k in range(n+1)] show(matrix(vector(i)).stack(vector(i_num)).transpose()); # (maak matrix aan met 'i' als rij, plaats 'i_num' eronder als tweede rij, # gebruik show() voor weergave van getransponeerde matrix.) # De eerste kolom zijn nu de exacte waarden, de tweede kolom bevat de omzettingen naar vlottende-puntsgetallen: 
       

                                
                            

                                

Enig idee waarom dit fout loopt?

Indien niet, kijk even terug naar de exacte uitdrukking voor i[n].

Het is nu duidelijk dat we de waarde van digits moeten verhogen om ook nog voor $I_{30}$ nog enkele beduidende cijfers te behouden. Schat deze waarde van digits, ken ze toe, en bereken hiermee opnieuw de vlottende-puntvoorstelling van de eerder berekende exacte waarden i[n].

Was jouw schatting toerijkend?

Tenslotten kan je nu nog even de waarden van j[n] (berekend in vlottende-puntvoorstelling met digits=10) en die van i[n] (exacte berekening, en dan uitgedrukt in vlottende-puntvoorstelling met Digits=...) vergelijken:

#Kolom1: 'exact' + omzetting naar FP #Kolom2: via FP-arithmetic. show(matrix(vector(i_num)).stack(vector(j)).transpose());