Результат работы
В ходе выполнения поставленной задачи были получены следующие результаты:
Количество
итераций,
N
Уровень
точности
Рисунок 1. График Золотое сечение и Фибоначчи
На рис. 1 синим цветом отмечен алгоритм Золотого сечения, оранжевым – Фибоначчи. Согласно информации с графика, первый алгоритм медленнее алгоритма Фибоначчи. Также стоит отметить, что алгоритм Золотого сечения сильнее замедляется с увеличением необходимой точности. В связи с этим можно сказать, что метод Фибоначчи в среднестатистической ситуации предпочтительнее метода Золотого сечения благодаря своей более низкой сложности.
Приложение
function optimize_parabola
iterations = 10000;
golden_x = zeros(1, iterations);
golden_f = zeros(1, iterations);
golden_n = zeros(1, iterations);
fibo_x = zeros(1, iterations);
fibo_f = zeros(1, iterations);
fibo_n = zeros(1, iterations);
for i = 1:iterations
[golden_x(i), golden_f(i), golden_n(i)] = golddiv();
[fibo_x(i), fibo_f(i), fibo_n(i)] = fibonaccimethod();
end
fprintf('--- Результаты после %d запусков ---\n\n', iterations);
fprintf('Метод золотого сечения:\n');
fprintf('Среднее значение x: %e\n', mean(golden_x));
fprintf('Среднее значение f(x): %e\n', mean(golden_f));
fprintf('Среднее количество итераций: %.2f\n\n', mean(golden_n));
fprintf('Метод Фибоначчи:\n');
fprintf('Среднее значение x: %e\n', mean(fibo_x));
fprintf('Среднее значение f(x): %e\n', mean(fibo_f));
fprintf('Среднее количество итераций: %.2f\n', mean(fibo_n));
end
function [xmin, fmin, n] = golddiv()
eps = 0.001;
a = 0;
b = 1;
n = 0;
phi = (1 + sqrt(5)) / 2;
while (b - a) > eps
y = b - (b - a) / phi;
z = a + (b - a) / phi;
if fun(y) >= fun(z)
a = y;
else
b = z;
end
n = n + 1;
end
xmin = (a + b) / 2;
fmin = fun(xmin);
end
function [xmin, fmin, n] = fibonaccimethod()
eps = 0.001;
a = 0;
b = 1;
Fn = (b - a) / eps;
N = 1;
while (fibonacci(N) < Fn)
N = N + 1;
end
for k = 1:N - 3
y(k) = a + (b - a) * (fibonacci(N - k - 2) / fibonacci(N - k));
z(k) = b - (b - a) * (fibonacci(N - k - 2) / fibonacci(N - k));
if fun(y(k)) < fun(z(k))
b = z(k);
else
a = y(k);
end
end
xmin = (a + b) / 2;
fmin = fun(xmin);
n = N - 3;
end
function t = fibonacci(x)
n(1) = 1;
n(2) = 1;
for i = 3:x
n(i) = n(i-2) + n(i-1);
end
t = n(x);
end
function y = fun(x)
y = (x - 0.5)^2;
end
Санкт-Петербург
2025
