Laboratorio di Calcolo B
Dario Barberis , Paolo Morettini, Fabrizio Parodi, Enrico Robutti


Introduzione

Soluzione numerica di equazioni differenziali

Questa esercitazione affronta la soluzione numerica delle equazioni differenziali ordinarie.
Dopo aver impostato un algoritmo atto a risolvere una generica equazione differenziale di secondo grado (metodo di Runge-Kutta) lo applicherete alla soluzione dell'equazione del moto di un corpo disegnandone la traettoria.

Esercizio 1
Esercizio 2
Esercizio 3

Esercizio 1

Applicazione di RK al second'ordine

Sistema di equazioni:
           prima equazione: kappa1 uguale h per f di xn virgola tn  
           seconda equazione: kappa2 uguale h per f di xn più kappa1 mezzi virgola tn più h mezzi
           terza equazione: xn più 1 uguale xn più kappa2 più
           termini di ordine h al cubo e superiori

all'oscillatore smorzato

Equazione: derivata seconda di x rispetto a t più 
            beta per derivata di x rispetto a t più 
            omega quadro x uguale 0

soluzione analitica:

Equazione: x uguale A per e alla meno beta mezzi t per coseno di
                 omegauno t più fi

dove

Equazione: omegauno quadro uguale a omega quadro meno beta quadro quarti

Provate il caso beta=0 e beta=1 entrambi con omega=4.
Confrontate il risultato numerico con la soluzione analitica.

Esercizio 2

Ripetete il punto 1. utilizzando RK al quart'ordine.

Sistema di equazioni:
   prima equazione: kappa1 uguale h per f di xn virgola tn  
   seconda equazione: kappa2 uguale h per f di xn più kappa1 mezzi virgola tn più h mezzi
   terza equazione: kappa3 uguale h per f di xn più kappa2 mezzi virgola tn più h mezzi
   quarta equazione: kappa4 uguale h per f di xn più kappa3 virgola tn più h 
   quinta equazione: xn più 1 uguale xn 
             più 
             kappa1 sesti più
             kappa2 terzi più
             kappa3 quarti più
             kappa4 sesti più
           termini di ordine h alla quinta e superiori

Esercizio 3

Affrontate uno di questi due problemi (facoltativo)

Come disegnare punti in movimento

Modifica di un grafico
Può essere utile poter modificare un grafico aggiungendo nuovi punti o modificando le coordinate di quelli già esistenti. Ad esempio quando calcolare numericamente x in funzione di t può essere utile aggiornare il grafico ogni volta che il punto viene calcolato in modo da controllarne l'andamento.

  ...
  // valore iniziale
  double t0=0.0;
  double x0=...;

  TGraph gr(1,&t0,&x0);     // definisco un grafico contenente un solo punto
  gr.SetMarkerStyle(20);    // definisco lo stile di punto associato
  gr.Draw("AP");            // disegno il grafico (con calcolo automatico degli assi)

  for (...){
    double t = ...;
    double x = ...;         // risultato del calcolo numerico..;
    gr.SetPoint(i,t,x);     // aggiungo un nuovo punto al grafico
    c.Modified();           // forzo l'aggiornamento (Update) della finestra
    c.Update();             // "dicendo" che in essa ci sono oggetti modificati (Modified)
  }
  ...

Traettoria 2D
Supponiamo di voler disegnare la traettoria di un punto nel piano x-y facendo "muovere" il punto.

  ...
  // valori iniziali
  double t0=0.0;
  double x0=...,double y0=...;

  TGraph gr(1,&x0,&y0);     // definisco un grafico contenente un solo punto
  gr.SetMarkerStyle(20);    // definisco lo stile di punto associato
  gr.Draw("AP");            // disegno il grafico (con calcolo automatico degli assi)

  for (int i=1;i<100;i++){
    double t = ...;
    double x = ...;         // risultato del calcolo numerico..
    double y = ...;         // risultato del calcolo numerico..
    gr.SetPoint(0,x,y);     // cambio le coordinate del punto
    c.Modified();           // forzo l'aggiornamento (Update) della finestra
    c.Update();             // "dicendo" che in essa ci sono oggetti modificati (Modified)
  }
  ...
Come noterete eseguendo questo codice il punto è sempre al centro del grafico (gli assi vengono ricalcolati automaticamente). Se si vuole che gli assi siano fissi (utile per visualizzare meglio la traettoria) occorre fissare gli estremi del grafico ad ogni disegno; ad es. se fissiamo gli estremi a [-3,3]x[-2,2] bisogna aggiungere prima di c.Modified(); il seguente codice:
  gr.GetXaxis()->SetLimits(-3,3);
  gr.SetMaximum(2); gr.SetMinimum(-2);
Grafici 3D
Supponiamo di voler disegnare la traettoria di un punto che si muove nello spazio.
  ...
  TView view(1);                  // Creo un sistema di assi cartesiani (1)
  view.SetRange(-2,-2,0,2,2,10);  // Fisso gli estremi [-2,2]x[-2,2]x[0,10]
  view.ShowAxis();                // Si devono vedere gli assi

  // valore iniziale
  double t0=0.0;
  double x0=...;
  double y0=...;
  double z0=...;

  TPolyMarker3D gr(1);            // Creo un grafico 3d fatto da un solo punto
  gr.SetPoint(0,x0,y0,z0);        // e ne fisso le coordinate

  gr.SetMarkerStyle(20);          // Definisco lo stile di punto associato
  gr.Draw();                      // Disegno il grafico

  for (int i=1;i<1000;i++){
    double t = t0+i*0.1;
    double x = ...;               // risultato del calcolo numerico..
    double y = ...;               // risultato del calcolo numerico..
    double z = ...;               // risultato del calcolo numerico..
    gr.SetPoint(0,x,y,z);         // Aggiorno le coordinate
    c.Modified();                 // forzo l'aggiornamento (Update) della finestra
    c.Update();                   // "dicendo" che in essa ci sono oggetti modificati (Modified)
  }
  ...