
Добавил:
toykion
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:lab3
.pyimport numpy as np
from matplotlib import pyplot as plt
eps = 2**(-18)
a = np.pi
b = np.pi*2
def f(x):
return np.sin(np.pi/6+x)
def f_list(x):
result = []
for i in x:
result.append(f(i))
return result
def uniform_search(start, end, number_of_intervals):
N = 0
result = []
while (abs(end-start) > eps):
x = np.arange(start, end, (end-start)/number_of_intervals)
values = f_list(x)
# Ищем интервал, где f(x) min
min_index = values.index(min(values))
start, end = x[min_index-1], x[min_index+1]
N += 1
result.append(end-start)
return (start, end, result, N)
def dichotomy_search(start, end):
N = 0
result = []
while (abs(end-start) > eps):
n = (start+end)/2
x = [(start+n)/2, (end+n)/ 2]
values = f_list(x)
(end, start) = (n, start) if values[0] < values[1] else (end, n)
N += 1
result.append(end-start)
return (start, end, result, N)
def golden_ratio(start, end):
N = 0
result = []
while (abs(end-start) > eps):
x = [end-(end-start)*0.618, start+(end-start)*0.618]
values = f_list(x)
if values[0] < values[1]:
end = x[1]
else:
start = x[0]
N += 1
result.append(end-start)
return (start, end, result, N)
def fibonachi(start, end):
N = 1
result = []
fib = [1, 1]
while ((end - start) / fib[-1] > eps):
fib.append(fib[-2] + fib[-1])
while (abs(end-start) > eps):
x = [start + (end - start) * (fib[len(fib) - 1 - N] / fib[len(fib) - N]),
start + (end - start) * (fib[len(fib) - 1 - N] / fib[len(fib) - N])]
# Если x одинаковы, то добавить небольшую разницу
if x[0] == x[1]:
x[1] += (end - start)/10
values = f_list(x)
if values[1] < values[0]:
start = x[0]
else:
end = x[1]
N += 1
result.append(end-start)
return (start, end, result, N-1)
def main():
start, end, result, N = uniform_search(a, b, 5)
print('Метод равномерного поиска\n Экстремум на промежутке: ',
[start, end], 'c погрешностью', result[-1], '\n Кол-во итераций:', N)
plt.plot(result, range(N), label = 'Метод равномерного поиска')
start, end, result, N = dichotomy_search(a, b)
print('Метод дихотомии\n Экстремум на промежутке: ',
[start, end], 'c погрешностью', result[-1], '\n Кол-во итераций:', N)
plt.plot(result, range(N), label = 'Метод дихотомии')
start, end, result, N = golden_ratio(a, b)
print('Метод золотого сечения\n Экстремум на промежутке: ',
[start, end], 'c погрешностью', result[-1], '\n Кол-во итераций:', N)
plt.plot(result, range(N), label = 'Метод золотого сечения')
start, end, result, N = fibonachi(a, b)
print('Метод Фибоначчи\n Экстремум на промежутке: ',
[start, end], 'c погрешностью', result[-1], '\n Кол-во итераций:', N)
plt.plot(result, range(N), label = 'Метод Фибоначчи')
plt.legend()
plt.show()
if __name__ == "__main__":
main()
Соседние файлы в предмете Прикладные методы оптимизации