Metodo di Eulero per risolvere equazioni differenziali del primo ordine mediante C++. In questo caso รจ studiato un moto oscillatorio:



//Equazioni differenziali del I ordine
//Metodo di Eulero
//Moto oscillatorio

#include < iostream >
#include < fstream >
#include < cmath >
#include "funz.h"
#include "TGraph.h"
#include "TApplication.h"
#include "TCanvas.h"

using namespace std;

//Condizioni iniziali

int main(int argc, char*argv[]) {

TApplication App("App", &argc, argv);
  double x[2], h, tmax;
  cerr << "Inserisci la posizione al tempo 0: ";
  cin  >> x[0];
  cerr << "Inserisci la velocita' al tempo 0: ";
  cin  >> x[1];
  cerr << "Integro fino al tempo: ";
  cin  >> tmax;
  cerr << "con passo:  ";
  cin  >> h;


//Calcolo della posizione al tempo finale

  ofstream f("oscill.dat");
  double t=0;
  while (t<=tmax) {
    f << t << "\t" << x[0] << "\t" << x[1] << endl;
    eulero(t,h,2,x,oscillatore);
  }
  f.close();

//Grafico tempo - posizione

  ifstream in1("oscill.dat");
  double v,s;
  TGraph grafico1;
  int punto1=0;
  while (1) {
    in1 >> t >> s >> v;
    if ( in1.eof() ) break;
    grafico1.SetPoint(punto1,t,s);
    punto1++;
  }
  
  TCanvas *c1 = new TCanvas("c1", "Grafico posiz - tempo", 600, 400);
  c1->cd();
  grafico1.Draw("AL"); 
  in1.close();
  
//Grafico tempo - posizione + errori

  double fre=1. ; // frequenza
  double omega=2.*TMath::Pi()*fre;  
  double x0=0., v0=1.; // condizioni iniziali
  double E = 0.5*(v0*v0+omega*omega*x0*x0);   // energia dell'oscillatore
  double A = sqrt(2.*E)/omega;   // ampiezza dell'oscillazione
  double Phi = atan2(v0,x0*omega);     // fase dell'oscillazione al tempo 0
  
  //double x,v;
  TGraph grafico2;
  int punto2=0;
  
  ifstream in2("oscill.dat");
  while (1) {
    in2 >> t >> s >> v;
    if ( in2.eof() ) break;
    double err = fabs(s-A*cos(omega*t-Phi));
    grafico2.SetPoint(punto2,t,err);
    punto2++;
  }
  in2.close();

  TCanvas *c2 = new TCanvas("c2", "Grafico errori", 600, 400);
    c2->cd();
    grafico2.Draw("AL");

App.Run();
return 0;

}


Categories: