Function f(x: real): real; begin f := exp(3 * ln(ln(exp(1.7 * ln(abs(x - 12))) + 5.1))) / exp(3 * ln(ln(2))); end;
var a, b, eps, r, delta, lp, rp, sgn: real;
begin r := (sqrt(5) + 1) / 2; {Пропорция золотого сечения} writeln('Пропорция золотого сечения=', r:0:6); writeln('Задайте границы интервала и точность решения'); readln(a, b, eps); delta := eps / 2; rp := a + (b - a) / r; lp := b - (b - a) / r; if f(a) > (f(a + delta)) then sgn := 1 else sgn := -1; while abs(b - a) > eps do begin rp := a + (b - a) / r; lp := b - (b - a) / r; if (sgn * f(lp)) < (sgn * f(rp)) then b := rp else a := lp end; if sgn = -1 then writeln('Максимум достигнут при х=', lp:0:6, ', значение функции равно ', f(lp):0:6) else writeln('Минимум достигнут при х=', rp:0:6, ', значение функции равно ', f(rp):0:6) end.
Тестовое решение:
Пропорция золотого сечения=1.618034 Задайте границы интервала и точность решения 11 15 0.00001 Минимум достигнут при х=11.999996, значение функции равно 12.986115
begin
f := exp(3 * ln(ln(exp(1.7 * ln(abs(x - 12))) + 5.1))) / exp(3 * ln(ln(2)));
end;
var
a, b, eps, r, delta, lp, rp, sgn: real;
begin
r := (sqrt(5) + 1) / 2; {Пропорция золотого сечения}
writeln('Пропорция золотого сечения=', r:0:6);
writeln('Задайте границы интервала и точность решения');
readln(a, b, eps);
delta := eps / 2;
rp := a + (b - a) / r;
lp := b - (b - a) / r;
if f(a) > (f(a + delta)) then sgn := 1 else sgn := -1;
while abs(b - a) > eps do
begin
rp := a + (b - a) / r;
lp := b - (b - a) / r;
if (sgn * f(lp)) < (sgn * f(rp)) then b := rp else a := lp
end;
if sgn = -1 then writeln('Максимум достигнут при х=', lp:0:6,
', значение функции равно ', f(lp):0:6)
else writeln('Минимум достигнут при х=', rp:0:6,
', значение функции равно ', f(rp):0:6)
end.
Тестовое решение:
Пропорция золотого сечения=1.618034
Задайте границы интервала и точность решения
11 15 0.00001
Минимум достигнут при х=11.999996, значение функции равно 12.986115