def algorithm(point, lmbda):
    fhelper.func = "x**2" # raw_input("Enter function: ")

    x_range = np.arange(-50, 50)
    fig = plt.figure()
    ax = fig.add_subplot(111)

    plt_func, = ax.plot(x_range, [fhelper.f(value) for value in x_range], label=fhelper.func)
    plt.legend(handles=[plt_func])

    # Algorithm
    df_result = fhelper.df(point)
    while abs(df_result) > abs(lmbda * 0.1):
        df_result = fhelper.df(point)
        point -= lmbda * df_result

    print("Extremalstelle bei x = %f" % point)

    # Plot approximation
    point1 = -40
    x_range_tan = np.arange(point1 - 20, point1 + 20)
    ax.plot(x_range_tan, fhelper.tan(x_range_tan, point1))

    point2 = -20
    x_range_tan = np.arange(point2 - 20, point2 + 20)
    ax.plot(x_range_tan, fhelper.tan(x_range_tan, point2))

    x_range_tan = np.arange(point - 20, point + 20)
    ax.plot(x_range_tan, fhelper.tan(x_range_tan, point))

    plt.grid(True)
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    plt.savefig("doc/gradient.png")
Пример #2
0
def bisect(a, b):
    c = (a + b) / 2
    ax.plot((c, c), (0, fhelper.f(c) + 30), 'r-')
    if abs(fhelper.df(c)) < 0.001:
        return c
    elif fhelper.df(c) < 0:
        return bisect(c, b)
    else:
        return bisect(a, c)