def gradFibonacci(xx: float, eps: float, x_min: float, x_max: float, dataPlot): stop = False p = plot(dataPlot.x_left, dataPlot.x_right, dataPlot.pr) p.on(xx) i = 0 while not stop: #p.showPoint(xx) def a(lmb): return f(xx - lmb * df(xx)) x_l = xx lmd = fibonacci(a, x_min, x_max, eps) xx = xx - lmd * df(xx) i += 1 #print("itter:", i, "| x:", xx) if (abs(x_l - xx) < Decimal(eps) and math.fabs(f(x_l) - f(xx)) < Decimal(eps)): stop = True p.off(xx) return xx, i
def gradFrag(lmd: float, xx: float, eps: float, dataPlot): stop = False #p = plot(dataPlot.x_left, dataPlot.x_right, dataPlot.pr) #p.on(xx) i = 0 while not stop: #p.showPoint(xx) x_l = xx xx = x_l - lmd * df(x_l) a1 = f(xx - lmd * df(xx)) a2 = f(x_l) - lmd * abs(df(x_l)**2) #while f(xx - lmd * df(xx)) <= f(x_l) - lmd*abs(df(x_l)**2): while a1 > a2: lmd /= 2 print("IT HAPPend") break i += 1 print("itter:", i, "| x:", xx) if (abs(x_l - xx) < Decimal(eps) and math.fabs(f(x_l) - f(xx)) < Decimal(eps)): stop = True #p.off(xx) return xx, i
def on(self, xx: float): self.x_plt = np.arange(self.x_left, self.x_right, self.pr) self.f_plt = [f(x) for x in self.x_plt] plt.ion() # включение интерактивного режима отображения графиков self.fig, self.ax = plt.subplots() # Создание окна и осей для графика self.ax.grid(True) # отображение сетки на графике self.ax.plot(self.x_plt, self.f_plt) # отображение параболы self.point = self.ax.scatter( xx, f(xx), c='red') # отображение точки красным цветом return
def off(self, xx: float): # выключение интерактивного режима отображения графиков plt.ioff() self.ax.scatter(xx, f(xx), c='blue') plt.show() return
def showPoint(self, xx: float): self.point.set_offsets([xx, f(xx)]) # отображение нового положения точки # перерисовка графика и задержка на 20 мс self.fig.canvas.draw() self.fig.canvas.flush_events() time.sleep(0.05) return
def gradConst(lmd: float, xx: float, eps: float, dataPlot): stop = False i = 0 p = plot(dataPlot.x_left, dataPlot.x_right, dataPlot.pr) p.on(xx) while not stop: #p.showPoint(xx) x_l = xx xx = x_l - lmd * df(x_l) i += 1 #print("itter:", i, "| x:", xx) if (abs(x_l - xx) < Decimal(eps) and math.fabs(f(x_l) - f(xx)) < Decimal(eps)): stop = True p.off(xx) return xx, i
def newton(xx:float, x_min, x_max, eps:float, dataPlot, lmd = 0.1): stop = False p = plot(dataPlot.x_left, dataPlot.x_right, dataPlot.pr) p.on(xx) i = 0 #arg_xx = numpy.array([x_min, x_max]) while not stop: i += 1 p.showPoint(xx) x_l = xx xx = x_l - f(x_l) / df(x_l) print("itter:", i, "| x:", xx) if math.fabs(f(x_l) - f(xx)) < Decimal(eps): stop = True p.off(xx) return xx, i
def a(lmb): return f(xx - lmb * df(xx))
def ff(lmb): return f(xx + lmd * pp)