Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab3

.py
Скачиваний:
4
Добавлен:
27.08.2024
Размер:
3.64 Кб
Скачать
import 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()
Соседние файлы в предмете Прикладные методы оптимизации