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")
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)