Opdrachten numerieke methoden, serie Opdracht : Probleemstelling mathematische slinger. [Leid het beginwaarde probleem af.] U 0 is de energie op positie P 0 en U p is de energie op positie P : v = l dφ U 0 = mgl cos α U p = mgl cos φ + mv = mgl cos φ + m ( l dφ ). Deze twee energieën zijn aan elkaar gelijk: U 0 = U p = ( ) dφ ml = mgl cos φ mgl cos α dφ = g (cos φ cos α). l. [Bereken t(φ).] Laat zien dat voor het tijdstip t(φ), waarop een gegeven uitwijking φ voor het eerst bereikt wor, gel l a t(φ) = dθ. g cos θ cos α De uitdrukking van (.) verder uitwerken: φ dφ = ± gl cos φ cos α l = ± g cos φ cos α l α t(φ) = dφ g cos φ cos α Opdracht : Numerieke intergratie. [Schrijf een functie voor het numeriek integreren] φ Schrijf een functie voor het numeriek integreren volgens een samengestelde kwadratuurformule van b f(x)dx bij gegeven continue functie f op een eindig interval [a, b]. a #define INTMETHOD TRAPEZIUM #define INTMETHOD MIDPUNT integrate trapezium( (*f) (), a, b, int n)
h = (b a) / n; res; /* Result */ i; res = (f(a) + f(b)) /.0; for (i = a + h; i < (b h/); i += h) 0 res += f(i); res *= h; return res; integrate midpunt( (*f) (), a, b, int n) h = (b a) / n; h = h /.; res = 0.; /* Result */ i; 0 for (i = a + h; i < b; i += h) res += f(i h); res *= h; return res; integrate( (*f) (), a, b, int n, char method) switch (method) case INTMETHOD TRAPEZIUM: 30 return integrate trapezium(f, a, b, n); case INTMETHOD MIDPUNT: return integrate midpunt(f, a, b, n); default: fprintf(stderr, "Onbekende integratiemethode: %d\n", method); exit(); 40. [Test de numerieke integratie] Test de numerieke integratie voor 0 x 4 + x 9 dx, met behulp van de trapeziumregel. Druk het rijtje van resultaten [T, T, T 4, T 8,..., T 8 ] af. De output van het programma is: T[00] = 0.5000000000000000 T[00] = -0.67968750000000 T[004] = -0.490776060788 T[008] = -0.57700304746678 T[06] = -0.59860353068607 T[03] = -0.59800488038 T[064] = -0.5995549479399 T[8] = -0.59988807558967 Opdracht 3: Richardson extrapolatie
3., 3. [Foutschatting, Richardson benadering] Schrijf een functie die voor een rijtje van getallen, [c 0, c,..., c n ], per trio c k+, c k+ en c k de exponent q van de kop-term van de fout schat: Druk per trio de invoergegevens c k+, c k+ en c k het getal ( ) ck+ c k+ q q k := log / log γ c k+ c k af, en retourneer de laatste schatting q n. Schrijf verder een functie die voor een rijtje van getallen, [c 0, c,..., c n ] en gegeven exponent q, pre duo c k+ en c k, de Richardson benadering c () k voor alle k = 0,,..., n retourneert. := hq k c k+ h q k+ c k h q k hq k+ exponent( *c, int n) if (n > ) return log((c[n] c[n ]) / (c[n ] c[n ])) / log(0.5); else /* fprintf(stderr, exponent: n<= ); exit(); */ return 0; 0 int richardson( *c, q, *r, int n) int i; t; if (n < ) return ; for (i = 0; i < (n ); i++) t = pow(0.5, q); if (t == 0) 0 return ; r[i] = (c[i+] pow(0.5, q) * c[i]) / t; return 0; Hierbij is gebruikt gemaakt van de volgende vereenvoudiging: Namelijk: h q k c k+ h q k+ c k h q k hq k+ h q k c k+ h q k+ c k h q k hq k+ h k = (b a)γ k = c k+ [ ] ck [ ] q. h q k = (b a) q y k+q h q k+ = (b a) q γ (k+)q = (b a)q γ kq c k (b a) q γ (k+)q c k (b a) q γ kq (b a) q γ (k+)q. Ingevuld kan worden: a = 0, b =, γ =. [ ] kq ck+ [ kq+q ] ck [ ] kq [ ] = ck+ [ kq+q [ ] q ] ck q 3
Opdracht 4: De numerieke berekening van t(φ). 4. [Vereenvoudiging integraal] Vereenvoudig de integraal De volgende substitutie wor uitgevoerd ( ) θ sin Hiermee wor dθ verkregen: F (φ) = α dθ, 0 < α < π. cos θ cos α φ ( α ) = sin dus: θ = arcsin dθ = sin(ξ) ( sin ( α ) sin(ξ) sin(/ α) cos(ξ)dξ (sin(/ α)) (sin(ξ)). ). Enige vereenvoudigingen: cos(θ) = (sin(/ θ)), cos(α) = (sin(/ α)) cos(θ) cos(α) = (sin(/ α)) (sin(/ θ)) cos(θ) cos(α) = (sin(/ α)) (sin(/ θ)) = (sin(/ α)) (sin(/ α)) (sin(ξ)) = sin(/ α) (sin(ξ)) = sin(/ α) cos(ξ). Dit levert uiteindelijk: F (φ) = π/ dξ. (sin(/ α)) (sin(ξ)) ψ Hierbij volgt uit sin ( ( t ) = sin ) sin(x), dat sin(x) = sin ( ) ( ( sin t ) ) sin ( ) s a, zodat x = arcsin sin ( ) a, s en voor t = a gel ξ = π ; voor t = φ gel ξ = ψ. 4. [Schrijf een integratieprogramma.] Schrijf een programma dat voor N =,, 4, 8, 6, 3, 64, 8 de volgende bij F (φ) behorende grootheden berekent en in een tabel afdrukt: N T N T N T N T N T N T 4N T N 4
Draai het programma voor φ = 5π, π 3, π 4, π 6, π, 0 en α = π. Draai het programma van opgave 3. om in te zien dat de laatste kolom inderdaad een onderdeel van de schatting van de exponent q is, nodig voor Richardson extrapolatie. #include <stdio.h> #include <math.h> #include "integrate.c" #include "richardson.c" /* Use globals, so the old integration functions can be used for f */ alpha; xi; #define phiaant 6 const phis[phiaant] = 5 * M PI /, M PI / 3, M PI / 4, M PI / 6, M PI /, 0; 0 f( xi) t; t = sin(alpha / ) * sin(xi); return / (sqrt( t * t)); 0 F( phi, alph, int n) alpha = alph; return integrate(f, asin(sin(phi / ) / sin(alpha / )), M PI /, n, INTMETHOD TRAPEZIUM); int main(int argc, char *argv[ ]) int i, j, N; 30 alpha = M PI / ; phi = 5 * M PI / ; T[3], q; printf(" N T[N] T[N] - T[N] " "(T[N]-T[N])/(T[4N]-T[N]) exponent q\n"); printf(" ----+------------------------+-----------------------+" "--------------------------+------------------------\n"); for (j = 0; j < phiaant; j++) phi = phis[j]; printf("\n"); 40 printf("phi=%6.6e\n", phi); /* * XXX Lazy method: most T s are computed three times. Blame * the fast computer. */ for (N =, i = 0; i < 8; i++) T[0] = F(phi, alpha, N); T[] = F(phi, alpha, * N); T[] = F(phi, alpha, 4 * N); q = exponent(t, ); 50 printf("% 3.3d % 6.6e % 6.6e % 6.6e % 6.6e\n", N, T[0], T[] T[0], (T[] T[0]) / (T[] T[]), q); N *= ; return 0; Dit programma geeft de volgende output: 5
N T[N] T[N] - T[N] (T[N]-T[N])/(T[4N]-T[N]) exponent q ----+------------------------+-----------------------+--------------------------+------------------------ phi=.308996938995747e+00 00 7.37756738607905e-0 8.03850388389e-03 4.083877098349974e+00.0993944989005e+00 00 7.800894490044e-0.9683555733684e-03 4.050684073408989e+00.00903305049757e+00 004 7.37784449477380e-0 4.890466954393e-04 4.006709669553e+00.0059760776407e+00 008 7.46746906380335e-0.064683778669e-04 4.0056748954887e+00.000565880444e+00 06 7.4389533747554e-0 3.050497639604e-05 4.0003975040608e+00.0004877687e+00 03 7.4400379677905e-0 7.6530833474845e-06 4.00009793746557e+00.0000353964860e+00 064 7.44766375453e-0.906803594538380e-06 4.00004483664856e+00.000008830588476e+00 8 7.4495695557798e-0 4.765677835790e-07 4.00000600485693e+00.00000657907907e+00 phi=.0479755965976e+00 00.008800838350e+00.47306683643506e-0 3.839496760e+00.93407085679353e+00 00.030837009936e+00 3.735347985808e-03 4.09907965905446e+00.0076478887757e+00 004.068838349858e+00 9.953978533480e-04 4.005503945886e+00.00983763435e+00 008.07747537470385e+00.39693089868733e-04 4.0039830539658e+00.00050445439763e+00 06.079795067785837e+00 5.797064439786e-05 4.00035094798356e+00.00065707809e+00 03.08037478840077e+00.449743979883e-05 4.00008789455050e+00.00003673853776e+00 064.08059705839457e+00 3.6856440774577e-06 4.0000959075449e+00.0000079004056e+00 8.080555934403859e+00 9.05709379054863e-07 4.000005499460765e+00.000009835096534e+00 phi=7.85398633974488e-0 00.4697650533708e+00.35659003986689e-0 3.05078580897e+00.5957439776838e+00 00.6054405783885e+00 4.49959334943048e-03 3.9965057690045e+00.99873959756457e+00 004.6504565063335e+00.5773763689798e-03 4.00664839788077e+00.0009608776943e+00 008.66673383397005e+00.8559435849689e-04 4.0007486479664e+00.0005779497344e+00 06.6644859483855e+00 7.030474344696e-05 4.00087530546e+00.000065557974e+00 03.6658895706089e+00.75745573805335e-05 4.0000456938733e+00.0000645707704e+00 064.6653647063607e+00 4.393589638066e-06 4.000040573968e+00.00000454887307e+00 8.6654086385346e+00.0983945768353e-06 4.000008559789e+00.00000098036406e+00 phi=5.3598775598988e-0 00.464870670648930e+00 4.533666775757e-03.09675045887373e+00.333489606849e-0 00.4694003956476e+00 4.36678984933e-03 3.930006066677359e+00.9687533397337e+00 004.473533659705459e+00.055877478786e-03 3.9994550597935e+00.999797886656e+00 008.47458953453864e+00.64005854098375e-04 3.999938994066e+00.999975795785003e+00 06.4748535373073846e+00 6.60057084588005e-05 3.9999877964973e+00.999995597748e+00 03.47499539878304e+00.65006930690466e-05 3.999997370860e+00.999999003465947e+00 064.47493604057995e+00 4.5766698703e-06 3.999999330396005e+00.999999758493876e+00 8.4749406574746e+00.0394084479e-06 3.99999984756856e+00.99999994509900e+00 phi=.6799387799494e-0 00.6779876886438e+00 -.34877435476490e-0-5.50680660568e+00 NaN 00.6645049489846e+00.450938966386e-03 3.5678303404356e+00.845633077437e+00 004.66695533608768e+00 6.9677756543853e-04 3.9960789970743478e+00.998585035409659e+00 008.6676585538446e+00.7435359538797e-04 3.99983076570e+00.9997643954300e+00 06.66786067363765e+00 4.359648775494e-05 3.999834873386e+00.999937034633800e+00 03.66786980985088e+00.08995705986097e-05 3.9999537570479040e+00.999983384744e+00 064.66788070555680e+00.749450099838e-06 3.9999884638695e+00.99999583997554e+00 8.66788347479830e+00 6.833003099648e-07 3.999997073045389e+00.9999989443765e+00 phi=0.0000000000000000e+00 00.89688979370398e+00-4.59766854076e-0 4.6565950704633e+0 5.5404497693e+00 00.8549593085690e+00-8.8390338393e-04.605737490760676e+03.06490034348898e+0 004.85407577673078e+00-5.5046564935334e-07.8688504898669e+06.08330397549359e+0 008.854074677306665e+00 -.94653907355655e-3 -Inf Inf 06.85407467730379e+00 0.0000000000000000e+00 NaN NaN 03.85407467730379e+00 0.0000000000000000e+00 0.0000000000000000e+00 -Inf 064.85407467730379e+00.030465565e-5-4.5454545454545453e-0 NaN 8.854074677303730e+00 -.44490654753444e-5 -.0000000000000000e+00 NaN Aan de laatste twee kolommen is goed te zien, dat er een correlatie is tussen (T N T N )/(T 4N T N ) en q. 4.3 [Bereken de Richardson extrapolanten.] Neem φ = 5π. Voor het rijtje [c 0, c,..., c 7 ] = [T, T,..., T 8 ] en de uit de bovenstaande opgave benaderde gehele exponent q, bereken het rijtje van Richardson extrapolanten c () k, k = 0,..., 6, met behulp van het programma richardson in 3.. Druk het rijtje extrapolanten af. #include <stdio.h> 6
#include <math.h> #include "integrate.c" #include "richardson.c" alpha; f( xi) t = sin(alpha/)*sin(xi); 0 return /(sqrt( t*t)); F( phi, alph,int n) alpha=alph; return integrate(f, asin(sin(phi/)/sin(alpha/)),m PI/,n,INTMETHOD TRAPEZIUM); int 0 main(int argc,char *argv[ ]) alpha=m PI/; phi=5*m PI/; q=.0; T[8],r[7]; int i,j; for (i=,j=0;j<8;j++,i*=) T[j]=F(phi,alpha,i); 30 if (richardson(t,q,r,8)!=0) return ; for (j=0;j<7;j++) printf(" r[%.d] = % 6.6f\n",j,r[j]); return 0; Dit programma geeft als output: r[0] = 0.7448959677743 r[] = 0.74434563454598 r[] = 0.7443047706799 r[3] = 0.74430975490 r[4] = 0.74430060405338 r[5] = 0.74430050447904 r[6] = 0.7443004985585 4.4 [Nog een keer Richardson] Als exponent wor losgelaten op bovenstaand rijtje van richardson-extrapolanten van T, wor duidelijk dat q nadert tot 4. Hiermee wor Richardson nog een keer toegepast. Dit lei tot de volgende resultaten: r[0] = 0.74430894566864 r[] = 0.744300467987 r[] = 0.74430049669348 r[3] = 0.744300497808 r[4] = 0.74430049784075 r[5] = 0.74430049784097 7
4.5 [Bespreek de numerieke resultaten] We zien in 4. dat hoe dichter φ bij nul komt, hoe meer afwijkingen exponent q vertoont, vooral op φ = 0. Daar wor de 4 e kolom bijv. negatief en de logaritme van een negatief getal geeft problemen. De Richardson benadering is nuttig en levert een nauwkeuriger resultaat. De toepassing van opnieuw Richardson levert nog een nauwkeuriger resultaat (4 cijfers ipv 8). Willem van Engen (wvengen@stack.nl) and Hjalmar Mulders (H.C.J.Mulders@student.tue.nl) Homepage: http://willem.n3.net 8