Advertisement
Guest User

Problem 3 main.c

a guest
May 3rd, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. double integrand(double x)
  5. {
  6.     if (x!=0){
  7.     return x / sqrt(cosh(4) - cosh(4-x*x));
  8.     }
  9.     else return 1/sqrt(sinh(4));
  10. }
  11.  
  12. double f (double x)
  13. {
  14.     return -sinh(x);
  15. }
  16.  
  17. double E (double x, double v)
  18. {
  19.     return v*v/2 + cosh(x);
  20. }
  21.  
  22. void derivs(double t, double y[], double dydt[])
  23. {
  24.     dydt[0] = y[1];
  25.     dydt[1] = - sinh(y[0]);
  26.  
  27. }
  28.  
  29.  
  30. int main()
  31. {
  32. double simp(), f(), a, b, T, EPS, ans, prevans;
  33. int n=0;
  34. a=0;
  35. b=2;
  36. T=0;
  37. prevans = 1e50;
  38. EPS = 1e-5;
  39.  
  40.  
  41. for(n=2; fabs(T - prevans)>EPS; n*=2)
  42.  {
  43.     ans = simp(integrand,a,b,n);
  44.     prevans = T;
  45.     T = 4*sqrt(2)* ans;
  46. }
  47.    printf("T = %10.5f \n\n", T);
  48.  
  49. double f(), x, v, h, t, E(), DeltaEmax, E_exact = cosh(4), k;
  50. h = T/50;
  51. t = 0;
  52. DeltaEmax=0;
  53. printf("Verlet Algorithm:\n\n"
  54.        " n         DeltaE_max\n\n");
  55. for(n=1; n<=100; n*=10){
  56. v = 0; x = 4;
  57.     for(t=h; t<n*(T)+h; t+=h)
  58.     {
  59.         v+= h / 2 * f(x);
  60.         x+= h*v;
  61.         v+=h/2*f(x);
  62.         k = fabs(E(x,v)-E_exact);
  63.         if(k>DeltaEmax)
  64.             DeltaEmax = k;
  65.  
  66.     }
  67. printf("%3d %15.5f \n", n,  DeltaEmax);
  68. }
  69.  
  70. printf("\n RK2 Algorithm:\n\n"
  71.        " n          DeltaE_max\n\n");
  72. int M = 2;
  73. double rk2(), y[M];
  74. extern void derivs();
  75. DeltaEmax= 0;
  76. for(n=1; n<=100; n*=10){
  77.     y[0]=4; y[1] = 0;
  78.     for(t=h; t<=n*(T)+h; t+=h){
  79.         rk2(t, y, derivs, h, M);
  80.         k = fabs(E(y[0],y[1])-E_exact);
  81.         if(k>DeltaEmax)
  82.             DeltaEmax = k;
  83.  
  84.     }
  85.  printf("%3d %15.5f \n", n, DeltaEmax);
  86.  
  87. }
  88.  
  89.  
  90.  
  91.  
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement