有个公式形如:"x+y/z=12";这种,如果己知x和z的值,要求y的值,相当于解一个一元一次方程,该公式是以字符串形式输入.....现在的要求是,任意给定x,y,z中的两个变量的值,求另外一个的值(己知y,z,求x;己知x,y求z),请问该怎么去实现,或者目前有没有类似的库可以做的...当然这是个简单例子,目前项目中的公式要复杂的多,变量有20个,但是总是会给出其中19个去算另外一个

解决方案 »

  1.   

    用Map存值吧。根据公式的形式进行判断  我也疑惑的是公式是不是固定的格式。 + - * / ( ) [ ] { } 这可够麻烦的。
      

  2.   

    to gujinf2008:   公式的格式不是固定的,从一个配置文件读取,不同的业务用不同的公式但每次取出公式后要算哪一个变量是会告诉的,并且要求的变量可能在该公式中会出现多次(即sjlzcj说的同类项的问题)我现在知道的就是有些类库(比如:Expression4j)可以解析公式并计算出结果
    像输入"5+3/12"这种字符串的话,这些类库是可以解析做到,并且可以支持复杂的情况但是现在觉得麻烦的事情就是:
    己知公式"x+y/z=12",现在要求x的值,并且Y,Z的值己知,怎么通过程序来得知"x=12-y/z"这个字符串呢??
    如果能得出该串,那就可以再用Expression4j这类工具就好了大家帮帮忙,分不够再加,谢了
      

  3.   

    想到解法了。一樣先替換變數,轉後置或前置來計算,然後未知的X帶1和2各一次,這樣會得到兩個值。
    還有在計算中要標記X這樣才知道是下列兩種情況的哪一種。
    如果有除X就是 a/X那種,沒有就是ax那種。因為只有一個未知,所以結果只有兩種, 一種是f(x) = ax + b,一種是f(x) = a/x + b
    當有兩個值的時候,變成解聯立方程式 例如 x=1 算出 3,x=2 算出 4
    帶入 f(x) = ax + b , 3 = a + b,  4= 2a + b 算出 a= 1 (固定把 x 帶 2 那個減去x=1那個)
    b=2(固定用x=1那個算出的值減去x) 算出 a b之後 再帶回最開始的等號右邊 例如 5 
    則5 = 1*x+2 算出 x = 3a/x+b 的也差不多,a+b = 3, a/2 + b =4 算出 a/2 = -1, a=-2,b=5
    -2/x +5 =5 無解 
    當 x為分母的時候,有可能答案是無限大,也就是無解。以上算法就可以用程序實現了。
      

  4.   


    恩,谢,这个现在有现成的库可用,像Expression4j之类的
      

  5.   

    未知數不在分母的情況已經可以驗證了。
    但未知數在分母的情況應該為 f(x) = a/(x+c) + b才對
    變數有三個,x帶 -1 0 1還是很難解....//變數不能用 e 會當成自然指數
    Expression exp1 = ExpressionFactory.createExpression("f(a,b,c,d,g,f)=(a+b)*f/g+c*d");
            double val = 10;// (a+b)*f/g+c*d = 10 其中 f 是未知。
            Parameters params1 = ExpressionFactory.createParameters();
            MathematicalElement m1a = NumberFactory.createReal(1);
    MathematicalElement m1b = NumberFactory.createReal(2);
            MathematicalElement m1c = NumberFactory.createReal(3);
    MathematicalElement m1d = NumberFactory.createReal(4);
            MathematicalElement m1e = NumberFactory.createReal(2);
            params1.addParameter("a",m1a);
    params1.addParameter("b",m1b);
            params1.addParameter("c",m1c);
    params1.addParameter("d",m1d);
            params1.addParameter("g",m1e);
            MathematicalElement m1f = NumberFactory.createReal(1); //f帶一次 1
    params1.addParameter("f",m1f);
            double x1 = exp1.evaluate(params1).getRealValue();
            m1f = NumberFactory.createReal(2); //再帶一次 2
    params1.addParameter("f",m1f);
            double x2 = exp1.evaluate(params1).getRealValue(); double a = x2-x1;
            double b = x1-a;
            double x = (val - b)/a; //把 10 帶入
            System.out.println("等於 f(x)="+a+"x+"+b); //最後算出會等於10的 f
            System.out.println("未知的f="+x); //最後算出會等於10的 f
            m1f = NumberFactory.createReal(x); //再帶一次 2
            params1.addParameter("f",m1f);
            System.out.println("驗證:"+ exp1.evaluate(params1).getRealValue()+" = "+ val);