Скачиваний:
9
Добавлен:
16.04.2021
Размер:
2.34 Кб
Скачать
import numpy as np
from matplotlib import pyplot as plt

writer = lambda a, b, steps: {'a':a,'b':b,'steps':steps}
f = lambda x0: np.cos(np.pi+x0)

eps = 2**(-15)
a = -np.pi/2
b = np.pi/4
eps0 = [[],[],[],[]]
res = []

#1Алгоритм равномерного поиска
n = 50
steps = 0
a1, b1 = a, b
while (abs(b1-a1) > eps):
    x = np.arange(a1, b1, (b1-a1)/n)
    vals = [f(i) for i in x[0:-1]]
    ch = vals.index(min(vals))
    a1, b1 = x[ch-1], x[ch+1]
    steps += 1
    eps0[0].append(b1-a1)
res.append(writer(a1, b1, steps))

#2 Алгоритм дихтомии(алгоритм деления пополам)
steps = 0
a1, b1 = a, b
while (abs(b1-a1) > eps):
    n = (a1+b1)/2
    x = [(a1+n)/2, (b1+n)/ 2]
    vals = [f(i) for i in x]
    if vals[0] < vals[1]:
        b1 = n
    else:
        a1 = n
    steps += 1
    eps0[1].append(b1-a1)
res.append(writer(a1, b1, steps))

#3 Метод золотого сечения
steps = 0
a1, b1 = a, b
while (abs(b1-a1) > eps):
    x = [b1-(b1-a1)*0.618, a1+(b1-a1)*0.618]
    vals = [f(i) for i in x]
    if vals[0] < vals[1]:
        b1 = x[1]
    else:
        a1 = x[0]
    steps += 1
    eps0[2].append(b1-a1)
res.append(writer(a1, b1, steps))

#4 Метод Фибоначчи
steps = 1
a1, b1 = a, b
fib = [1, 1]
while ((b1 - a1) / fib[-1] > eps):
    fib.append(fib[-2] + fib[-1])
while (abs(b1-a1) > eps):
    x = [a1 + (b1 - a1) * (fib[len(fib) - 1 - steps] / fib[len(fib) - steps]), 
         a1 + (b1 - a1) * (fib[len(fib) - 1 -  steps] / fib[len(fib) - steps])]
    if x[0] == x[1]: 
        x[1] = x[0] + (b1 - a1)/10
    vals = [f(i) for i in x]
    if vals[1] < vals[0]:
        a1 = x[0]
    else:
        b1 = x[1]
    steps += 1
    eps0[3].append(b1-a1)
res.append(writer(a1, b1, steps-1))

lbls = ['Алгоритм равномерного поиска', 'Метод дихтомии', 'Метод золотого сечения',
        'Метод Фибоначчи']
[print(lbls[i],'\n',res[i]) for i in range(len(res))]
plt.plot(eps0[0],range(res[0]['steps']), label = lbls[0])
plt.plot(eps0[1],range(res[1]['steps']), label = lbls[1])
plt.plot(eps0[2],range(res[2]['steps']), label = lbls[2])
plt.plot(eps0[3],range(res[3]['steps']), label = lbls[3])
plt.legend()
Соседние файлы в предмете Прикладные методы оптимизации