fork download
  1. //Метод золотого сечения (дихтомии).
  2.  
  3. #define M_PI 3.141593
  4.  
  5. #include <stdio.h>
  6. #include <math.h>
  7.  
  8. double funct(double);
  9. double functMin(double, double, double, double);
  10.  
  11. int main() {
  12. double l, r, x_min;
  13. double eps = 1.e-15; //Максимальное значение отклонения
  14. double phi = (1 + sqrt(5)) / 2; //Значение золотого сечения
  15.  
  16. printf("Введите входные данные (l, r): \n");
  17. scanf("%le %le", &l, &r);
  18.  
  19. x_min = functMin(l, r, eps, phi);
  20.  
  21. printf("Минимум функции: x = %e, y = %e\n", x_min, funct(x_min));
  22.  
  23. return 0;
  24. }
  25.  
  26. double functMin(double l, double r, double eps, double phi) {
  27. double x_1, x_2, y_1, y_2;
  28.  
  29. x_1 = l + (r - l) / (phi + 1);
  30. x_2 = r - (r - l) / (phi + 1);
  31. y_1 = funct(x_1);
  32. y_2 = funct(x_2);
  33.  
  34. do {
  35. if(y_1 < y_2) {
  36. r = x_2;
  37. x_2 = x_1;
  38. y_2 = y_1;
  39. x_1 = l + (r - l) / (phi + 1);
  40. y_1 = funct(x_1);
  41. x_2 = r - (r - l) / (phi + 1);
  42. }
  43. else {
  44. l = x_1;
  45. x_1 = x_2;
  46. y_1 = y_2;
  47. x_2 = r - (r - l) / (phi + 1);
  48. y_2 = funct(x_2);
  49. x_1 = l + (r - l) / (phi + 1);
  50. }
  51.  
  52. } while( (fabs(r - l) > eps) );
  53.  
  54. return l + (r - l) / 2; //Тут считается среднеарифмитическое l и r [(l + r) / 2]. Записанно
  55. //в неявной форме для уменьшения ошибки на больших значениях
  56. }
  57.  
  58.  
  59. double funct(double x) {
  60. double result;
  61.  
  62. result = fabs(x - M_PI); // Вычисляем значение функции y = |x - π|
  63.  
  64. return result;
  65. }
  66.  
Success #stdin #stdout 0s 2164KB
stdin
-1.e190 1.e290
stdout
Введите входные данные (l, r): 
Минимум функции: x = 3.141593e+00, y = 7.461479e-16