fork(5) 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. }
  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. }
  50. } while( (fabs(r - l) >= eps) && (fabs(r - l) >= eps * fabs(r)) );
  51.  
  52. return l + (r - l) / 2; //Тут считается среднеарифмитическое l и r [(l + r) / 2]. Записанно
  53. //в неявной форме для уменьшения ошибки на больших значениях
  54. }
  55.  
  56.  
  57. double funct(double x) {
  58. double result;
  59.  
  60. result = fabs(x - M_PI); // Вычисляем значение функции y = |x - π|
  61.  
  62. return result;
  63. }
  64.  
Success #stdin #stdout 0s 2164KB
stdin
-1.e30 1.e30
stdout
Введите входные данные (l, r): 
Минимум функции: x = -1.522716e+05, y = 1.522748e+05