| Reference | Tutorial | Example Code |
| smtk::plotter_2d | interactive phase space plotter |
This example interactively solves damped simple harmonic oscillator with multiple initial conditions.
// doc/plotter_2d.dox should be consistent with this file. #include <math.h> #include <smtk.h> #include <smtk/rk4.h> #include <smtk/plotter_2d.h> static const double pi = 3.1415926535897932385; static const double b = 0.1; // parameter: damping constant static const int num_plots = 51; // number of plots static double x[2*num_plots]; static double t; // time static void difeq(double *xdot, const double *x, double t) { int i=0; for(;i<num_plots;i++) { xdot[0+i*2] = x[1+i*2]; xdot[1+i*2] = - x[0+i*2] - b * x[1+i*2]; } } static smtk::rk4<double,double,double> rk4(difeq, /* differential equations call-back function */ 2*num_plots, /* 2 equations */ 0.04 /* time step */); static double *init(double x_in, double y_in, bool &do_draw) { const double aspect = 1.0; // x_radius/y_radius const double radius = 1.5; const double x_radius = radius/aspect; const double v_radius = radius*aspect; t = 0.0; // time int i=0; for(;i<num_plots;i++) { x[0+i*2] = x_in + x_radius * cos(2*pi*i/num_plots); // position x[1+i*2] = y_in + v_radius * sin(2*pi*i/num_plots); // velocity } return x; } static double *step(bool &do_draw, bool &show_line) { rk4.go(x, &t); // usleep slows this down. Remove/add this to speed/slow it up. usleep(10000); return x; } int main(void) { smtk::plotter_2d plotter; plotter. set_window_title("Damped Simple Harmonic Oscillator " "with many initial conditions"). set_callbacks(num_plots, init, step). set_line_width(3). set_point_width(2). set_scale(-2.0, 2.0, -2.1, 2.1). run(); return 0; }
1.5.2