public override INumber Subtract(RuntimeData runtime, INumber val) { var v = val.Eval(runtime); if (v is Number) { if (this.Pow.Equals(runtime, val.Pow)) { return(Number.New(this.Value - (val as Number).Value)); } else { AdditionFormula af = new Expression.AdditionFormula(); af.AddItem(runtime, this); af.AddItem(runtime, val.Multiple(runtime, Number.New(-1))); return(af); } } if (v is Fraction) { return(v.Multiple(runtime, Number.New(-1)).Add(runtime, this)); } return(v.Subtract(runtime, this)); }
public override INumber ExecuteDiff(RuntimeData runtime, string t) { if (Runtime.Func.Differential.IsConstValue(runtime, this.Denominator)) { var res = this.Numerator.ExecuteDiff(runtime, t); return(res); } else { AdditionFormula af = new Expression.AdditionFormula(); { MultipleFormula mf = new Expression.MultipleFormula(); mf.AddItem(runtime, this.Numerator.ExecuteDiff(runtime, t)); mf.AddItem(runtime, this.Denominator); af.AddItem(runtime, mf); } { MultipleFormula mf = new Expression.MultipleFormula(); mf.AddItem(runtime, Number.New(-1)); mf.AddItem(runtime, this.Denominator.ExecuteDiff(runtime, t)); mf.AddItem(runtime, this.Numerator); af.AddItem(mf); } Fraction f = new Expression.Fraction( this.Denominator.Power(runtime, Number.New(2)), af ); return(f); } }
public override INumber Add(RuntimeData runtime, INumber val) { AdditionFormula af = new Expression.AdditionFormula(); af.AddItem(runtime, val); af.AddItem(runtime, val); return(af); }
public override INumber Integrate(RuntimeData runtime, string t) { AdditionFormula af = new Expression.AdditionFormula(); for (int i = 0; i < this.items.Count; i++) { af.AddItem(runtime, this.items[i].Integrate(runtime, t)); } return(af.Optimise(runtime)); }
public override INumber Optimise(RuntimeData runtime) { AdditionFormula af = new Expression.AdditionFormula(); for (int i = 0; i < this.Count; i++) { var val = this.items[i].Optimise(runtime); af.AddItem(runtime, val); } return(af); }
public override INumber Add(RuntimeData runtime, INumber val) { if (val is ImaginaryNumber) { ImaginaryNumber res = new ImaginaryNumber(); res._val = this.Value + (val as ImaginaryNumber).Value; return(res); } AdditionFormula af = new Expression.AdditionFormula(); af.AddItem(runtime, val); af.AddItem(runtime, this); return(af); }
public override INumber Add(RuntimeData runtime, INumber val) { if (val is Number) { if (this.Pow.Equals(runtime, val.Pow)) { return(Number.New(this.Value + (val as Number).Value)); } else { AdditionFormula af = new Expression.AdditionFormula(); af.AddItem(runtime, this); af.AddItem(runtime, val); return(af); } } return(val.Add(runtime, this)); }
public override INumber Eval(RuntimeData runtime) { AdditionFormula af = new Expression.AdditionFormula(); for (int i = 0; i < this.items.Count; i++) { var res = this.items[i].Eval(runtime); bool flag = false; for (int j = 0; j < af.Count; j++) { if (res.CanJoin(runtime, af.items[j])) { var itm = af.items[j]; af.items.RemoveAt(j); af.AddItem(runtime, itm.Add(runtime, res)); flag = true; break; } } if (!flag) { af.AddItem(runtime, res); } } INumber result = null; if (af.items.Count == 1) { result = af.items[0]; } else { result = af; } result = result.Power(runtime, this.Pow); return(result); }
public INumber ExecuteDiff(RuntimeData runtime, string t, INumber[] parameters) { // log(xy) => log(x) + log(y) if (parameters[1] is MultipleFormula) { AdditionFormula af = new Expression.AdditionFormula(); foreach (var item in (parameters[1] as MultipleFormula).Items) { af.AddItem(runtime, this.ExecuteDiff(runtime, t, new INumber[] { parameters[0], item })); } return(af); } if (parameters[1] is Fraction) { AdditionFormula af = new Expression.AdditionFormula(); Fraction f = parameters[1] as Fraction; af.AddItem(runtime, this.ExecuteDiff(runtime, t, new INumber[] { parameters[0], f.Numerator })); af.AddItem(runtime, this.ExecuteDiff(runtime, t, new INumber[] { parameters[0], f.Denominator }).Multiple(runtime, Number.New(-1))); return(af); } // 普通のlogの微分 if (parameters[0] is NaturalLogarithm) { NaturalLogarithm e = parameters[0] as NaturalLogarithm; if (e.Pow.Equals(runtime, Number.New(1))) { var prm = parameters[1].ExecuteDiff(runtime, t); if (prm.Equals(runtime, Number.New(0)) || prm.Equals(runtime, Number.New(1))) { return(new Fraction( parameters[1], Number.New(1))); } else { MultipleFormula mf = new Expression.MultipleFormula(); mf.AddItem(runtime, prm); mf.AddItem(runtime, new Fraction( parameters[1], Number.New(1))); return(mf); } } } else if (!FuncCalc.Runtime.Func.Differential.IsConstValue(runtime, parameters[0])) { throw new RuntimeException("底に定数以外が含まれたlogの微分を行うことはできません。"); } INumber param1Diff = parameters[1].ExecuteDiff(runtime, t); if (param1Diff.Equals(runtime, Number.New(0))) { param1Diff = Number.New(1); } MultipleFormula den = new MultipleFormula(); den.AddItem(runtime, parameters[1]); den.AddItem(runtime, new FuncedINumber(this, new INumber[] { new NaturalLogarithm(), parameters[0] })); Fraction res = new Fraction(den, param1Diff); return(res); }