#include #include #include #include using namespace std; /* Pendule simple - Euler, RK4, petits angles */ const double K = 1.; void systeme(double* q, double t, double* qp, int n){ qp[0] = q[1]; qp[1] = -K * sin(q[0]); } void euler(void (*syst_ed)(double*,double,double*,int), double* q, double t, double dt, int n){ int i; double* qp = (double*)malloc(n * sizeof(double)); syst_ed(q,t,qp,n); for (i = 0; i < n; i++) q[i] = q[i] + dt*qp[i]; free(qp); } int main(){ int N = 2, ntot = 10000; fstream fich; double tdeb = 0., tfin = 100., dt, t, q0, qp0, qapp; double* q_eu = (double*)malloc(N * sizeof(double)); double* q_rk = (double*)malloc(N * sizeof(double)); dt = (tfin-tdeb) / (ntot-1); q0 = 1.; qp0 = 0.; q_eu[0] = q0; q_eu[1] = qp0; q_rk[0] = q0; q_rk[1] = qp0; fich.open("pendule.res", ios::out); for(t = tdeb; t <= tfin; t += dt){ qapp = q0*cos(sqrt(K)*t) + qp0/sqrt(K)*sin(sqrt(K)*t); fich << t << " " << q_eu[0] << " " << q_rk[0] << " " << qapp << endl; euler(systeme,q_eu,t,dt,N); rk4(systeme,q_rk,t,dt,N); } fich.close(); free(q_eu); free(q_rk); ostringstream pyth; pyth << "A = loadtxt('pendule.res')\n" << "plot(A[:,0], A[:,1], label='Euler')\n" << "plot(A[:,0], A[:,2], label='RK4')\n" << "plot(A[:,0], A[:,3], label='Petits angles')\n" << "legend()\n" ; make_plot_py(pyth); return 0; }