fork download
  1. #include<stdio.h>
  2. #include<math.h>
  3. struct State
  4. {
  5. float x; // position
  6. float v; // velocity
  7. };
  8. struct Derivative
  9. {
  10. float dx; // dx/dt = velocity
  11. float dv; // dv/dt = acceleration
  12. };
  13. float acceleration( const State &state, float t )
  14. {
  15. const float k = 10;
  16. const float b = 1;
  17. return -k * state.x - b*state.v;
  18. }
  19. Derivative evaluate(const State &initial, float t, float dt, const Derivative &d)
  20. {
  21. State state;
  22. state.x = initial.x + d.dx*dt;
  23. state.v = initial.v + d.dv*dt;
  24. Derivative output;
  25. output.dx = state.v;
  26. output.dv = acceleration(state, t + dt);
  27. return output;
  28. }
  29. void integrate( State &state,
  30. float t,
  31. float dt )
  32. {
  33. Derivative a,b,c,d;
  34.  
  35. a = evaluate( state, t, 0.0f, Derivative() );
  36. b = evaluate( state, t, dt*0.5f, a );
  37. c = evaluate( state, t, dt*0.5f, b );
  38. d = evaluate( state, t, dt, c );
  39.  
  40. float dxdt = 1.0f / 6.0f *
  41. ( a.dx + 2.0f*(b.dx + c.dx) + d.dx );
  42.  
  43. float dvdt = 1.0f / 6.0f *
  44. ( a.dv + 2.0f*(b.dv + c.dv) + d.dv );
  45.  
  46. state.x = state.x + dxdt * dt;
  47. state.v = state.v + dvdt * dt;
  48. }
  49. int main( int argc, const char* argv[] )
  50. {
  51. State s1;
  52. s1.v = 0.0f;
  53. s1.x = 100.0f;
  54. float t = 0.0f;
  55. float dt = 0.1f;
  56. while (fabs(s1.x)>0.001f || fabs(s1.v)>0.001f){
  57. printf("X: %.2f, V: %.2f\n", s1.x, s1.v);
  58. integrate(s1, t, dt); t+= dt;}
  59. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
X: 100.00, V: 0.00
X: 95.20, V: -93.58
X: 81.88, V: -169.43
X: 62.10, V: -222.07
X: 38.34, V: -248.75
X: 13.22, V: -249.42
X: -10.75, V: -226.49
X: -31.43, V: -184.38
X: -47.18, V: -128.87
X: -56.97, V: -66.48
X: -60.46, V: -3.76
X: -57.91, V: 53.36
X: -50.14, V: 100.00
X: -38.38, V: 132.77
X: -24.12, V: 149.90
X: -8.93, V: 151.25
X: 5.65, V: 138.20
X: 18.31, V: 113.35
X: 28.04, V: 80.17
X: 34.20, V: 42.58
X: 36.54, V: 4.55
X: 35.22, V: -30.29
X: 30.69, V: -58.96
X: 23.70, V: -79.33
X: 15.14, V: -90.29
X: 5.97, V: -91.68
X: -2.90, V: -84.29
X: -10.65, V: -69.65
X: -16.65, V: -49.83
X: -20.52, V: -27.19
X: -22.08, V: -4.14
X: -21.41, V: 17.10
X: -18.78, V: 34.71
X: -14.63, V: 47.37
X: -9.50, V: 54.36
X: -3.95, V: 55.55
X: 1.44, V: 51.39
X: 6.18, V: 42.77
X: 9.88, V: 30.94
X: 12.30, V: 17.31
X: 13.33, V: 3.35
X: 13.01, V: -9.60
X: 11.48, V: -20.41
X: 9.02, V: -28.27
X: 5.95, V: -32.72
X: 2.60, V: -33.65
X: -0.67, V: -31.32
X: -3.57, V: -26.25
X: -5.86, V: -19.19
X: -7.37, V: -11.00
X: -8.05, V: -2.54
X: -7.90, V: 5.35
X: -7.02, V: 11.99
X: -5.56, V: 16.86
X: -3.72, V: 19.68
X: -1.70, V: 20.37
X: 0.29, V: 19.08
X: 2.06, V: 16.11
X: 3.47, V: 11.90
X: 4.42, V: 6.97
X: 4.86, V: 1.85
X: 4.80, V: -2.96
X: 4.29, V: -7.03
X: 3.43, V: -10.05
X: 2.32, V: -11.83
X: 1.10, V: -12.33
X: -0.10, V: -11.62
X: -1.19, V: -9.88
X: -2.05, V: -7.37
X: -2.64, V: -4.40
X: -2.93, V: -1.31
X: -2.91, V: 1.62
X: -2.62, V: 4.12
X: -2.11, V: 5.99
X: -1.45, V: 7.11
X: -0.71, V: 7.46
X: 0.02, V: 7.07
X: 0.68, V: 6.05
X: 1.21, V: 4.56
X: 1.58, V: 2.78
X: 1.77, V: 0.90
X: 1.77, V: -0.88
X: 1.60, V: -2.41
X: 1.30, V: -3.56
X: 0.90, V: -4.27
X: 0.46, V: -4.51
X: 0.01, V: -4.30
X: -0.39, V: -3.71
X: -0.72, V: -2.82
X: -0.95, V: -1.75
X: -1.06, V: -0.62
X: -1.07, V: 0.47
X: -0.98, V: 1.40
X: -0.80, V: 2.12
X: -0.56, V: 2.57
X: -0.29, V: 2.73
X: -0.03, V: 2.62
X: 0.22, V: 2.27
X: 0.42, V: 1.74
X: 0.57, V: 1.10
X: 0.64, V: 0.42
X: 0.65, V: -0.24
X: 0.60, V: -0.82
X: 0.49, V: -1.26
X: 0.35, V: -1.54
X: 0.19, V: -1.65
X: 0.03, V: -1.59
X: -0.13, V: -1.39
X: -0.25, V: -1.08
X: -0.34, V: -0.69
X: -0.39, V: -0.28
X: -0.39, V: 0.12
X: -0.36, V: 0.47
X: -0.30, V: 0.75
X: -0.22, V: 0.92
X: -0.12, V: 1.00
X: -0.02, V: 0.97
X: 0.07, V: 0.85
X: 0.15, V: 0.66
X: 0.20, V: 0.43
X: 0.23, V: 0.18
X: 0.24, V: -0.06
X: 0.22, V: -0.28
X: 0.18, V: -0.44
X: 0.13, V: -0.55
X: 0.08, V: -0.60
X: 0.02, V: -0.59
X: -0.04, V: -0.52
X: -0.09, V: -0.41
X: -0.12, V: -0.27
X: -0.14, V: -0.12
X: -0.14, V: 0.03
X: -0.13, V: 0.16
X: -0.11, V: 0.26
X: -0.08, V: 0.33
X: -0.05, V: 0.36
X: -0.01, V: 0.36
X: 0.02, V: 0.32
X: 0.05, V: 0.25
X: 0.07, V: 0.17
X: 0.08, V: 0.08
X: 0.09, V: -0.01
X: 0.08, V: -0.09
X: 0.07, V: -0.16
X: 0.05, V: -0.20
X: 0.03, V: -0.22
X: 0.01, V: -0.22
X: -0.01, V: -0.19
X: -0.03, V: -0.16
X: -0.04, V: -0.11
X: -0.05, V: -0.05
X: -0.05, V: 0.00
X: -0.05, V: 0.05
X: -0.04, V: 0.09
X: -0.03, V: 0.12
X: -0.02, V: 0.13
X: -0.01, V: 0.13
X: 0.01, V: 0.12
X: 0.02, V: 0.10
X: 0.03, V: 0.07
X: 0.03, V: 0.03
X: 0.03, V: -0.00
X: 0.03, V: -0.03
X: 0.03, V: -0.05
X: 0.02, V: -0.07
X: 0.01, V: -0.08
X: 0.00, V: -0.08
X: -0.00, V: -0.07
X: -0.01, V: -0.06
X: -0.02, V: -0.04
X: -0.02, V: -0.02
X: -0.02, V: -0.00
X: -0.02, V: 0.02
X: -0.02, V: 0.03
X: -0.01, V: 0.04
X: -0.01, V: 0.05
X: -0.00, V: 0.05
X: 0.00, V: 0.04
X: 0.01, V: 0.04
X: 0.01, V: 0.03
X: 0.01, V: 0.01
X: 0.01, V: 0.00
X: 0.01, V: -0.01
X: 0.01, V: -0.02
X: 0.01, V: -0.03
X: 0.00, V: -0.03
X: 0.00, V: -0.03
X: -0.00, V: -0.03
X: -0.00, V: -0.02
X: -0.01, V: -0.02
X: -0.01, V: -0.01
X: -0.01, V: -0.00
X: -0.01, V: 0.01
X: -0.01, V: 0.01
X: -0.00, V: 0.02
X: -0.00, V: 0.02
X: -0.00, V: 0.02
X: 0.00, V: 0.02
X: 0.00, V: 0.01
X: 0.00, V: 0.01
X: 0.00, V: 0.01
X: 0.00, V: 0.00
X: 0.00, V: -0.00
X: 0.00, V: -0.01
X: 0.00, V: -0.01
X: 0.00, V: -0.01
X: 0.00, V: -0.01
X: -0.00, V: -0.01
X: -0.00, V: -0.01
X: -0.00, V: -0.01
X: -0.00, V: -0.00
X: -0.00, V: -0.00
X: -0.00, V: 0.00
X: -0.00, V: 0.00
X: -0.00, V: 0.01
X: -0.00, V: 0.01
X: -0.00, V: 0.01
X: 0.00, V: 0.01
X: 0.00, V: 0.01
X: 0.00, V: 0.00
X: 0.00, V: 0.00
X: 0.00, V: 0.00
X: 0.00, V: -0.00
X: 0.00, V: -0.00
X: 0.00, V: -0.00
X: 0.00, V: -0.00
X: 0.00, V: -0.00
X: -0.00, V: -0.00
X: -0.00, V: -0.00
X: -0.00, V: -0.00
X: -0.00, V: -0.00