public override INumber Add(Runtime.RuntimeData runtime, INumber val) { AdditionFormula af = new AdditionFormula(); af.AddItem(runtime, this); af.AddItem(runtime, val); return(af); }
private INumber ExecuteDiff(RuntimeData runtime, INumber formula, string t, INumber param0) { if (formula is AdditionFormula) { AdditionFormula af = new AdditionFormula(); AdditionFormula f = formula as AdditionFormula; for (int i = 0; i < f.Count; i++) { var res = DiffExecute(runtime, t, f.Items[i], param0, false); if (res is Number && (res as Number).Value == 0) { continue; } af.AddItem(res); } return(af); } else if (formula is Variable && // 微分しようとした変数がユーザー定義関数だった場合 runtime.Functions.ContainsKey((formula as Variable).Name) && runtime.Functions[(formula as Variable).Name] is UserDefineFunction) { var f = runtime.Functions[(formula as Variable).Name] as UserDefineFunction; return(this.Execute(runtime, param0, f.Formula.Eval(runtime))); } else if (formula is Member && // 微分しようとした変数がユーザー定義関数だった場合 runtime.Functions.ContainsKey((formula as Member).Text) && runtime.Functions[(formula as Member).Text] is UserDefineFunction) { var f = runtime.Functions[(formula as Member).Text] as UserDefineFunction; return(this.Execute(runtime, param0, f.Formula.Eval(runtime))); } else if (formula is MultipleFormula) { throw new NotImplementedException(); } else if (formula is Variable) { return(DiffExecute(runtime, t, formula as Variable, param0, false)); } else if (formula is Member) { var v = new Variable((formula as Member).Token); return(DiffExecute(runtime, t, v, param0, false)); } else if (formula is IConstParameter) { return(Number.New(0)); } throw new NotImplementedException(); }
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 Execute(RuntimeData runtime, params INumber[] parameters) { string varname = "x"; INumber f = parameters[0].Optimise(runtime); if (f is IConstParameter) { throw new RuntimeException("定数から方程式を評価することはできません。", parameters[0]); } if (f is Variable) { if ((f as Variable).Name == varname) { return(Number.New(0)); } else { throw new RuntimeException("この条件では方程式を解決することはできません。"); } } if (f is Member) { if ((f as Member).Text == varname) { return(Number.New(0)); } else { throw new RuntimeException("この条件では方程式を解決することはできません。"); } } if (f is MultipleFormula) { bool flag = false; MultipleFormula mf = f as MultipleFormula; for (int i = 0; i < mf.Items.Count; i++) { if (mf.Items[i] is Variable && (mf.Items[i] as Variable).Name == varname) { flag = true; } if (mf.Items[i] is Member && (mf.Items[i] as Member).Text == varname) { flag = true; } } if (flag) { return(Number.New(0)); } else { throw new RuntimeException("この条件では方程式を解決することはできません。"); } } if (!(f is AdditionFormula)) { throw new RuntimeException(string.Format("まだ '{0}' の式の解決は対応していません。", f.GetType().FullName)); } Dictionary <int, INumber> keisu = new Dictionary <int, INumber>(); // 式の係数を調べる AdditionFormula af = f as AdditionFormula; for (int i = 0; i < af.Items.Length; i++) { var item = af.Items[i]; INumber pow = null; var res = CheckMulti(runtime, varname, item, out pow); if (pow is Number) { long p = (pow as Number).Value; if (p > int.MaxValue) { throw new RuntimeException("int.MaxValueを超えるべき乗を含む式の解決はできません。"); } int ip = (int)p; if (!keisu.ContainsKey(ip)) { keisu.Add(ip, Number.New(0)); } keisu[ip] = keisu[ip].Add(runtime, res); } else { throw new RuntimeException("整数以外のべき乗の変数が指定された状態で方程式を解決することはできません。"); } } INumber result = null; // 一次方程式を解決する // 条件: x^2以上のべき乗がない // xの係数が0ではない if ((result = this.SolutionLinearEquation(runtime, varname, keisu)) != null) { return(result); } // 二次方程式を解決する // 条件: x^3以上のべき乗がない // x^2, x, 1のそれぞれの係数が実数であること // x^2の係数が0ではない if ((result = this.SolutionQuadraticEquation(runtime, varname, keisu)) != null) { return(result); } // 五次方程式を解決する // 無条件でエラーを出す。(解の公式は存在しないため計算を行うことができないため) if ((result = this.SolutionQuadraticEquation(runtime, varname, keisu)) != null) { return(result); } throw new RuntimeException("式を解決することができませんでした"); }