Ejemplo n.º 1
0
        internal virtual Vector solve(ArrayList expr, ArrayList x, int n)
        {
            Algebraic equ = null;
            Variable  v = null;
            int       i, k, iv = 0, ke = 0;

            for (i = 0; i < n && equ == null; i++)
            {
                v = ( Variable )x[i];
                double norm = -1.0;
                for (k = 0; k < n; k++)
                {
                    Algebraic exp = ( Algebraic )expr[k];
                    if (exp is Rational)
                    {
                        exp = (( Rational )exp).nom;
                    }
                    Algebraic slope = exp.Derive(v);
                    if (!slope.Equals(Symbol.ZERO) && slope is Symbol)
                    {
                        double nm = slope.Norm() / exp.Norm();
                        if (nm > norm)
                        {
                            norm = nm;
                            equ  = exp;
                            ke   = k;
                            iv   = i;
                        }
                    }
                }
            }
            if (equ == null)
            {
                for (i = 0; i < n && equ == null; i++)
                {
                    v = ( Variable )x[i];
                    for (k = 0; k < n; k++)
                    {
                        Algebraic exp = ( Algebraic )expr[k];
                        if (exp is Rational)
                        {
                            exp = (( Rational )exp).nom;
                        }
                        if (exp.Depends(v))
                        {
                            equ = exp;
                            ke  = k;
                            iv  = i;
                            break;
                        }
                    }
                }
            }
            if (equ == null)
            {
                throw new SymbolicException("Expressions do not depend of Variables.");
            }
            Vector sol = LambdaSOLVE.solve(equ, v);

            expr.RemoveAt(ke);
            expr.Insert(n - 1, equ);
            x.RemoveAt(iv);
            x.Insert(n - 1, v);
            return(sol);
        }