public override INumber Execute(RuntimeData runtime, params INumber[] parameters) { var res = parameters[1].Integrate(runtime, parameters[0].Token.Text); var c = IntegralConstant.Create(runtime); AdditionFormula af = new AdditionFormula(); af.AddItem(runtime, res); af.AddItem(runtime, c); runtime.AddLogWay("Equal", new FuncedINumber(this, parameters), af); runtime.AddLogCondition("IntegralConstant", c); runtime.SetVariable(runtime, new Variable(c.ToString()), c); return(af); }
public override INumber Integrate(RuntimeData runtime, string t) { // このメンバーの名前がtと同じだった場合 if (this.Text == t) { if (this.Pow is IConstParameter) { // x^a // 1/(a + 1) MultipleFormula mf = new Expression.MultipleFormula(); mf.AddItem(runtime, new Fraction(this.Pow.Add(runtime, Number.New(1)), Number.New(1))); // x~(a+1) var cln = this.Clone(); cln.Pow = cln.Pow.Add(runtime, Number.New(1)); mf.AddItem(runtime, cln); return(mf); } else { throw new NotImplementedException("べき乗が定数ではない変数の積分は未実装です。"); } } else // このメンバーの名前がtとは違う場合 { var res = runtime.GetData(this.Token); if (res is Member) { throw new NotImplementedException("話が違う"); } if (res is Variable) { if ((res as Variable).Name == this.Text) { // yをxで微分しようとしている場合 // tとres(それぞれ違う名前の変数)がそれぞれ関係ないならば成り立つ runtime.AddLogCondition("UnrelationWith", new Variable(t), res); // resを定数として扱って積分する // 参考: (2)~(3)の部分 http://www.geisya.or.jp/~mwm48961/electro/multi_integral3.htm MultipleFormula mf = new Expression.MultipleFormula(); mf.AddItem(runtime, res); mf.AddItem(runtime, new Variable(t)); return(mf); } else { // yからまた別の変数が出てきちゃった場合 return(res.Integrate(runtime, t)); } } else { return(res.Integrate(runtime, t)); } } }