Advertisement
LegoSosiska

HELL 2 TORTURE EDITION

May 10th, 2022
950
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <functional>
  3. #include <cmath>
  4.  
  5. double delta = 0.000001;
  6.  
  7. double f1(double x) {
  8.     return exp(x) + 2;
  9. }
  10.  
  11. double f2(double x) {
  12.     return -(5 / x);
  13. }
  14.  
  15. double f3(double x) {
  16.     return -2 * x + 8;
  17. }
  18.  
  19. double f1d1(double x) {
  20.     return exp(x);
  21. }
  22.  
  23. double f2d1(double x) {
  24.     return 5 / (x * x);
  25. }
  26.  
  27. double f3d1(double x) {
  28.     return -2;
  29. }
  30.  
  31. double f1d2(double x) {
  32.     return exp(x);
  33. }
  34.  
  35. double f2d2(double x) {
  36.     return -10 / (x * x * x);
  37. }
  38.  
  39. double f3d2(double x) {
  40.     return 0;
  41. }
  42.  
  43. double f1mf2(double x) {
  44.     return f1(x) - f2(x);
  45. }
  46.  
  47. double f2mf3(double x) {
  48.     return f2(x) - f3(x);
  49. }
  50.  
  51. double f1mf3(double x) {
  52.     return f1(x) - f3(x);
  53. }
  54.  
  55. double f1d1mf2d1(double x) {
  56.     return f1d1(x) - f2d1(x);
  57. }
  58.  
  59. double f2d1mf3d1(double x) {
  60.     return f2d1(x) - f3d1(x);
  61. }
  62.  
  63. double f1d1mf3d1(double x) {
  64.     return f1d1(x) - f3d1(x);
  65. }
  66.  
  67. double f1d2mf2d2(double x) {
  68.     return f1d2(x) - f2d2(x);
  69. }
  70.  
  71. double f2d2mf3d2(double x) {
  72.     return f2d2(x) - f3d2(x);
  73. }
  74.  
  75. double f1d2mf3d2(double x) {
  76.     return f1d2(x) - f3d2(x);
  77. }
  78.  
  79. double Root(double a, double b, std::function<double(double)> f, std::function<double(double)> d1, std::function<double(double)> d2) {
  80.     bool to_right = d1((a + b) / 2) * d2((a + b) / 2) > 0;
  81.  
  82.     for (;;) {
  83.         double c = (std::abs(f(b)) * a + std::abs(f(a)) * b) / (std::abs(f(b)) + std::abs(f(a)));
  84.  
  85.         double d;
  86.         if (to_right) {
  87.             d = (std::fabs(d1(b)) * b - std::fabs(f(b))) / std::fabs(d1(b));
  88.         }
  89.         else {
  90.             d = (std::fabs(d1(a)) * a + std::fabs(f(a))) / std::fabs(d1(a));
  91.         }
  92.         if (to_right) {
  93.             if (f(c) * f(c + delta) < 0) return c;
  94.             if (f(d) * f(d - delta) < 0) return d;
  95.         }
  96.         else {
  97.             if (f(c) * f(c - delta) < 0) return c;
  98.             if (f(d) * f(d + delta) < 0) return d;
  99.         }
  100.  
  101.         if (to_right) {
  102.             a = c;
  103.             b = d;
  104.         }
  105.         else {
  106.             b = c;
  107.             a = d;
  108.         }
  109.     }
  110. }
  111.  
  112. double Area(double a, double b, std::function<double(double)> f) {
  113.     double ans = 0;
  114.     for (double i = a; i < b; i += delta) {
  115.         ans += delta * f(i);
  116.     }
  117.     return ans;
  118. }
  119.  
  120. double FinalArea(std::function<double(double)> f1, std::function<double(double)> f2, std::function<double(double)> f3,
  121.         std::function<double(double)> f1d1, std::function<double(double)> f2d1, std::function<double(double)> f3d1,
  122.         std::function<double(double)> f1d2, std::function<double(double)> f2d2, std::function<double(double)> f3d2,
  123.         std::function<double(double)> f1d1mf2d1, std::function<double(double)> f2d1mf3d1, std::function<double(double)> f1d1mf3d1,
  124.         std::function<double(double)> f1mf2, std::function<double(double)> f2mf3, std::function<double(double)> f1mf3,
  125.         std::function<double(double)> f1d2mf2d2, std::function<double(double)> f2d2mf3d2, std::function<double(double)> f1d2mf3d2) {
  126.     double a = Root(-2, -0.1, f2mf3, f2d1mf3d1, f2d2mf3d2);
  127.     double b = Root(-4, -2, f1mf2, f1d1mf2d1, f1d2mf2d2);
  128.     double c = Root(0, 2, f1mf3, f1d1mf3d1, f1d2mf3d2);
  129.     return Area(b, a, f2) - Area(b, a, f1) + (Area(a, c, f3) - Area(a, c, f1));
  130. }
  131.  
  132. int main() {
  133.     std::cout << FinalArea(f1, f2, f3, f1d1, f2d1, f3d1, f1d2, f2d2, f3d2, f1d1mf2d1, f2d1mf3d1, f1d1mf3d1, f1mf2, f2mf3, f1mf3, f1d2mf2d2, f2d2mf3d2, f1d2mf3d2);
  134. }
  135.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement