freesky

task_sem3_4.6

Dec 18th, 2013
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.69 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdio.h>
  3.  
  4. #define K_1 2.50
  5. #define K_2 0.75
  6. #define A_0 1.00
  7. #define B_0 0.00
  8.  
  9. double diffA(double a, double b) { // equation #1
  10.     return (-K_1 * a + K_2 * b);
  11. }
  12.  
  13. double diffB(double a, double b) { // equation #2
  14.     return (K_1 * a - K_2 * b);
  15. }
  16.  
  17. double exactA(double t) {
  18.     return (A_0 - (K_1 * A_0 - K_2 * B_0) / (K_1 + K_2) * (1 - exp(-(K_1 + K_2) * t)));
  19. }
  20.  
  21. double exactB(double t) {
  22.     return (A_0 + B_0 - exactA(t));
  23. }
  24.  
  25. int main(int argc, char *argv[]) {
  26.     double t, h; // final time (t) and step (h)
  27.     double a, b;
  28.     double dt;
  29.  
  30.     printf("t = "); scanf("%lf", &t);
  31.     printf("h = "); scanf("%lf", &h);
  32.  
  33.     // usual Euler's method
  34.     a = A_0;
  35.     b = B_0;
  36.     dt = 0;
  37.  
  38.     do {
  39.         a = a + h * diffA(a, b);
  40.         b = b + h * diffB(a, b);
  41.  
  42.         if (dt >= t)
  43.             break;
  44.         else if ((t - dt) < h)
  45.             dt = t;
  46.         else
  47.             dt += h;
  48.     } while (1);
  49.  
  50.     printf("USUAL EULER'S METHOD\t\ta = %.10e\tb = %.10e\texact(a) = %.10e\texact(b) = %.10e\n", a, b, exactA(t), exactB(t));
  51.  
  52.     // modified Euler's method
  53.     double ta, tb; // temporary values
  54.     a = A_0;
  55.     b = B_0;
  56.     dt = 0;
  57.  
  58.     do {
  59.         ta = a + h * diffA(a, b);
  60.         a = a + h * (diffA(a, b) + diffA(ta, b + h)) / 2;
  61.  
  62.         tb = a + h * diffB(a, b);
  63.         b = b + h * (diffB(a, b) + diffB(tb, b + h)) / 2;
  64.  
  65.         if (dt >= t)
  66.             break;
  67.         else if ((t - dt) < h)
  68.             dt = t;
  69.         else
  70.             dt += h;
  71.     } while (1);
  72.  
  73.     printf("MODIFIED EULER'S METHOD\t\ta = %.10e\tb = %.10e\texact(a) = %.10e\texact(b) = %.10e\n", a, b, exactA(t), exactB(t));
  74.  
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment