lab4.c 4.4 KB

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