lab5.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. typedef struct {
  5. double value, tolerance;
  6. int iteraction;
  7. } solution;
  8. double poly(double x) {
  9. return 0.25 * pow(x,3) + x - 1.2502;
  10. }
  11. double alg(double x) {
  12. return pow(x,4) + 3 * pow(x,3) - 9 * x - 9;
  13. }
  14. double algbrake(double x) {
  15. return -(pow(x,4) + 3 * pow(x,3) - 9 * x - 9)/(x-1.5);
  16. }
  17. double secant(double(*f)(double), double xk, double xk1, double eps, int N) {
  18. double xk2;
  19. double fxk = f(xk);
  20. double fxk1 = f(xk1);
  21. for (int i = 1; i < N; i++)
  22. {
  23. if (fabs(xk1 - xk) < eps) {
  24. break;
  25. }
  26. xk2 = xk1 - fxk1 * ((xk1 - xk) / (fxk1 - fxk));
  27. xk = xk1;
  28. fxk = fxk1;
  29. xk1 = xk2;
  30. fxk1 = f(xk2);
  31. }
  32. return xk2;
  33. }
  34. solution secant_solution(double(*f)(double), double xk, double xk1, double eps, int N) {
  35. double xk2;
  36. double fxk = f(xk);
  37. double fxk1 = f(xk1);
  38. solution sol;
  39. double secant_sol = secant(f, xk, xk1, pow(10, -15), 1000);
  40. for (int i = 1; i < N+1; i++)
  41. {
  42. sol.iteraction = i;
  43. if (fabs(xk1 - xk) < eps) {
  44. break;
  45. }
  46. xk2 = xk1 - fxk1 * ((xk1 - xk) / (fxk1 - fxk));
  47. sol.value = xk2;
  48. sol.tolerance = fabs(xk2 - secant_sol);
  49. xk = xk1;
  50. fxk = fxk1;
  51. xk1 = xk2;
  52. fxk1 = f(xk2);
  53. }
  54. return sol;
  55. }
  56. void SolutionSecantComparison(double(*f)(double), double a, double b, double eps, int N, char const *filename) {
  57. solution solu;
  58. FILE* file;
  59. file = fopen(filename, "w+");
  60. for (int i = 1; i < N; i++) {
  61. solu = secant_solution(f, a, b, eps, i);
  62. fprintf(file, "%d, %e, %lf\n", solu.iteraction, solu.tolerance, solu.value);
  63. if (solu.tolerance < eps) {
  64. break;
  65. }
  66. }
  67. fclose(file);
  68. }
  69. double bisection(double(*f)(double), double a, double b, double eps, int N) {
  70. double fa = f(a);
  71. double fb = f(b);
  72. double c;
  73. if (fa * fb >= 0) {
  74. return 0;
  75. }
  76. for (int i = 0; i < N; i ++)
  77. {
  78. c = 0.5 * (a + b);
  79. if ((b - a) < 2*eps) {
  80. return c;
  81. }
  82. double fc = f(c);
  83. if (fa * fc > 0) {
  84. a = c;
  85. fa = fc;
  86. }
  87. else {
  88. b = c;
  89. fb = fc;
  90. }
  91. }
  92. return c;
  93. }
  94. solution bisection_solution(double(*f)(double), double a, double b, double eps, int N) {
  95. double fa = f(a);
  96. double fb = f(b);
  97. double c;
  98. solution sol;
  99. double bisection_sol = bisection(f, a, b, pow(10, -15), 1000);
  100. for (int i = 1; i < N+1; i ++)
  101. {
  102. sol.iteraction = i;
  103. c = 0.5 * (a + b);
  104. sol.value = c;
  105. if ((b - a) < 2*eps) {
  106. return sol;
  107. }
  108. double fc = f(c);
  109. if (fa * fc > 0) {
  110. a = c;
  111. fa = fc;
  112. }
  113. else {
  114. b = c;
  115. fb = fc;
  116. }
  117. sol.tolerance = fabs(c - bisection_sol);
  118. }
  119. return sol;
  120. }
  121. void SolutionBisectionComparison(double(*f)(double), double a, double b, double eps, int N, char const *filename) {
  122. solution solu;
  123. FILE* file;
  124. file = fopen(filename, "w+");
  125. for (int i = 1; i < N; i++) {
  126. solu = bisection_solution(f, a, b, eps, i);
  127. fprintf(file, "%d, %e, %lf\n", solu.iteraction, solu.tolerance, solu.value);
  128. if (solu.tolerance < eps) {
  129. break;
  130. }
  131. }
  132. fclose(file);
  133. }
  134. void PrintResultSolution(solution result) {
  135. printf("Value: %.10lf\n", result.value);
  136. printf("Tolerance: %.10lf\n", result.tolerance);
  137. printf("Iteration: %d\n", result.iteraction);
  138. }
  139. void PrintResult (double eps) {
  140. solution x1 = secant_solution(algbrake, 1.51, 2, eps, 1000);
  141. solution x2 = bisection_solution(algbrake, 1.51, 2, eps, 1000);
  142. printf("Function with a brake: \n");
  143. printf("Secant method: \n");
  144. PrintResultSolution(x1);
  145. printf("Bisection method: \n");
  146. PrintResultSolution(x2);
  147. solution x3 = secant_solution(alg, 1, 2, eps, 1000);
  148. solution x4 = bisection_solution(alg, 1, 2, eps, 1000);
  149. printf("Algebraic function: \n");
  150. printf("Secant method: \n");
  151. PrintResultSolution(x3);
  152. printf("Bisection method: \n");
  153. PrintResultSolution(x4);
  154. solution x5 = secant_solution(poly, 0, 2, eps, 1000);
  155. solution x6 = bisection_solution(poly, 0, 2, eps, 1000);
  156. printf("Polynomial: \n");
  157. printf("Secant method: \n");
  158. PrintResultSolution(x5);
  159. printf("Bisection method: \n");
  160. PrintResultSolution(x6);
  161. }
  162. int main() {
  163. PrintResult(pow(10, -10));
  164. printf("\n\n");
  165. PrintResult(2*pow(10, -11));
  166. }