Metod ad un passo esplct con passo adattvo Metod Runge - Kutta Scrvere un programma che approssm l problema d Cauchy: u (t) = f(t, u), t 0 t T, u R d, u(t 0 ) = v per un sstema d equazon dfferenzal ordnare con un generco metodo esplcto ad un passo con passo adattvo; come prmo esempo s utlzz l metodo Runge- Kutta mmerso d Dormand-Prncesche d ordne 5(4). Per ch non avesse dee alternatve, s suggersce d organzzare l lavoro demandandolo alle seguent funzon: (evdenzate n azzurro alcune dfferenze rspetto al caso a passo fsso) l man (è lo stesso del metodo a passo fsso, chama solo una funzone dversa) deve defnre t 0, T, v, τ (prmo valore proposto dall utente), d leggere n nput l eventuale nome del fle su cu stampare valor della soluzone chamare la ODE_step_ad stampare l eventuale errore nello stesso fle, sotto al man, è utle scrvere sa la funzone f(t,u) che defnsce l problema, sa l eventuale funzone che fornsce la soluzone esatta.
la funzone che mplementa un generco metodo esplcto ad un passo con passo adattvo: possble dcharazone vod ODE_step_ad(vod(*effe)(Real*,Real,Real*),Real t,real T,Real v[], nt d, Real tau, vod (*Step_ad)(Real*,vod(*effe)(Real*,Real,Real*),Real, nt,real, Real* ), char *nome_fle, Real errmax[], vod(*sol)(real*,real), ) // // sgnfcato de parametr: // effe funzone f(t,u) che defnsce l problema // t t 0 // T T // v n ngresso v 0, n uscta l approssmazone d u(t) vettore lungo d // d numero d equazon // tau τ // Step_ad funzone che mplementa l sngolo passo d un metodo esplcto ad un passo e stma l errore locale //nome_fle array d caratter che contene l nome d un eventuale fle per le stampe // (parametro opzonale - da porre a zero nel prototpo) // errmax errore massmo su ogn componente - vettore lungo d (parametro opzonale - da porre a zero nel prototpo) // sol eventuale soluzone esatta del problema (parametro opzonale - da porre a zero nel prototpo)
deve: chamare una funzone set_par_ada che defnsca valor de parametr del metodo adattvo (τ max, ρ, q, toll, p); gestre l cclo sul tempo secondo l seguente algortmo (ved anche appunt del corso): whle (t n < T) chama Step_ad che fornsce U = Φ(t n+, t n )U n e la stma dell errore ε n p+ τ = mn (qτ n, τ max, ρ toll ε n τ n ) f(ε n <= toll) t n+ =t n + τ n, U n+ = U, τ n = mn(τ, T- t n+ ) n = n+ eventuale calcolo errore vero e gestone stampe su vdeo o fle else τ n = τ end f end whle
la funzone Step_ad che, nel nostro caso, mplementa l sngolo passo d un metodo Runge-Kutta mmerso e stma l errore locale E un esempo d funzone Step_ad qund le sua dcharazone deve accordars con l elenco d parametr dcharat n ODE_step_ad possble dcharazone vod Runge_Kutta_ad(Real v[],vod(*effe)(real*,real,real*),real t, nt d,real tau, Real *err) // // sgnfcato de parametr: // v n ngresso u n, n uscta u n+ // effe funzone f(t,u) che defnsce l problema // t t n // d numero d equazon // tau τ // *err puntatore alla varable err che conterrà, n uscta, la stma dell errore deve: calcolare l sngolo passo d un metodo Runge-Kutta mmerso u n = un + τf( tn, un, τ ) +, s F( t, u, τ ) = b K ( t, u), dove = K stmare l errore = + + f t cτ, u τ = a j K j s ε n = τ = ( b b ) K ved l eserctazone su metod Runge-Kutta a passo fsso per consgl su come strutturare l lavoro
la funzone che defnsce parametr del metodo a passo adattvo possble dcharazone vod set_par_ad(real *taumax, Real *ro, Real *q, Real *toll, nt *p) assegna valor d τ max, ρ, q, toll, p la funzone che defnsce l problema (ved eserctazone su metod a passo fsso) eventuale soluzone del problema (ved eserctazone su metod a passo fsso) Testare l algortmo sugl esemp ctat nelle eserctazon precedent. Qu allegate le matrc d Butcher d due metod Runge-Kutta d Dormand-Prncesche e, da scarcare dalla pag. web, le due corrspondent funzon che ne defnscono coeffcent