| Reference | Tutorial | Example Code |
| smtk::plotter_2d | interactive phase space plotter |
This example interactively solves damped simple harmonic oscillator. A damped simple harmonic oscillator can be written as two first order ordinary differatial equations (ODEs).
#include <math.h> #include <smtk.h> #include <smtk/rk4.h> #include <smtk/plotter_2d.h> static const double pi = 3.1415926535897932385; static const double num_pi = 4.0; // size of X region plus a little. // This should be a multiple of 2. static const double xmin = -2.0, xmax = xmin + num_pi; // X region (xmin, xmax] static const double b = 0.1; // parameter: damping constant static const double k = sqrt(2); static double x[2]; // position (angular position), velocity (angular velocity) static double t; // time static void difeq(double *xdot, const double *x, double t) { xdot[0] = k * x[1]; xdot[1] = - sin(pi*x[0]) - b * x[1]; } static smtk::rk4<double,double,double> rk4(difeq, /* differential equations call-back function */ 2, /* 2 equations */ 0.04 /* time step */); static double *init(double x_in, double y_in, bool &do_draw) { x[0] = x_in; // position x[1] = y_in; // velocity t = 0.0; // time if(x[0] > xmax || x[0] <= xmin) { while(x[0] > xmax) x[0] -= 2*pi; while(x[0] <= xmin) x[0] += 2*pi; } return x; } static double *step(bool &do_draw, bool &show_line) { rk4.go(x, &t); // Map the position back into the region (-pi, pi] or (-1,1] with // the position defined by angle/pi. If it jumps more than 2 (2 pi) // then you've got bigger problems than this remapping. if(x[0] > xmax || x[0] <= xmin) { show_line = false; if(x[0] > xmax) x[0] -= num_pi; else if(x[0] <= xmin) x[0] += num_pi; } // 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 Pendulum"). set_callbacks(1, init, step). set_line_width(3). set_point_width(2). set_scale(xmin+0.2, xmax-0.2, -2.1, 2.1). run(); return 0; }
1.5.2