def evaluate(self, initial_value, increment, iterations, function):

        function = Function(function)
        x = initial_value
        fx = function.evaluate(initial_value)
        self.values.append([0, str(initial_value), str(fx)])
        if fx == 0:
            return str(initial_value) + " es una raiz."
        elif increment == 0:
            return "El valor asignado al incremento es incorrecto"
        elif iterations < 1:
            return "El valor del iterador es incorrecto"
        else:
            x1 = initial_value + increment
            contador = 1
            fx1 = function.evaluate(x1)
            self.values.append([contador, str(x1), str(fx1)])
            while fx * fx1 > 0 and contador < iterations:
                x = x1
                fx = fx1
                x1 = x + increment
                fx1 = function.evaluate(x1)
                contador += 1
                self.values.append([contador, str(x1), str(fx1)])

            if fx1 == 0:
                return str(x1) + " es una Raiz."
            elif fx * fx1 < 0:
                return "Los valores "+ str(x) + " y " + str(x1) +" definen un intervalo"
            else:
                return "No se encontro un intervalo que contenga al menos una raiz."
Пример #2
0
def graph_c(funcion, initial_value, last_value):
    function = Fun(funcion)

    win = Gtk.Window()
    win.connect("destroy", lambda x: Gtk.main_quit())
    win.set_default_size(640, 480)
    win.set_title("Embedding in GTK")

    vbox = Gtk.VBox()
    win.add(vbox)

    fig = Figure(figsize=(5, 4), dpi=100)
    ax = fig.add_subplot(111)
    x = np.arange(initial_value, last_value)
    y = [function.evaluate2(i) for i in x]
    ax.plot(x, y)
    dev = Fun(derivate_function(funcion))
    derivada = [dev.evaluate2(i) for i in x]
    ax.plot(x, derivada)

    canvas = FigureCanvas(fig)  # a Gtk.DrawingArea
    vbox.pack_start(canvas, True, True, 0)
    toolbar = NavigationToolbar(canvas, win)
    vbox.pack_start(toolbar, False, False, 0)

    win.show_all()
    Gtk.main()
    def evaluate(self, tol, x0, x1, fun, niter, type_error=1):

        fun = Function(fun)

        fx0 = fun.evaluate(x0)

        if fx0 == 0:
            return f"{x0} es raiz"
        elif niter < 1:
            return "El valor del iterador es incorrecto"
        else:
            fx1 = fun.evaluate(x1)
            cont = 0
            self.values.append([-1, str(x0), str("{:.2e}".format(fx0)), None])
            self.values.append(
                [cont, str(x1), str("{:.2e}".format(fx1)), None])
            error = tol + 1
            den = fx1 - fx0

            while error > tol and fx1 != 0 and den != 0 and cont < niter:
                x2 = x1 - (fx1 * (x1 - x0) / den)

                if type_error == 0:
                    error = abs(x2 - x1)
                else:
                    error = abs((x2 - x1) / x2)

                x0 = x1
                fx0 = fx1
                x1 = x2
                fx1 = fun.evaluate(x2)
                den = fx1 - fx0

                cont = cont + 1
                self.values.append([
                    cont,
                    str(x2),
                    str("{:.2e}".format(fx1)),
                    str("{:.2e}".format(error))
                ])

            if fx1 == 0:
                return f"{x1} es raíz"
            elif error < tol:
                return f"{x1} es una aprox. a una raíz con una tolerancia = {tol}"
            elif den == 0:
                return f"Hay una posible raíz multiple"
            else:
                return f"Fracasó en {niter} iteraciones"
Пример #4
0
    def evaluate(self, tol, xi, niter, fun, dfun, type_error=1):

        fun = Function(fun)
        dfun = Function(dfun)

        fx = fun.evaluate2(xi)
        dfx = dfun.evaluate2(xi)

        if fx == 0:
            return str(fx) + " es una raiz."
        elif dfun == 0:
            return "La derivada no puede ser 0"
        elif niter < 1:
            return "El valor del iterador es incorrecto"
        else:
            contador = 0
            error = tol + 1

            self.values.append(
                [contador,
                 str(xi),
                 str("{:.2e}".format(fx)),
                 str(dfx), None])

            while error > tol and fx != 0 and dfx != 0 and contador < niter:
                xn = xi - (fx / dfx)
                fx = fun.evaluate2(xn)
                dfx = dfun.evaluate2(xn)

                if type_error == 0:
                    error = abs(xn - xi)
                else:
                    error = abs((xn - xi) / xn)

                xi = xn

                contador = contador + 1
                self.values.append([
                    contador,
                    str(xn),
                    str("{:.2e}".format(fx)),
                    str(dfx),
                    str("{:.2e}".format(error))
                ])

            if fx == 0:
                return f"{xi} es raiz"
            elif error < tol:
                return f"{xn} es una aprox. a una raiz con una tolerancia = {tol}"
            elif dfx == 0:
                return f"{xn} es una posible raiz multiple"
            else:
                return f"El método fracasó en {niter} iteraciones"
