java方程问题

swoky 2010-10-15 09:59:57
有个公式形如:"x+y/z=12";这种,如果己知x和z的值,要求y的值,相当于解一个一元一次方程,该公式是以字符串形式输入.....

现在的要求是,任意给定x,y,z中的两个变量的值,求另外一个的值(己知y,z,求x;己知x,y求z),请问该怎么去实现,或者目前有没有类似的库可以做的...

当然这是个简单例子,目前项目中的公式要复杂的多,变量有20个,但是总是会给出其中19个去算另外一个
...全文
413 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
一夜相思愁 2010-10-26
  • 打赏
  • 举报
回复
这个问题我保留,代码有点长,
我试试写写,不行就去找我的老师好了。。
biaogege 2010-10-26
  • 打赏
  • 举报
回复
我写了一个简单的方程计算运用,你可以下来试试,只支持没有括号的一元方程,呵呵
afunx 2010-10-24
  • 打赏
  • 举报
回复
关注中。。。MARK
g000l 2010-10-19
  • 打赏
  • 举报
回复
大学学的线性代数有专门的解决办法, 可惜记不起了。
kebin0001 2010-10-19
  • 打赏
  • 举报
回复
未知數不在分母的情況已經可以驗證了。
但未知數在分母的情況應該為 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);
swoky 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 thegodofwar 的回复:]

看看这个是否可以帮到你:四则运算的中缀转后缀,逆波兰表达式求值
[/Quote]

恩,谢,这个现在有现成的库可用,像Expression4j之类的
thegodofwar 2010-10-19
  • 打赏
  • 举报
回复
kebin0001 2010-10-18
  • 打赏
  • 举报
回复
想到解法了。

一樣先替換變數,轉後置或前置來計算,然後未知的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 = 3

a/x+b 的也差不多,a+b = 3, a/2 + b =4 算出 a/2 = -1, a=-2,b=5
-2/x +5 =5 無解
當 x為分母的時候,有可能答案是無限大,也就是無解。

以上算法就可以用程序實現了。
swoky 2010-10-17
  • 打赏
  • 举报
回复
哦,大家加油,帮忙想想办法,要不然这没法结贴了
eggno8 2010-10-15
  • 打赏
  • 举报
回复
关注。收藏。
swoky 2010-10-15
  • 打赏
  • 举报
回复
自己顶下,这问题比较急,大家帮想想办法
wifewifewife 2010-10-15
  • 打赏
  • 举报
回复
关注中....
kebin0001 2010-10-15
  • 打赏
  • 举报
回复
把字串中的變數取代掉,這個還算容易。
然後一整個字串只有一個變數,此時用轉前置式或後置式的方法去運算。
可以運的的部分就運算,遇到未知變數的,根據算符和等號另一邊的做合併。
順利的話應該剩下一個變數和一個等號另一邊的數,這就是答案。

這樣可解掉部分問題,但還不夠嚴謹,很多情況還是做不出來...
swoky 2010-10-15
  • 打赏
  • 举报
回复
to gujinf2008:

公式的格式不是固定的,从一个配置文件读取,不同的业务用不同的公式

但每次取出公式后要算哪一个变量是会告诉的,并且要求的变量可能在该公式中会出现多次(即sjlzcj说的同类项的问题)

我现在知道的就是有些类库(比如:Expression4j)可以解析公式并计算出结果
像输入"5+3/12"这种字符串的话,这些类库是可以解析做到,并且可以支持复杂的情况

但是现在觉得麻烦的事情就是:
己知公式"x+y/z=12",现在要求x的值,并且Y,Z的值己知,怎么通过程序来得知"x=12-y/z"这个字符串呢??
如果能得出该串,那就可以再用Expression4j这类工具就好了

大家帮帮忙,分不够再加,谢了
chooseforget 2010-10-15
  • 打赏
  • 举报
回复
用Map存值吧。根据公式的形式进行判断

我也疑惑的是公式是不是固定的格式。 + - * / ( ) [ ] { } 这可够麻烦的。
无伤 2010-10-15
  • 打赏
  • 举报
回复
做出这个来还不知道要死多少脑细胞! 变数太大了!
gujinf2008 2010-10-15
  • 打赏
  • 举报
回复
我觉得问题的难点有两个:
1、公式是不是特定的
2、怎么判断你未知的是哪个值
我看到这个问题想到是这两点,并且这两点我都不会做,公式简单的话可以逻辑一下,第二个问题是我怎么也不知道该如何解决的。
hayuanjunbudilei 2010-10-15
  • 打赏
  • 举报
回复
帮顶一下吧,关注中。。。
qqzhuyuehe 2010-10-15
  • 打赏
  • 举报
回复
这个有点困难,等待高手吧……
sjlzcj 2010-10-15
  • 打赏
  • 举报
回复
未知数只出现一次吗?不需要做合并同类项的事情吧!
加载更多回复(2)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