Main.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. double root(double x, int steps) {
  5. if(x == 0.0) {
  6. return 0.0;
  7. }
  8. double a = x;
  9. x /= 2;
  10. for(int i = 0; i < steps; i++) {
  11. x = (x + a / x) * 0.5;
  12. }
  13. return x;
  14. }
  15. double circle(double x) {
  16. return root(1 - x * x, 25);
  17. }
  18. double monteCarloIntegration() {
  19. int amount = 512 * 512;
  20. int in = 0;
  21. for(int i = 0; i < amount; i++) {
  22. double x = rand() / (double)RAND_MAX;
  23. double y = rand() / (double)RAND_MAX;
  24. in += (x * x + y * y < 1);
  25. }
  26. return 4.0 * in / amount;
  27. }
  28. double simpson(double a, double b) {
  29. return ((b - a) / 6.0) * (circle(a) + 4 * circle((a + b) * 0.5) + circle(b));
  30. }
  31. double simpsonIntegration() {
  32. double sum = 0.0;
  33. for(int i = 0; i < 100; i++) {
  34. sum += simpson(i / 100.0, (i + 1) / 100.0);
  35. }
  36. return 4.0 * sum;
  37. }
  38. double lineSum() {
  39. double sum = 0.0;
  40. const int max = 1000000;
  41. for(int i = 0; i < max; i++) {
  42. double x1 = (double)i / max;
  43. double x2 = (i + 1.0) / max;
  44. double diffX = x2 - x1;
  45. double diffY = circle(x2) - circle(x1);
  46. sum += root(diffX * diffX + diffY * diffY, 30);
  47. }
  48. return sum * 2.0;
  49. }
  50. double lineRecursion() {
  51. double x1 = 0.0;
  52. double y1 = 1.0;
  53. double x2 = 1.0;
  54. double y2 = 0.0;
  55. double factor = 2.0;
  56. for(int i = 0; i < 24; i++) {
  57. double midX = (x1 + x2) * 0.5;
  58. double midY = (y1 + y2) * 0.5;
  59. double length = root(midX * midX + midY * midY, 10);
  60. midX /= length;
  61. midY /= length;
  62. x2 = midX;
  63. y2 = midY;
  64. factor *= 2;
  65. }
  66. double diffX = x2 - x1;
  67. double diffY = y2 - y1;
  68. return root(diffX * diffX + diffY * diffY, 200) * factor;
  69. }
  70. void print(double d) {
  71. double diff = d - M_PI;
  72. printf("%.20lf %.20lf\n", d, diff < 0.0 ? -diff : diff);
  73. }
  74. int main() {
  75. print(monteCarloIntegration());
  76. print(simpsonIntegration());
  77. print(lineSum());
  78. print(lineRecursion());
  79. puts("3.14159265358979323846\n");
  80. return 0;
  81. }