internal virtual Algebraic fzexakt(Zahl x) { if (x.smaller(Zahl.ZERO)) { Algebraic r = fzexakt((Zahl)x.mult(Zahl.MINUS)); if (r != null) { return(r.cc()); } return(r); } if (x.integerq()) { if (x.intval() % 2 == 0) { return(Zahl.ONE); } else { return(Zahl.MINUS); } } Algebraic qs = x.add(new Unexakt(.5)); if (((Zahl)qs).integerq()) { if (((Zahl)qs).intval() % 2 == 0) { return(Zahl.IMINUS); } else { return(Zahl.IONE); } } qs = x.mult(new Unexakt(4)); if (((Zahl)qs).integerq()) { Algebraic sq2 = FunctionVariable.create("sqrt", new Unexakt(0.5)); switch (((Zahl)qs).intval() % 8) { case 1: return(Zahl.ONE.add(Zahl.IONE).div(Zahl.SQRT2)); case 3: return(Zahl.MINUS.add(Zahl.IONE).div(Zahl.SQRT2)); case 5: return(Zahl.MINUS.add(Zahl.IMINUS).div(Zahl.SQRT2)); case 7: return(Zahl.ONE.add(Zahl.IMINUS).div(Zahl.SQRT2)); } } qs = x.mult(new Unexakt(6)); if (((Zahl)qs).integerq()) { switch (((Zahl)qs).intval() % 12) { case 1: return(Zahl.SQRT3.add(Zahl.IONE).div(Zahl.TWO)); case 2: return(Zahl.ONE.add(Zahl.SQRT3.mult(Zahl.IONE)).div(Zahl.TWO)); case 4: return(Zahl.SQRT3.mult(Zahl.IONE).add(Zahl.MINUS).div(Zahl.TWO)); case 5: return(Zahl.IONE.sub(Zahl.SQRT3).div(Zahl.TWO)); case 7: return(Zahl.IMINUS.sub(Zahl.SQRT3).div(Zahl.TWO)); case 8: return(Zahl.SQRT3.mult(Zahl.IMINUS).sub(Zahl.ONE).div(Zahl.TWO)); case 10: return(Zahl.SQRT3.mult(Zahl.IMINUS).add(Zahl.ONE).div(Zahl.TWO)); case 11: return(Zahl.IMINUS.add(Zahl.SQRT3).div(Zahl.TWO)); } } return(null); }
internal override Algebraic f_exakt(Algebraic f) { if (f is Rational) { Algebraic nom = f_exakt(((Rational)f).nom); Algebraic den = f_exakt(((Rational)f).den); if (den is Zahl) { return(f_exakt(nom.div(den))); } if (den is Exponential && ((Polynomial)den).a[0].Equals(Zahl.ZERO) && ((Polynomial)den).a[1] is Zahl) { if (nom is Zahl || nom is Polynomial) { Exponential denx = (Exponential)den; Exponential den_inv = new Exponential(Zahl.ONE.div(denx.a[1]), Zahl.ZERO, denx.expvar, denx.exp_b.mult(Zahl.MINUS)); return(nom.mult(den_inv)); } } f = nom.div(den); return(f); } if (f is Exponential) { return(f.map(this)); } if (!(f is Polynomial)) { return(f.map(this)); } Polynomial fp = (Polynomial)f; if (!(fp.v is FunctionVariable) || !((FunctionVariable)fp.v).fname.Equals("exp")) { return(f.map(this)); } Algebraic arg = ((FunctionVariable)fp.v).arg.reduce(); if (arg is Zahl) { return(fp.value(FunctionVariable.create("exp", arg)).map(this)); } if (!(arg is Polynomial) || !(((Polynomial)arg).degree() == 1)) { return(f.map(this)); } Algebraic r = Zahl.ZERO; Algebraic a = ((Polynomial)arg).a[1]; for (int i = 1; i < fp.a.Length; i++) { Algebraic b = ((Polynomial)arg).a[0]; Zahl I = new Unexakt((double)i); Algebraic ebi = Zahl.ONE; while (b is Polynomial && ((Polynomial)b).degree() == 1) { Algebraic f1 = FunctionVariable.create("exp", (new Polynomial(((Polynomial)b).v)).mult(((Polynomial)b).a[1].mult(I))); f1 = Exponential.poly2exp(f1); ebi = ebi.mult(f1); b = ((Polynomial)b).a[0]; } ebi = ebi.mult(FunctionVariable.create("exp", b.mult(I))); Algebraic cf = f_exakt(fp.a[i].mult(ebi)); Algebraic f2 = FunctionVariable.create("exp", (new Polynomial(((Polynomial)arg).v)).mult(a.mult(I))); f2 = Exponential.poly2exp(f2); r = r.add(cf.mult(f2)); } if (fp.a.Length > 0) { r = r.add(f_exakt(fp.a[0])); } return(Exponential.poly2exp(r)); }
public CollectExp(Algebraic f) { v = new ArrayList(); (new GetExpVars(v)).f_exakt(f); }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: Vektor solvesys(Vector expr, Vector x) throws JasymcaException internal virtual Vector solvesys(ArrayList expr, ArrayList x) { int nvars = x.Count; ArrayList lsg = new ArrayList(), vars = new ArrayList(); lsg.Add(expr); vars.Add(x); int n = nvars; while (n > 0) { for (int i = 0; i < lsg.Count; i++) { try { ArrayList equ = (ArrayList)lsg[i]; ArrayList xv = (ArrayList)vars[i]; Vector sol = solve(equ, xv, n); lsg.RemoveAt(i); vars.RemoveAt(i); Variable v = (Variable)xv[n - 1]; for (int k = 0; k < sol.Length(); k++) { ArrayList eq = new ArrayList(); for (int j = 0; j < n - 1; j++) { eq.Add(((Algebraic)equ[j]).Value(v, sol[k])); } eq.Add(sol[k]); for (int j = n; j < nvars; j++) { eq.Add(equ[j]); } lsg.Insert(i, eq); vars.Insert(i, clonev(xv)); i++; } } catch (JasymcaException) { lsg.RemoveAt(i); vars.RemoveAt(i); i--; } } if (lsg.Count == 0) { throw new JasymcaException("Could not solve equations."); } n--; } for (int i = 0; i < lsg.Count; i++) { ArrayList equ = (ArrayList)lsg[i]; ArrayList xv = (ArrayList)vars[i]; for (n = 1; n < nvars; n++) { Algebraic y = (Algebraic)equ[n - 1]; Variable v = (Variable)xv[n - 1]; for (int k = n; k < nvars; k++) { Algebraic z = (Algebraic)equ[k]; equ.RemoveAt(k); equ.Insert(k, z.Value(v, y)); } } } for (int i = 0; i < lsg.Count; i++) { ArrayList equ = (ArrayList)lsg[i]; ArrayList xv = (ArrayList)vars[i]; for (n = 0; n < nvars; n++) { Variable v = (Variable)xv[n]; Algebraic y = (new Polynomial(v)) - ((Algebraic)equ[n]); equ.RemoveAt(n); equ.Insert(n, y); } } Vector[] r = new Vector[lsg.Count]; for (int i = 0; i < lsg.Count; i++) { r[i] = Vector.Create((ArrayList)lsg[i]); } return(new Vector(r)); }
public virtual Algebraic rational(Algebraic expr) { return(ratsubst(expr).div(gcd).div(new Polynomial(t)).reduce()); }
internal override Algebraic f_exakt(Algebraic x) { throw new JasymcaException("Usage: ATAN2(y,x)."); }
private static void elim(Vector expr, Vector vars, int n) { if (n >= expr.Length()) { return; } double maxc = 0.0; int iv = 0, ie = 0; Variable vp = null; Algebraic f = Symbolic.ONE; Polynomial pm = null; for (int i = 0; i < vars.Length(); i++) { var v = ((Polynomial)vars[i])._v; for (int k = n; k < expr.Length(); k++) { var pa = expr[k]; if (pa is Polynomial) { var p = (Polynomial)pa; var c = p.coefficient(v, 1); double nm = c.Norm(); if (nm > maxc) { maxc = nm; vp = v; ie = k; iv = i; f = c; pm = p; } } } } if (maxc == 0.0) { return; } expr.set(ie, expr[n]); expr.set(n, pm); for (int i = n + 1; i < expr.Length(); i++) { var p = expr[i]; if (p is Polynomial) { var fc = ((Polynomial)p).coefficient(vp, 1); if (!fc.Equals(Symbolic.ZERO)) { p = p - pm * fc / f; } } expr.set(i, p); } elim(expr, vars, n + 1); }
internal override Algebraic SymEval(Algebraic x) { if (!(x is Polynomial)) { return(x.Map(this)); } var xp = ( Polynomial )x; var item = xp._v; if (item is Root) { var cr = (( Root )item).poly; if (cr.Length() == xp.Degree() + 1) { var xr = new Algebraic[xp.Degree() + 1]; Algebraic ratio = null; for (int i = xr.Length - 1; i >= 0; i--) { xr[i] = xp[i].Map(this); if (i == xr.Length - 1) { ratio = xr[i]; } else if (i > 0 && ratio != null) { if (!Equals(cr[i] * ratio, xr[i])) { ratio = null; } } } if (ratio != null) { return(xr[0] - ratio * cr[0]); } else { return(new Polynomial(item, xr)); } } } Algebraic xf = null; if (item is FunctionVariable && (( FunctionVariable )item).Name.Equals("sqrt") && (( FunctionVariable )item).Var is Polynomial) { var arg = ( Polynomial )(( FunctionVariable )item).Var; var sqfr = arg.square_free_dec(arg._v); var issquare = !(sqfr.Length > 0 && !sqfr[0].Equals(arg[arg.Coeffs.Length - 1])); for (int i = 2; i < sqfr.Length && issquare; i++) { if ((i + 1) % 2 == 1 && !sqfr[i].Equals(Symbolic.ONE)) { issquare = false; } } if (issquare) { xf = Symbolic.ONE; for (int i = 1; i < sqfr.Length; i += 2) { if (!sqfr[i].Equals(Symbolic.ZERO)) { xf = xf * sqfr[i] ^ ((i + 1) / 2); } } Algebraic r = Symbolic.ZERO; for (int i = xp.Coeffs.Length - 1; i > 0; i--) { r = (r + SymEval(xp[i])) * xf; } if (xp.Coeffs.Length > 0) { r = r + SymEval(xp[0]); } return(r); } } if (item is FunctionVariable && (( FunctionVariable )item).Name.Equals("sqrt") && xp.Degree() > 1) { xf = (( FunctionVariable )item).Var; var sq = new Polynomial(item); var r = SymEval(xp[0]); Algebraic xv = Symbolic.ONE; for (int i = 1; i < xp.Coeffs.Length; i++) { if (i % 2 == 1) { r = r + SymEval(xp[i]) * xv * sq; } else { xv = xv * xf; r = r + SymEval(xp[i]) * xv; } } return(r); } return(x.Map(this)); }
internal override Algebraic SymEval(Algebraic x) { if (x is Rational) { var xr = ( Rational )x; if (xr.den._v is FunctionVariable && (( FunctionVariable )xr.den._v).Name.Equals("exp") && (( FunctionVariable )xr.den._v).Var.IsComplex()) { var fv = ( FunctionVariable )xr.den._v; int maxdeg = Math.Max(Poly.Degree(xr.nom, fv), Poly.Degree(xr.den, fv)); if (maxdeg % 2 == 0) { return(divExponential(xr.nom, fv, maxdeg / 2) / divExponential(xr.den, fv, maxdeg / 2)); } else { var fv2 = new FunctionVariable("exp", (( FunctionVariable )xr.den._v).Var / Symbolic.TWO, (( FunctionVariable )xr.den._v).AlgLambda); Algebraic ex = new Polynomial(fv2, new Algebraic[] { Symbolic.ZERO, Symbolic.ZERO, Symbolic.ONE }); var xr1 = xr.nom.Value(xr.den._v, ex) / xr.den.Value(xr.den._v, ex); return(SymEval(xr1)); } } } if (x is Polynomial && (( Polynomial )x)._v is FunctionVariable) { var xp = ( Polynomial )x; Algebraic xf = null; var fvar = ( FunctionVariable )xp._v; if (fvar.Name.Equals("exp")) { var re = fvar.Var.RealPart(); var im = fvar.Var.ImagPart(); if (im != Symbolic.ZERO) { bool _minus = minus(im); if (_minus) { im = -im; } var a = FunctionVariable.Create("exp", re); var b = FunctionVariable.Create("cos", im); var c = FunctionVariable.Create("sin", im) * Symbolic.IONE; xf = a * (_minus ? b - c : b + c); } } if (fvar.Name.Equals("log")) { var arg = fvar.Var; Algebraic factor = Symbolic.ONE, sum = Symbolic.ZERO; if (arg is Polynomial && (( Polynomial )arg).Degree() == 1 && (( Polynomial )arg)._v is FunctionVariable && (( Polynomial )arg)[0].Equals(Symbolic.ZERO) && (( FunctionVariable )(( Polynomial )arg)._v).Name.Equals("sqrt")) { sum = FunctionVariable.Create("log", (( Polynomial )arg)[1]); factor = new Complex(0.5); arg = (( FunctionVariable )(( Polynomial )arg)._v).Var; xf = FunctionVariable.Create("log", arg); } try { var re = arg.RealPart(); var im = arg.ImagPart(); if (im != Symbolic.ZERO) { bool min_im = minus(im); if (min_im) { im = -im; } var a1 = new SqrtExpand().SymEval(arg * arg.Conj()); var a = FunctionVariable.Create("log", a1) / Symbolic.TWO; var b1 = SymEval(re / im); var b = FunctionVariable.Create("atan", b1) * Symbolic.IONE; xf = min_im ? a + b : a - b; var pi2 = Symbolic.PI * Symbolic.IONE / Symbolic.TWO; xf = min_im ? xf - pi2 : xf + pi2; } } catch (JasymcaException) { } if (xf != null) { xf = xf * factor + sum; } } if (xf == null) { return(x.Map(this)); } Algebraic r = Symbolic.ZERO; for (int i = xp.Coeffs.Length - 1; i > 0; i--) { r = (r + SymEval(xp[i])) * xf; } if (xp.Coeffs.Length > 0) { r = r + SymEval(xp[0]); } return(r); } return(x.Map(this)); }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: public int lambda(Stack st) throws ParseException, JasymcaException public override int lambda(Stack st) { int narg = getNarg(st); if (narg != 4) { throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)"); } Algebraic exp = getAlgebraic(st); Variable v = getVariable(st); Algebraic ll = getAlgebraic(st); Algebraic ul = getAlgebraic(st); LambdaAlgebraic xc = new ExpandConstants(); exp = xc.f_exakt(exp); ll = xc.f_exakt(ll); ul = xc.f_exakt(ul); if (!(ll is Zahl) || !(ul is Zahl)) { throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)"); } double rombergtol = 1.0e-4; int rombergit = 11; Zahl a1 = pc.env.getnum("rombergit"); if (a1 != null) { rombergit = a1.intval(); } a1 = pc.env.getnum("rombergtol"); if (a1 != null) { rombergtol = a1.unexakt().real; } double a = ((Zahl)ll).unexakt().real; double b = ((Zahl)ul).unexakt().real; //JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java: //ORIGINAL LINE: double[][] I = new double[rombergit][rombergit]; double[][] I = RectangularArrays.ReturnRectangularDoubleArray(rombergit, rombergit); int i = 0, n = 1; Algebraic t = trapez(exp, v, n, a, b); if (!(t is Zahl)) { throw new ParseException("Expression must evaluate to number"); } I[0][0] = ((Zahl)t).unexakt().real; double epsa = 1.1 * rombergtol; while (epsa > rombergtol && i < rombergit - 1) { i++; n *= 2; t = trapez(exp, v, n, a, b); I[0][i] = ((Zahl)t).unexakt().real; double f = 1.0; for (int k = 1; k <= i; k++) { f *= 4; I[k][i] = I[k - 1][i] + (I[k - 1][i] - I[k - 1][i - 1]) / (f - 1.0); } epsa = Math.Abs((I[i][i] - I[i - 1][i - 1]) / I[i][i]); } st.Push(new Unexakt(I[i][i])); return(0); }
public FunctionVariable(string fname, Algebraic fvar, LambdaAlgebraic flambda) { this.Name = fname; this.Var = fvar; this.AlgLambda = flambda; }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: Algebraic makelog(Algebraic c, Variable x, Algebraic a) throws JasymcaException internal virtual Algebraic makelog(Algebraic c, Variable x, Algebraic a) { Algebraic arg = (new Polynomial(x)).sub(a); return(FunctionVariable.create("log", arg).mult(c)); }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: public static Vektor horowitz(Algebraic p, Polynomial q, Variable x) throws JasymcaException public static Vektor horowitz(Algebraic p, Polynomial q, Variable x) { if (Poly.degree(p, x) >= Poly.degree(q, x)) { throw new JasymcaException("Degree of p must be smaller than degree of q"); } p = p.rat(); q = (Polynomial)q.rat(); Algebraic d = Poly.poly_gcd(q, q.deriv(x)); Algebraic b = Poly.polydiv(q, d); int m = b is Polynomial? ((Polynomial)b).degree():0; int n = d is Polynomial? ((Polynomial)d).degree():0; SimpleVariable[] a = new SimpleVariable[m]; Polynomial X = new Polynomial(x); Algebraic A = Zahl.ZERO; for (int i = a.Length - 1; i >= 0; i--) { a[i] = new SimpleVariable("a" + i); A = A.add(new Polynomial(a[i])); if (i > 0) { A = A.mult(X); } } SimpleVariable[] c = new SimpleVariable[n]; Algebraic C = Zahl.ZERO; for (int i = c.Length - 1; i >= 0; i--) { c[i] = new SimpleVariable("c" + i); C = C.add(new Polynomial(c[i])); if (i > 0) { C = C.mult(X); } } Algebraic r = Poly.polydiv(C.mult(b).mult(d.deriv(x)), d); r = b.mult(C.deriv(x)).sub(r).add(d.mult(A)); //JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java: //ORIGINAL LINE: Algebraic[][] aik = new Algebraic[m+n][m+n]; Algebraic[][] aik = RectangularArrays.ReturnRectangularAlgebraicArray(m + n, m + n); Algebraic cf; Algebraic[] co = new Algebraic[m + n]; for (int i = 0; i < m + n; i++) { co[i] = Poly.coefficient(p, x, i); cf = Poly.coefficient(r, x, i); for (int k = 0; k < m; k++) { aik[i][k] = cf.deriv(a[k]); } for (int k = 0; k < n; k++) { aik[i][k + m] = cf.deriv(c[k]); } } Vektor s = LambdaLINSOLVE.Gauss(new Matrix(aik), new Vektor(co)); A = Zahl.ZERO; for (int i = m - 1; i >= 0; i--) { A = A.add(s.get(i)); if (i > 0) { A = A.mult(X); } } C = Zahl.ZERO; for (int i = n - 1; i >= 0; i--) { C = C.add(s.get(i + m)); if (i > 0) { C = C.mult(X); } } co = new Algebraic[2]; co[0] = C.div(d); co[1] = A.div(b); return(new Vektor(co)); }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: public Algebraic value(Variable var, Algebraic x) throws JasymcaException public override Algebraic value(Variable @var, Algebraic x) { return(nom.value(@var, x).div(den.value(@var, x))); }
internal override Algebraic f_exakt(Algebraic x) { if (!(x is Polynomial)) { return(x.map(this)); } var xp = ( Polynomial )x; var item = xp.v; if (item is Root) { var cr = (( Root )item).poly; if (cr.length() == xp.degree() + 1) { var xr = new Algebraic[xp.degree() + 1]; Algebraic ratio = null; for (int i = xr.Length - 1; i >= 0; i--) { xr[i] = xp.a[i].map(this); if (i == xr.Length - 1) { ratio = xr[i]; } else if (i > 0 && ratio != null) { if (!cr.get(i).mult(ratio).Equals(xr[i])) { ratio = null; } } } if (ratio != null) { return(xr[0].sub(ratio.mult(cr.get(0)))); } else { return(new Polynomial(item, xr)); } } } Algebraic xf = null; if (item is FunctionVariable && (( FunctionVariable )item).fname.Equals("sqrt") && (( FunctionVariable )item).arg is Polynomial) { var arg = ( Polynomial )(( FunctionVariable )item).arg; var sqfr = arg.square_free_dec(arg.v); var issquare = !(sqfr.Length > 0 && !sqfr[0].Equals(arg.a[arg.a.Length - 1])); for (int i = 2; i < sqfr.Length && issquare; i++) { if ((i + 1) % 2 == 1 && !sqfr[i].Equals(Zahl.ONE)) { issquare = false; } } if (issquare) { xf = Zahl.ONE; for (int i = 1; i < sqfr.Length; i += 2) { if (!sqfr[i].Equals(Zahl.ZERO)) { xf = xf.mult(sqfr[i].pow_n((i + 1) / 2)); } } Algebraic r = Zahl.ZERO; for (int i = xp.a.Length - 1; i > 0; i--) { r = r.add(f_exakt(xp.a[i])).mult(xf); } if (xp.a.Length > 0) { r = r.add(f_exakt(xp.a[0])); } return(r); } } if (item is FunctionVariable && (( FunctionVariable )item).fname.Equals("sqrt") && xp.degree() > 1) { xf = (( FunctionVariable )item).arg; var sq = new Polynomial(item); var r = f_exakt(xp.a[0]); Algebraic xv = Zahl.ONE; for (int i = 1; i < xp.a.Length; i++) { if (i % 2 == 1) { r = r.add(f_exakt(xp.a[i]).mult(xv).mult(sq)); } else { xv = xv.mult(xf); r = r.add(f_exakt(xp.a[i]).mult(xv)); } } return(r); } return(x.map(this)); }
internal override Algebraic SymEval(Algebraic x) { return(Equals(x, Symbolic.ZERO) ? Symbolic.ZERO : null); }
internal override Algebraic f_exakt(Algebraic x) { if (x is Rational) { var xr = ( Rational )x; if (xr.den.v is FunctionVariable && (( FunctionVariable )xr.den.v).fname.Equals("exp") && (( FunctionVariable )xr.den.v).arg.komplexq()) { var fv = ( FunctionVariable )xr.den.v; int maxdeg = Math.Max(Poly.degree(xr.nom, fv), Poly.degree(xr.den, fv)); if (maxdeg % 2 == 0) { return(divExponential(xr.nom, fv, maxdeg / 2).div(divExponential(xr.den, fv, maxdeg / 2))); } else { var fv2 = new FunctionVariable("exp", (( FunctionVariable )xr.den.v).arg.div(Zahl.TWO), (( FunctionVariable )xr.den.v).la); Algebraic ex = new Polynomial(fv2, new Algebraic[] { Zahl.ZERO, Zahl.ZERO, Zahl.ONE }); var xr1 = xr.nom.value(xr.den.v, ex).div(xr.den.value(xr.den.v, ex)); return(f_exakt(xr1)); } } } if (x is Polynomial && (( Polynomial )x).v is FunctionVariable) { var xp = ( Polynomial )x; Algebraic xf = null; var fvar = ( FunctionVariable )xp.v; if (fvar.fname.Equals("exp")) { var re = fvar.arg.realpart(); var im = fvar.arg.imagpart(); if (!im.Equals(Zahl.ZERO)) { bool _minus = minus(im); if (_minus) { im = im.mult(Zahl.MINUS); } var a = FunctionVariable.create("exp", re); var b = FunctionVariable.create("cos", im); var c = FunctionVariable.create("sin", im).mult(Zahl.IONE); xf = a.mult(_minus ? (b.sub(c)) : b.add(c)); } } if (fvar.fname.Equals("log")) { var arg = fvar.arg; Algebraic factor = Zahl.ONE, sum = Zahl.ZERO; if (arg is Polynomial && (( Polynomial )arg).degree() == 1 && (( Polynomial )arg).v is FunctionVariable && (( Polynomial )arg).a[0].Equals(Zahl.ZERO) && (( FunctionVariable )(( Polynomial )arg).v).fname.Equals("sqrt")) { sum = FunctionVariable.create("log", (( Polynomial )arg).a[1]); factor = new Unexakt(0.5); arg = (( FunctionVariable )(( Polynomial )arg).v).arg; xf = FunctionVariable.create("log", arg); } try { var re = arg.realpart(); var im = arg.imagpart(); if (!im.Equals(Zahl.ZERO)) { bool min_im = minus(im); if (min_im) { im = im.mult(Zahl.MINUS); } var a1 = (new SqrtExpand()).f_exakt(arg.mult(arg.cc())); var a = FunctionVariable.create("log", a1).div(Zahl.TWO); var b1 = f_exakt(re.div(im)); var b = FunctionVariable.create("atan", b1).mult(Zahl.IONE); xf = min_im ? a.add(b) : a.sub(b); var pi2 = Zahl.PI.mult(Zahl.IONE).div(Zahl.TWO); xf = min_im ? xf.sub(pi2) : xf.add(pi2); } } catch (JasymcaException) { } if (xf != null) { xf = xf.mult(factor).add(sum); } } if (xf == null) { return(x.map(this)); } Algebraic r = Zahl.ZERO; for (int i = xp.a.Length - 1; i > 0; i--) { r = r.add(f_exakt(xp.a[i])).mult(xf); } if (xp.a.Length > 0) { r = r.add(f_exakt(xp.a[0])); } return(r); } return(x.map(this)); }
public static Algebraic reduce_exp(Algebraic p) { Algebraic[] a = new Algebraic[] { p }; a = reduce_exp(a); return(a[0]); }
public static Vector solve(Algebraic expr, Variable item) { Debug("Solve: " + expr + " = 0, Variable: " + item); expr = (new ExpandUser()).SymEval(expr); expr = (new TrigExpand()).SymEval(expr); Debug("TrigExpand: " + expr); expr = (new NormExp()).SymEval(expr); Debug("Norm: " + expr); expr = (new CollectExp(expr)).SymEval(expr); Debug("Collect: " + expr); expr = (new SqrtExpand()).SymEval(expr); Debug("SqrtExpand: " + expr); if (expr is Rational) { expr = (new LambdaRAT()).SymEval(expr); if (expr is Rational) { expr = (( Rational )expr).nom; } } Debug("Canonic Expression: " + expr); if (!(expr is Polynomial) || !(( Polynomial )expr).Depends(item)) { throw new JasymcaException("Expression does not depend of variable."); } var p = ( Polynomial )expr; Vector sol = null; var dep = depvars(p, item); if (dep.Count == 0) { throw new JasymcaException("Expression does not depend of variable."); } if (dep.Count == 1) { var dvar = ( Variable )dep[0]; Debug("Found one Variable: " + dvar); sol = p.solve(dvar); Debug("Solution: " + dvar + " = " + sol); if (!dvar.Equals(item)) { var s = new ArrayList(); for (int i = 0; i < sol.Length(); i++) { Debug("Invert: " + sol[i] + " = " + dvar); var sl = finvert(( FunctionVariable )dvar, sol[i]); Debug("Result: " + sl + " = 0"); var t = solve(sl, item); Debug("Solution: " + item + " = " + t); for (int k = 0; k < t.Length(); k++) { var tn = t[k]; if (!s.Contains(tn)) { s.Add(tn); } } } sol = Vector.Create(s); } } else if (dep.Count == 2) { Debug("Found two Variables: " + dep[0] + ", " + dep[1]); if (dep.Contains(item)) { var f = ( FunctionVariable )(dep[0].Equals(item) ? dep[1] : dep[0]); if (f.Name.Equals("sqrt")) { Debug("Solving " + p + " for " + f); sol = p.solve(f); Debug("Solution: " + f + " = " + sol); var s = new ArrayList(); for (int i = 0; i < sol.Length(); i++) { Debug("Invert: " + sol[i] + " = " + f); var sl = finvert(f, sol[i]); Debug("Result: " + sl + " = 0"); if (sl is Polynomial && depvars((( Polynomial )sl), item).Count == 1) { Debug("Solving " + sl + " for " + item); var t = solve(sl, item); Debug("Solution: " + item + " = " + t); for (int k = 0; k < t.Length(); k++) { var tn = t[k]; if (!s.Contains(tn)) { s.Add(tn); } } } else { throw new JasymcaException("Could not solve equation."); } } sol = Vector.Create(s); } else { throw new JasymcaException("Can not solve equation."); } } else { throw new JasymcaException("Can not solve equation."); } } else { throw new JasymcaException("Can not solve equation."); } return(sol); }
public Exponential(Polynomial x) : base(x.v, x.a) { this.expvar = ((Polynomial)((FunctionVariable)this.v).arg).v; this.exp_b = ((Polynomial)((FunctionVariable)this.v).arg).a[1]; }
public virtual int rank_decompose(Matrix B, Matrix P) { int m = nrow(), n = ncol(), perm = 0; Matrix C = eye(m, m); Matrix D = eye(m, m); for (int k = 0; k < m - 1; k++) { int _pivot = pivot(k); if (_pivot != k) { Matrix E = elementary(m, k, _pivot); C = (Matrix)C.mult(E); D = (Matrix)D.mult(E); perm++; } int p = k; for (p = k; p < n; p++) { if (!a[k][p].Equals(Zahl.ZERO)) { break; } } if (p < n) { for (int i = k + 1; i < m; i++) { if (!a[i][p].Equals(Zahl.ZERO)) { Algebraic f = a[i][p].div(a[k][p]); a[i][p] = Zahl.ZERO; for (int j = p + 1; j < n; j++) { a[i][j] = a[i][j].sub(f.mult(a[k][j])); } C = (Matrix)C.mult(elementary(m, i, k, f)); } } } } int nm = Math.Max(n, m); for (int i = nm - 1; i >= 0; i--) { if (row_zero(i)) { remove_row(i); C.remove_col(i); } } if (B != null) { B.a = C.a; } if (P != null) { P.a = D.a; } return(perm); }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET: //ORIGINAL LINE: Vektor solve(Vector expr, Vector x, int n) throws JasymcaException 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(Symbolic.ZERO) && slope is Symbolic) { 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 JasymcaException("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); }