有个公式形如:"x+y/z=12";这种,如果己知x和z的值,要求y的值,相当于解一个一元一次方程,该公式是以字符串形式输入.....现在的要求是,任意给定x,y,z中的两个变量的值,求另外一个的值(己知y,z,求x;己知x,y求z),请问该怎么去实现,或者目前有没有类似的库可以做的...当然这是个简单例子,目前项目中的公式要复杂的多,变量有20个,但是总是会给出其中19个去算另外一个
调试欢乐多
像输入"5+3/12"这种字符串的话,这些类库是可以解析做到,并且可以支持复杂的情况但是现在觉得麻烦的事情就是:
己知公式"x+y/z=12",现在要求x的值,并且Y,Z的值己知,怎么通过程序来得知"x=12-y/z"这个字符串呢??
如果能得出该串,那就可以再用Expression4j这类工具就好了大家帮帮忙,分不够再加,谢了
還有在計算中要標記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為分母的時候,有可能答案是無限大,也就是無解。以上算法就可以用程序實現了。
恩,谢,这个现在有现成的库可用,像Expression4j之类的
但未知數在分母的情況應該為 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);