<jupyter_start><jupyter_text>Задание 1 Реализовать функцию, осуществляющую поиск экстремума функции одной переменной методом дихотомии. Представить наглядную визуализацию данного метода, где варьируемым параметром выступает номер итерации.<jupyter_code>def dich_search(f, a, b, e, ex_type, i = 0): #ex_type = {1 (to find max), -1 (to find min)}
    points = [(0,) for _ in range(10**2)]
    
    while abs(b - a) >  e:
        x = (a + b)/2
        x1 = (x - e)
        x2 = (x + e)
        if ex_type * f(x2) < ex_type * f(x1):
            b = x
        else:
            a = x
        points[i] = [(a+b)/2, f((a+b)/2)]
        i += 1
        
    return ((a + b)/2, f((a + b)/2)), points[:i]
        
# find min
def f(x):
    return x**2 - 1
dich_search(f, -10, 10, 0.1, -1)
# find_max
def g(x):
    return -x**4 + 1
lst = dich_search(g, -20, 10, 0.1, 1)
dich_search(g, -20, 10, 0.1, 1)<jupyter_output><empty_output><jupyter_text>Визуализация 1<jupyter_code>def f(x):
    return 100*x**2 + 5*x +10

def my_plt(x, y, points, i, color , style , width): 
    fig = plt.figure()
    axes = fig.add_subplot(111)
    axes.plot(x, y, color=color, linestyle=style, linewidth=width)
    axes.grid()
    
    for j in range(0, i): 
        plt.scatter(points[j][0], points[j][1], s=100, color="red")
    plt.show()
    
def draw_f(i, **kwargs):
    x = np.linspace(-75, 75, 20)
    y = 100 * (x**2) + 5 * x + 10 
    points = dich_search(f, -130, 130, 0.01, -1)[1]
    my_plt(x, y, points, i, **kwargs)
    
interact(draw_f, 
        i= (0,10),
        color = ["blue", "green"],
        style=["solid", "dashed"],
        width=(1,5))<jupyter_output><empty_output><jupyter_text>Задание 2 Реализовать функцию, осуществляющую поиск экстремума функции одной переменной методом золотого сечения. Представить визуализацию данного метода.<jupyter_code>def golden_search(f, a, b, e, i=0):
    points = [(0,) for _ in range(10**2)]
    k = (1 + 5**(0.5))/2
    
    while abs((b - a)/2) >= e:
        x1 = b - ((b - a)/k)
        x2 = a + ((b - a)/k)
        if f(x1) > f(x2):
            a = x1
        else:
            b = x2
        points[i] = [(a+b)/2, f((a+b)/2)]
        i += 1
    return (((a+b)/2, f((a+b)/2)), points[:i])
    
def g(x):
    return x**2 - 5*x - 1
golden_search(g, -10, 10, 0.1)<jupyter_output><empty_output><jupyter_text>Визуализация 2<jupyter_code>def f(x):
    return 100*x**2 + 5*x +10

def my_plt(x, y, points, i, color , style , width): 
    fig = plt.figure()
    axes = fig.add_subplot(111)
    axes.plot(x, y, color=color, linestyle=style, linewidth=width)
    axes.grid()
    
    for j in range(0, i): 
        plt.scatter(points[j][0], points[j][1], s=100, color="red")
    plt.show()
    
def draw_f(i, **kwargs):
    x = np.linspace(-75, 75, 20)
    y = 100 * (x**2) + 5 * x + 10 
    points = golden_search(f, -130, 130, 0.01)[1]
    my_plt(x, y, points, i, **kwargs)
    
interact(draw_f, 
        i= (0,10),
        color = ["blue", "green"],
        style=["solid", "dashed"],
        width=(1,5))<jupyter_output><empty_output><jupyter_text>Задание 3 Реализовать функцию, осуществляющую поиск экстремума функции одной переменной методом чисел Фибоначчи. Представить визуализацию данного метода.<jupyter_code>fib = lambda n: fib(n - 1) + fib(n - 2) if n > 2 else 1

def fib_search(f, a, b, e, n=10, i=0):
    points = [(0,) for _ in range(10**2)]
    x1, x2 = a + (b - a) * fib(n - 2)/fib(n), a + (b - a) * fib(n - 1)/fib(n)
    while n!= 0:
        if f(x1) > f(x2):
            a = x1
            x1 = x2
            x2 = b - (x1 - a)
        else:
            b = x2
            x2 = x1
            x1 = a + (b - x2)
        n -= 1
        points[i] = [(x1+x2)/2, f((x1+x2)/2)]
        i += 1
    return (((x1 + x2)/2, f((x1 + x2)/2)), points[:i])
def g(x):
    return x**2 - 5*x - 1
fib_search(g, -10, 10, 0.1)<jupyter_output><empty_output><jupyter_text>Визуализация 3<jupyter_code>def f(x):
    return 100*x**2 + 5*x +10

def my_plt(x, y, points, i, color , style , width): 
    fig = plt.figure()
    axes = fig.add_subplot(111)
    axes.plot(x, y, color=color, linestyle=style, linewidth=width)
    axes.grid()
    
    for j in range(0, i): 
        plt.scatter(points[j][0], points[j][1], s=100, color="red")
    plt.show()
    
def draw_f(i, **kwargs):
    x = np.linspace(-75, 75, 20)
    y = 100 * (x**2) + 5 * x + 10 
    points = fib_search(f, -130, 130, 0.01)[1]
    my_plt(x, y, points, i, **kwargs)
    
interact(draw_f, 
        i= (0,10),
        color = ["blue", "green"],
        style=["solid", "dashed"],
        width=(1,5))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.18345636126791143, 'fraction_numerical': 0.05709943551888841, 'mean_word_length': 2.410066617320503, 'pattern_counts': {'":': 0, '<': 26, '<?xml version=': 0, '>': 30, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '270485', 'license': 'MIT', 'n_tokens_mistral': 2148, 'n_tokens_neox': 2031, 'n_words': 471, 'path': '1. Mathematics-and-Python-for-data-analysis/Function Optimization/function_optimization2.ipynb', 'repo_name': 'anafisa/ML_specialization', 'size': '4606'}