fork download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. // Функция f(x) = 2x - 3*ln(x) - 3
  5. double f(double x) {
  6. return 2 * x - 3 * log(x) - 3;
  7. }
  8.  
  9. // Метод половинного деления
  10. double bisection(double a, double b, double epsilon, int max_iterations) {
  11. double c, fa, fc;
  12. int iteration = 0;
  13.  
  14. printf("Итерация | x | f(x) \n");
  15. printf("---------|-------------|------------\n");
  16.  
  17. // Проверка смены знака на концах интервала
  18. if (f(a) * f(b) >= 0) {
  19. printf("На интервале [%.2f, %.2f] функция не меняет знак. Метод не применим.\n", a, b);
  20. return NAN;
  21. }
  22.  
  23. do {
  24. c = (a + b) / 2.0; // Середина интервала
  25. fa = f(a);
  26. fc = f(c);
  27.  
  28. // Вывод текущей итерации
  29. printf("%8d | %11.8f | %11.8f\n", iteration + 1, c, fc);
  30.  
  31. // Выбор подынтервала для следующей итерации
  32. if (fa * fc < 0) {
  33. b = c; // Корень находится в [a, c]
  34. } else {
  35. a = c; // Корень находится в [c, b]
  36. }
  37.  
  38. iteration++;
  39. } while (fabs(b - a) > epsilon && iteration < max_iterations);
  40.  
  41. return (a + b) / 2.0; // Приближённое значение корня
  42. }
  43.  
  44. int main() {
  45. double a = 0.5; // Левая граница интервала
  46. double b = 0.6; // Правая граница интервала
  47. double epsilon = 1e-4; // Точность
  48. int max_iterations = 100; // Максимальное число итераций
  49.  
  50. printf("Решение уравнения: 2x - 3*ln(x) - 3 = 0\n");
  51. printf("Интервал: [%.2f, %.2f]\n", a, b);
  52. printf("Точность: %.0e\n\n", epsilon);
  53.  
  54. double root = bisection(a, b, epsilon, max_iterations);
  55.  
  56. if (!isnan(root)) {
  57. printf("\n\nРезультат:\n");
  58. printf("Приближённый корень: %.8f\n", root);
  59. printf("Значение f(корень): %.8f\n", f(root));
  60. printf("Достигнутая точность: %.8f\n", fabs(b - a));
  61. }
  62.  
  63. return 0;
  64. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Решение уравнения: 2x - 3*ln(x) - 3 = 0
Интервал: [0.50, 0.60]
Точность: 1e-04

Итерация |      x      |    f(x)    
---------|-------------|------------
       1 |  0.55000000 | -0.10648900
       2 |  0.52500000 | -0.01692895
       3 |  0.51250000 |  0.03036370
       4 |  0.51875000 |  0.00649962
       5 |  0.52187500 | -0.00526845
       6 |  0.52031250 |  0.00060206
       7 |  0.52109375 | -0.00233657
       8 |  0.52070313 | -0.00086810
       9 |  0.52050781 | -0.00013323
      10 |  0.52041016 |  0.00023436


Результат:
Приближённый корень: 0.52045898
Значение f(корень): 0.00005055
Достигнутая точность: 0.10000000