Ниже приведён готовый пример кода на Python, который решает задачу “Найти приближённое значение минимума функции
f(x) = 2·x² + 8·x + 4 + 22·|x – 3|
на отрезке [–3; 4] с использованием N = 24 итераций двумя методами: а) методом Фибоначчи, б) методом пассивного (равномерного) поиска. Код также выводит теоретическую точность (размер неопределённости, то есть длину конечного интервала или расстояние между соседними точками) и фактическую точность (абсолютную погрешность, то есть разность между...
Решение задачи нахождения минимума функции:
f(x) = 2x + 8x + 4 + 22|x–3|
на отрезке [a,b] = [–3, 4] с количеством итераций N = 24.
Реализованы 2 метода:
а) метод Фибоначчи
б) метод пассивного поиска (равномерный перебор)
Выводятся теоретическая точность (по неопределённому интервалу) и
фактическая точность (абсолютная ошибка относительно истинного минимума x = 3).
def f(x):
Заданная функция.
return 2 * x**2 + 8 abs(x - 3)
xrue = 3
ftrue) # должно получиться 46
def fibonacciumbers(n):
Функция генерирует список Fibonacci чисел от F[0] = 1, F[1] = 1, ...
Всего n чисел.
fib = [1, 1]
while len(fib) n:
fib.append(fib[-1] + fib[-2])
return fib
def fibonacciearch(a, b, N, f):
Функция поиска минимума методом Фибоначчи с количеством итераций N.
Аргументы:
a, b - границы отрезка;
N - число итераций (для определения точности);
f - функция, минимум которой ищется.
Возвращает:
xin: найденная точка минимума (среднее финального отрезка)
intervalength: длина окончательного отрезка неопределённости (теоретическая точность).
Для алгоритма потребуется N+1 число Фибоначчи.
fib = fibonacciumbers(N + 1)
L = b - a
Первый шаг: вычисление двух внутренних точек
x1 = a + (F[N-2]/F[N])(b – a)
x1 = a + (fib[N - 2] / fib[N]) * L
x2 = a + (fib[N - 1] / fib[N]) * L
f1 = f(x1)
f2 = f(x2)
Выполняем итерационный процесс:
for k in range(1, N - 1):
Сравниваем значения функции в сгенерированных точках
if f1 f2:
Оптимум находится в правой части
a = x1 # левая граница сдвигается
x1 = x2 # старая x2 становится новой x1
f1 = f2
Вычисляем новую точку x2 на основании оставшегося числа Фибоначчи
L = b - a
x2 = a + (fib[N - k - 1] / fib[N - k]) * L
f2 = f(x2)
else:
Оптимум находится в левой части
b = x2
x2 = x1 # x1 переносим в x2
f2 = f1
L = b - a
x1 = a + (fib[N - k - 2] / fib[N - k]) * L
f1 = f(x1)
После завершения итераций окончательный интервал:
finalnterval = b - a
В качестве приближённого минимума берём центр оставшегося отрезка:
xin = (a + b) / 2
return xinterval
def passiveearch(a, b, N, f):
Метод пассивного (равномерного) поиска: Рассматриваем N равномерно распределённых точек на отрезке.
Аргументы:
a, b - границы отрезка.
N - количество точек (итераций).
f - функция.
Возвращает:
xin: найденная точка минимума;
delta: расстояние между соседними точками (теоретическая точность метода).
Формируем N равномерно распределённых точек, включая концы.
points = [a + i*(b - a)/(N - 1) for i in range(N)]
falues = [f(x) for x in points]
Индекс минимального значения:
minvalues.index(min(falues))
xindex]
delta = (b - a) / (N - 1) # шаг между точками
return xin, delta
if == :
a, b = -3, 4 # Границы отрезка
N = 24 # Число итераций/точек
print(Аналитически найденный минимум:)
print(x = {:.6f}, f(x) = {:.6f}.format(xtrue))
print(--------------------------------------------------)
Метод Фибоначчи
xfib, intervalsearch(a, b, N, f)
ffib = f(xfib)
Фактическая точность – отклонение найденного x от истинного минимума x = 3
errormintrue)
print(Метод Фибоначчи:)
print(Приближённое значение минимума: x = {:.6f}, f(x) = {:.6f}.format(xfib, ffib))
print(Теоретическая точность (длина финального интервала): {:.6f}.format(intervalength))
print(Фактическая точность (|x - 3|): {:.6f}.format(errorib))
print(--------------------------------------------------)
Метод пассивного поиска (равномерного перебора)
xpass, delta = passiveearch(a, b, N, f)
fpass = f(xpass)
errormintrue)
print(Метод пассивного поиска:)
print(Приближённое значение минимума: x = {:.6f}, f(x) = {:.6f}.format(xpass, fpass))
print(Теоретическая точность (шаг между точками): {:.6f}.format(delta))
print(Фактическая точность (|x - 3|): {:.6f}.format(errorass))
Пояснение по коду:
- Функция f(x) реализует заданное выражение.
- Функция fibonacciumbers(n) генерирует последовательность чисел Фибоначчи, которая используется в алгоритме.
- В функции fibonacciearch() используется стандартный алгоритм поиска минимума методом Фибоначчи. В каждом шаге отрезок [a,b] сокращается, а точки рассчитываются с использованием отношений соответствующих чисел Фибоначчи. Теоретическая точность здесь определяется как длина окончательного интервала неопределённости.
- Метод passiveearch() строит N равномерно распределённых точек в отрезке [a,b] и выбирает ту, где функция принимает минимальное значение. Теоретическая точность – расстояние между соседними точками.
- В основной части программы выводятся аналитическое решение, а также результаты обоих методов с расчётом теоретической и фактической точности.
Сохраните этот код в файл (например, minearch.py) и запустите его.