Пример #5
0
    def evaluate(self,
                 xi,
                 tolerancia,
                 iter,
                 function,
                 g_function,
                 type_error=1):

        fun = Function(function)
        gx = Function(g_function)

        fx = fun.evaluate2(xi)

        if fx == 0:
            return f"{xi} es raiz"
        if iter < 1:
            return "El valor del iterador es incorrecto"
        if tolerancia < 0:
            return "Error en la tolerancia, debe ser mayor o igual a 0"

        self.values.append([0, str(xi), str("{:.2e}".format(fx)), None])
        contador = 0
        error = tolerancia + 0.1
        while fx != 0 and error > tolerancia and contador < iter:
            xn = gx.evaluate2(xi)
            fi = fun.evaluate2(xn)

            if type_error == 0:
                error = abs(xn - xi)
            else:
                error = abs((xn - xi) / xn)

            xi = xn

            contador = contador + 1
            self.values.append([
                contador,
                str(xn),
                str("{:.2e}".format(fi)),
                str("{:.2e}".format(error))
            ])

        if fx == 0:
            return f"{xi} es raiz"
        elif error < tolerancia:
            return f"{xi} es una aprox. con una tolerancia = {tolerancia}"
        else:
            return f"El método fracasó en {iter} iteraciones"
Пример #6
0
    def evaluate(self, xi, xs, tolerancia, iter, function, type_error=1):

        funcion = Function(function)

        fxi = funcion.evaluate(xi)
        fxs = funcion.evaluate(xs)

        if iter < 1:
            return "El valor del iterador es incorrecto"
        if tolerancia < 0:
            return "Error en la tolerancia, debe ser mayor o igual a 0"

        if fxi == 0:
            return f"{xi} es una raiz"
        elif fxs == 0:
            return f"{xs} es una raiz"
        elif fxi * fxs < 0:
            xm = xi - ((fxi * (xi - xs)) / (fxi - fxs))
            fxm = funcion.evaluate(xm)
            contador = 1
            error = tolerancia + 1

            self.values.append([
                contador,
                str(xi),
                str(xs),
                str(xm),
                str("{:.2e}".format(fxm)), None
            ])

            while error > tolerancia and fxm != 0 and contador < iter:
                if fxm * fxi < 0:
                    xs = xm
                    fxs = fxm
                else:
                    xi = xm
                    fxi = fxm
                xaux = xm
                xm = xi - ((fxi * (xi - xs)) / (fxi - fxs))
                fxm = funcion.evaluate(xm)

                if type_error == 0:
                    error = abs(xm - xaux)
                else:
                    error = abs((xm - xaux) / xm)

                contador += 1
                self.values.append([
                    contador,
                    str(xi),
                    str(xs),
                    str(xm),
                    str("{:.2e}".format(fxm)),
                    str("{:.2e}".format(error))
                ])

            if fxm == 0:
                return f"{xm} es raiz"
            elif (error < tolerancia):
                return f"{xm} es una aprox. a una raiz con tolerancia = {tolerancia}"
            else:
                return f"fracaso en {iter} iteraciones"
        else:
            return "el intervalo es inadecuado"
    def evaluate(self, tol, xi, iter, function, d1, dd2, type_error=1):

        fun = Function(function)
        der1 = Function(d1)
        der2 = Function(dd2)

        fx = fun.evaluate2(xi)
        dfx = der1.evaluate2(xi)
        ddfx = der2.evaluate2(xi)

        if fx == 0:
            return str(fx) + " es una raiz."
        elif iter < 1:
            return "El valor del iterador es incorrecto"
        else:

            contador = 0
            self.values.append([
                contador,
                str(xi),
                str("{:.2e}".format(fx)),
                str("{:.2e}".format(dfx)),
                str(ddfx), None
            ])
            error = tol + 1

            while error > tol and fx != 0 and ddfx != 0 and contador < iter:
                x = xi
                xi = x - (fx * dfx) / ((dfx**2) - fx * ddfx)
                fx = fun.evaluate2(xi)
                dfx = der1.evaluate2(xi)
                ddfx = der2.evaluate2(xi)

                if type_error == 0:
                    error = abs(xi - x)
                else:
                    error = abs((xi - x) / xi)

                contador += 1
                self.values.append([
                    contador,
                    str(xi),
                    str("{:.2e}".format(fx)),
                    str("{:.2e}".format(dfx)),
                    str(ddfx),
                    str("{:.2e}".format(error))
                ])

            if fx == 0:
                return f"{xi} es raiz"
            elif error < tol:
                return f"{xi} es una aprox. a una raiz con una tolerancia = {tol}"
            else:
                return f"El método fracasó en {iter} iteraciones"