//Метод золотого сечения (дихтомии).
#define M_PI 3.141593
#include <stdio.h>
#include <math.h>
double funct(double);
double functMin(double, double, double, double);
int main() {
double l, r, x_min;
double eps = 1.e-15; //Максимальное значение отклонения
double phi
= (1 + sqrt(5)) / 2; //Значение золотого сечения
printf("Введите входные данные (l, r): \n"); scanf("%le %le", &l
, &r
);
x_min = functMin(l, r, eps, phi);
printf("Минимум функции: x = %e, y = %e\n", x_min
, funct
(x_min
));
return 0;
}
double functMin(double l, double r, double eps, double phi) {
double x_1, x_2, y_1, y_2;
x_1 = l + (r - l) / (phi + 1);
x_2 = r - (r - l) / (phi + 1);
y_1 = funct(x_1);
y_2 = funct(x_2);
do {
if(y_1 < y_2) {
r = x_2;
x_2 = x_1;
y_2 = y_1;
x_1 = l + (r - l) / (phi + 1);
y_1 = funct(x_1);
}
else {
l = x_1;
x_1 = x_2;
y_1 = y_2;
x_2 = r - (r - l) / (phi + 1);
y_2 = funct(x_2);
}
} while( (fabs(r
- l
) >= eps
) && (fabs(r
- l
) >= eps
* fabs(r
)) );
return l + (r - l) / 2; //Тут считается среднеарифмитическое l и r [(l + r) / 2]. Записанно
//в неявной форме для уменьшения ошибки на больших значениях
}
double funct(double x) {
double result;
result
= fabs(x
- M_PI
); // Вычисляем значение функции y = |x - π|
return result;
}
Ly/QnNC10YLQvtC0INC30L7Qu9C+0YLQvtCz0L4g0YHQtdGH0LXQvdC40Y8gKNC00LjRhdGC0L7QvNC40LgpLgoKI2RlZmluZSBNX1BJIDMuMTQxNTkzCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPG1hdGguaD4KCmRvdWJsZSBmdW5jdChkb3VibGUpOwpkb3VibGUgZnVuY3RNaW4oZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKTsKCmludCBtYWluKCkgewogICAgZG91YmxlIGwsIHIsIHhfbWluOwogICAgZG91YmxlIGVwcyA9IDEuZS0xNTsgICAgICAgICAgICAgIC8v0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0L7RgtC60LvQvtC90LXQvdC40Y8KICAgIGRvdWJsZSBwaGkgPSAoMSArIHNxcnQoNSkpIC8gMjsgICAvL9CX0L3QsNGH0LXQvdC40LUg0LfQvtC70L7RgtC+0LPQviDRgdC10YfQtdC90LjRjwogICAgCiAgICBwcmludGYoItCS0LLQtdC00LjRgtC1INCy0YXQvtC00L3Ri9C1INC00LDQvdC90YvQtSAobCwgcik6IFxuIik7CiAgICBzY2FuZigiJWxlICVsZSIsICZsLCAmcik7CiAgICAKICAgIHhfbWluID0gZnVuY3RNaW4obCwgciwgZXBzLCBwaGkpOwogICAgCiAgICBwcmludGYoItCc0LjQvdC40LzRg9C8INGE0YPQvdC60YbQuNC4OiB4ID0gJWUsIHkgPSAlZVxuIiwgeF9taW4sIGZ1bmN0KHhfbWluKSk7CiAgICAKICAgIHJldHVybiAwOwp9Cgpkb3VibGUgZnVuY3RNaW4oZG91YmxlIGwsIGRvdWJsZSByLCBkb3VibGUgZXBzLCBkb3VibGUgcGhpKSB7Cglkb3VibGUgeF8xLCB4XzIsIHlfMSwgeV8yOwoJCgl4XzEgPSBsICsgKHIgLSBsKSAvIChwaGkgKyAxKTsKICAgIHhfMiA9IHIgLSAociAtIGwpIC8gKHBoaSArIDEpOwogICAgeV8xID0gZnVuY3QoeF8xKTsKICAgIHlfMiA9IGZ1bmN0KHhfMik7CiAgICAKICAgIGRvIHsKICAgICAgICBpZih5XzEgPCB5XzIpIHsKICAgICAgICAgICAgciAgID0geF8yOwogICAgICAgICAgICB4XzIgPSB4XzE7CiAgICAgICAgICAgIHlfMiA9IHlfMTsKICAgICAgICAgICAgeF8xID0gbCArIChyIC0gbCkgLyAocGhpICsgMSk7CiAgICAgICAgICAgIHlfMSA9IGZ1bmN0KHhfMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGVsc2UgewogICAgICAgICAgICBsICAgPSB4XzE7CiAgICAgICAgICAgIHhfMSA9IHhfMjsKICAgICAgICAgICAgeV8xID0geV8yOwogICAgICAgICAgICB4XzIgPSByIC0gKHIgLSBsKSAvIChwaGkgKyAxKTsKICAgICAgICAgICAgeV8yID0gZnVuY3QoeF8yKTsKICAgICAgICB9CiAgICB9IHdoaWxlKCAoZmFicyhyIC0gbCkgPj0gZXBzKSAmJiAoZmFicyhyIC0gbCkgPj0gZXBzICogZmFicyhyKSkgKTsKICAgIAogICAgcmV0dXJuIGwgKyAociAtIGwpIC8gMjsgIC8v0KLRg9GCINGB0YfQuNGC0LDQtdGC0YHRjyDRgdGA0LXQtNC90LXQsNGA0LjRhNC80LjRgtC40YfQtdGB0LrQvtC1IGwg0LggciBbKGwgKyByKSAvIDJdLiDQl9Cw0L/QuNGB0LDQvdC90L4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL9CyINC90LXRj9Cy0L3QvtC5INGE0L7RgNC80LUg0LTQu9GPINGD0LzQtdC90YzRiNC10L3QuNGPINC+0YjQuNCx0LrQuCDQvdCwINCx0L7Qu9GM0YjQuNGFINC30L3QsNGH0LXQvdC40Y/RhQp9CgoKZG91YmxlIGZ1bmN0KGRvdWJsZSB4KSB7CiAgICBkb3VibGUgcmVzdWx0OwogICAgCiAgICByZXN1bHQgPSBmYWJzKHggLSBNX1BJKTsgLy8g0JLRi9GH0LjRgdC70Y/QtdC8INC30L3QsNGH0LXQvdC40LUg0YTRg9C90LrRhtC40LggeSA9IHx4IC0gz4B8CiAgICAKICAgIHJldHVybiByZXN1bHQ7Cn0K