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 (Runge-Kutta del secondo o quarto ordine) lo applicherete alla soluzione dell'equazione del moto di uno o piu' corpi (scegliete uno tra gli esempi proposti) calcolandone e disegnandone la traettoria (sia disegnando funzione x(t) sia "disegnando" il movimento del corpo - vedi nel seguito).

Impostazione del problema
Problemi proposti
Come disegnare punti in movimento

Problemi proposti

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=sin(t0);

  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 (cerchio di raggi unitario) nel piano x-y facendo "muovere" il punto.

  ...
  // valori iniziali
  double t0=0.0;
  double x0=cos(t0),double y0=sin(t0);

  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 = t0+i*0.1;
    double x = cos(t);
    double y = sin(t);
    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 lungo un cerchio di raggi unitario nel piano x-y e con velocità uniforme lungo z
  ...
  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=cos(t0); 
  double y0=sin(t0); 
  double z0=0.0,vz=0.1;

  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 = cos(t);
    double y = sin(t);
    double z = vz*t;
    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)
  }
  ...