Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
                }
            }
        }
Exemple #3
0
        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);
        }