예제 #1
0
        public ResultadoRaizAbiertos Tangente(ResultadoRaizAbiertos nuevoResultado, Function f)
        {
            Argument   Xini  = new Argument(" x = " + nuevoResultado.Xini.ToString(CultureInfo.InvariantCulture));
            Argument   Xr    = new Argument(" x = 0 ");
            Expression Fxini = new Expression("f(x)", f, Xini);
            Expression Fxr   = new Expression("f(x)", f, Xr);

            if ((Math.Abs(Fxini.calculate()) < nuevoResultado.Tolerancia) && (Fxini.calculate() == 0))
            {
                nuevoResultado.valorRaiz = nuevoResultado.Xini;
            }
            else
            {
                int        c             = 0;
                double     Xant          = 0;
                bool       Bandera       = false;
                double     aux           = nuevoResultado.Xini + 0.0001;
                Argument   Xiniderivada  = new Argument(" x = " + aux.ToString(CultureInfo.InvariantCulture));
                Expression Fxiniderivada = new Expression("f(x)", f, Xiniderivada);
                double     Derivada      = (Fxiniderivada.calculate() - Fxini.calculate()) / 0.0001;
                if (Derivada != 0)
                {
                    double xr = nuevoResultado.Xini - (Fxini.calculate() / Derivada);
                    Xr  = new Argument(" x = " + xr.ToString(CultureInfo.InvariantCulture));
                    Fxr = new Expression("f(x)", f, Xr);
                    nuevoResultado.error = Math.Abs(xr - Xant) / xr;

                    while ((Math.Abs(Fxr.calculate()) > nuevoResultado.Tolerancia) && (Math.Abs(nuevoResultado.error) > nuevoResultado.Tolerancia) && (c < nuevoResultado.iteraciones))
                    {
                        nuevoResultado.error = Math.Abs(xr - Xant) / xr;
                        Xant = xr;
                        nuevoResultado.Xini = xr;
                        Xini          = new Argument(" x = " + nuevoResultado.Xini.ToString(CultureInfo.InvariantCulture));
                        Fxini         = new Expression("f(x)", f, Xini);
                        aux           = nuevoResultado.Xini + 0.0001;
                        Xiniderivada  = new Argument(" x = " + aux.ToString(CultureInfo.InvariantCulture));
                        Fxiniderivada = new Expression("f(x)", f, Xiniderivada);
                        Derivada      = (Fxiniderivada.calculate() - Fxini.calculate()) / 0.0001;
                        xr            = nuevoResultado.Xini - (Fxini.calculate() / Derivada);
                        Xr            = new Argument(" x = " + xr.ToString(CultureInfo.InvariantCulture));
                        Fxr           = new Expression("f(x)", f, Xr);
                        c++;
                    }

                    nuevoResultado.valorRaiz   = nuevoResultado.Xini;
                    nuevoResultado.error       = Math.Abs(nuevoResultado.error);
                    nuevoResultado.iteraciones = c;
                }
            }
            return(nuevoResultado);
        }
예제 #2
0
        public ResultadoRaizAbiertos Secante(ResultadoRaizAbiertos nuevoResultado, Function f)
        {
            Argument   X0  = new Argument(" x = " + nuevoResultado.x0.ToString(CultureInfo.InvariantCulture));
            Argument   X1  = new Argument(" x = " + nuevoResultado.x1.ToString(CultureInfo.InvariantCulture));
            Argument   Xr  = new Argument(" x = 0 ");
            Expression Fx0 = new Expression("f(x)", f, X0);
            Expression Fx1 = new Expression("f(x)", f, X1);
            Expression Fxr = new Expression("f(x)", f, Xr);
            int        c   = 0;

            if ((Fx0.calculate() * Fx1.calculate()) == 0)
            {
                nuevoResultado.valorRaiz = nuevoResultado.Xini;
            }
            else
            {
                double xr   = 0;
                double Xant = 0;
                xr = ((Fx1.calculate() * nuevoResultado.x0) - (Fx0.calculate() * nuevoResultado.x1)) / (Fx1.calculate() - Fx0.calculate());
                Xr = new Argument(" x = " + xr);
                nuevoResultado.error = Math.Abs(xr - Xant) / xr;
                while ((nuevoResultado.error >= nuevoResultado.Tolerancia) && (c <= nuevoResultado.iteraciones))
                {
                    Xant = xr;
                    nuevoResultado.x0 = nuevoResultado.x1;
                    nuevoResultado.x1 = xr;
                    X0  = new Argument(" x = " + nuevoResultado.x0.ToString(CultureInfo.InvariantCulture));
                    X1  = new Argument(" x = " + nuevoResultado.x1.ToString(CultureInfo.InvariantCulture));
                    Fx0 = new Expression("f(x)", f, X0);
                    Fx1 = new Expression("f(x)", f, X1);
                    xr  = (Fx1.calculate() * nuevoResultado.x0 - Fx0.calculate() * nuevoResultado.x1) / (Fx1.calculate() - Fx0.calculate());
                    nuevoResultado.error = Math.Abs(xr - Xant) / xr;
                    Xr = new Argument(" x = " + xr.ToString(CultureInfo.InvariantCulture));
                    c++;
                }

                nuevoResultado.valorRaiz   = nuevoResultado.x1;
                nuevoResultado.error       = Math.Abs(nuevoResultado.error);
                nuevoResultado.iteraciones = c;
            }
            nuevoResultado.iteraciones = c;
            return(nuevoResultado);
        }