////////////////////////////////////////////////////////////////////////////
// Model LORENZ.CPP               SIMLIB/C++
//
// Lorenzova rovnice:
//
//      dx1/dt = sigma * (x2 - x1)
//      dx2/dt = (1 + lambda - x3) * x1 - x2
//      dx3/dt = x1 * x2 - b * x3
//
// kde:  sigma=10, lambda=24 a b=2  jsou parametry
// počáteční podmínky:  xi(0) = 1.0
//
// Zdroj: SimPack
//

#include "simlib.h"
#include <stdlib.h>

const double StepPrn = 0.01;    // krok výpisu

struct Lorenz {
  Integrator x1, x2, x3;
  Lorenz(double sigma, double lambda, double b) :
    x1(sigma*(x2 - x1), 1),           // dx1/dt = sigma * (x2 - x1)
    x2((1 + lambda - x3)*x1 - x2, 1), // dx2/dt = (1 + lambda - x3) * x1 - x2
    x3(x1*x2 - b*x3, 1) {}            // dx3/dt = x1 * x2 - b * x3
};

Lorenz L(10, 24, 2);            // model systému

// výstupy:
void Sample() { 
  Print("%6.2f %g %g %g\n", T.Value(), L.x1.Value(), L.x2.Value(), L.x3.Value()); 
}
Sampler S(Sample, StepPrn);

int main(int argc, char *argv[]) {  // experiment
  double maxtime = 30.0;
  if(argc>1) 
    maxtime = atof(argv[1]);        // parametr
  if(maxtime<1.0) {
     _Print("\nPoužití:  %s  [maxtime>1,default=30] \n\n", argv[0]);
     return 1;
  }
  SetOutput("lorenz.dat");
  _Print("# LORENZ - Lorenzova rovnice (maxtime=%g) \n", maxtime);
  Print("# Time x1 x2 \n");
  Init(0, maxtime);             // inicializace
  SetAccuracy(1e-3);            // požadovaná přesnost
  Run();                        // simulace
  return 0;
}

// konec


syntax highlighted by Code2HTML, v. 0.9.1