Advertisement
Guest User

Untitled

a guest
Jan 27th, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.49 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5. double force(double x, double k, double m, double alpha);
  6. void passo(double *v, double *x, double m, double k, double alpha, double t);
  7. int main() {
  8. double xmax, k, m, alpha;
  9. k = 9.81;
  10. m = 1.0;
  11. alpha = -1/6;
  12. double Thar = 2*M_PI*sqrt(m/k);
  13. printf("Il periodo valido per piccole oscillazioni e': %.5lf\n",Thar);
  14. double dt = Thar/pow(2,20);
  15. printf("Il passo temporale vale: %e\n",dt);
  16. double v, x, t, Ts[3], Test, err[30][2];
  17. int n, zeri;
  18. for (n = 0; n < 30; n++) {
  19. xmax = M_PI*(n+1)/180;
  20. err[n][0] = xmax;
  21. v = 0;
  22. t = 0;
  23. zeri = 0;
  24. x = xmax;
  25. do {
  26. passo(&v,&x,m,k,alpha,dt);
  27. t += dt;
  28. if (xmax*x < 0) {
  29. Ts[zeri++] = t;
  30. }
  31. xmax = x;
  32. } while (zeri < 3);
  33. Test = Ts[2] - Ts[0];
  34. err[n][1] = 100.0*fabs(Thar - Test)/(Thar);
  35. }
  36. FILE *f;
  37. f = fopen("differenza.dat","w");
  38. for (n = 0; n < 30; n++) {
  39. fprintf(f,"%lf %lf\n",err[n][0], err[n][1]);
  40. }
  41. fclose(f);
  42. }
  43.  
  44. double force(double x, double k, double m, double alpha) {
  45. return (-k/m)*(x + alpha*x*x*x);
  46. }
  47.  
  48. void passo(double *v, double *x, double m, double k, double alpha, double t) {
  49. double tempx = *x;
  50. double tempv = *v;
  51. tempv += force(tempx,k,m,alpha)*t;
  52. tempx += tempv*t;
  53. *x = tempx;
  54. *v = tempv;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement