Пример #1
0
        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));
        }
Пример #2
0
 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);
     }
 }
Пример #3
0
        public override INumber Add(RuntimeData runtime, INumber val)
        {
            AdditionFormula af = new Expression.AdditionFormula();

            af.AddItem(runtime, val);
            af.AddItem(runtime, val);
            return(af);
        }
Пример #4
0
        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));
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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));
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }