public override INumber Integrate(RuntimeData runtime, string t) { INumber res = null; if (this.func is IIntegrateWithParameters) { res = (this.func as IIntegrateWithParameters).Integrate(runtime, t, this.param); // この段階ではpowのことは感がられていないので、pow部をここで処理する if (!(this.Pow is Number && (this.Pow as Number).Value == 1)) { throw new NotImplementedException("べき乗が1ではない関数の積分はまだ未対応です"); // 以下、微分のコードのコピペ MultipleFormula mf = new MultipleFormula(); mf.AddItem(runtime, res); INumber pow = this.Clone(); pow.Pow = pow.Pow.Subtract(runtime, Number.New(1)); mf.AddItem(runtime, pow); res = mf; } if (runtime.Setting.DoOptimize) { res = res.Optimise(runtime); } } else { res = new FuncedINumber( runtime.Functions["intg"], new INumber[] { new Variable(new FuncCalc.Token(t, Analyzer.TokenType.Member)), this }); // たぶんpowの部分が怪しいのでチェックすること Debugger.Break(); } //最終処理部 { // resが結果だけど、べき乗部分の処理をしていないかもしれないので要チェック Debugger.Break(); if (!(this.Pow is Number && (this.Pow as Number).Value == 1)) { runtime.Setting.Logger.AddWarning("関数式の積分の部分は1以外のべき乗の計算を考慮していないので、結果がおかしくなっている可能性があります。"); } return(res); } }
public override INumber ExecuteDiff(RuntimeData runtime, string t) { INumber res = null; if (this.func is IDiffWithParameters) { res = (this.func as IDiffWithParameters).ExecuteDiff(runtime, t, this.param); // この段階ではpowのことは感がられていないので、pow部をここで処理する if (!(this.Pow is Number && (this.Pow as Number).Value == 1)) { MultipleFormula mf = new MultipleFormula(); mf.AddItem(runtime, res); INumber pow = this.Clone(); pow.Pow = pow.Pow.Subtract(runtime, Number.New(1)); mf.AddItem(runtime, pow); res = mf; } if (runtime.Setting.DoOptimize) { res = res.Optimise(runtime); } } else { res = new FuncedINumber( runtime.Functions["diff"], new INumber[] { new Variable(new FuncCalc.Token(t, Analyzer.TokenType.Member)), this }); // たぶんpowの部分が怪しいのでチェックすること Debugger.Break(); } //最終処理部 { var mf = Runtime.Func.Differential.DiffPow(runtime, t, this); if (mf != null) { mf.AddItem(runtime, res); return(mf); } else { return(res); } } }
public override INumber Optimise(RuntimeData runtime) { INumber res = Number.New(1); for (int i = 0; i < this.Count; i++) { res = res.Multiple(runtime, this.items[i]); if (!(res is MultipleFormula)) { res = res.Optimise(runtime); } } //if (!(res is MultipleFormula)) // return res.Optimise(runtime); return(res); }