线性方程重新排列

时间:2011-01-11 12:56:30

标签: java math

我有一个公式显示如下,

((((c1+c2)/c3)*c4)-c5+c6)

此公式格式可以更改,这意味着此公式从最终用户生成。它可以是任何格式。我们只使用基本的算术运算符,即+-*/()

我可以选择任何一个值来查找。如果我选择C3来查找值,则需要修改公式,如下所示,

C3 = (c1+c2)*(c4/(c5-c6))

欢迎提出建议和想法。有没有可用的API?

2 个答案:

答案 0 :(得分:2)

我想我会考虑从2个集合开始,一个表示方程式的左侧,另一个表示右侧。 RHS将从一个元素开始,即整个公式。然后,开始从外部工作中剥离括号。当每个元素被暴露时,将其添加到第二个集合,确保反转操作。然后,只要移动要搜索的元素,就开始从第二个集合移回第一个集合。

由于我真的认为这是作业,我不想给出代码答案,但我上面的胡言乱语转化为“逐步完成算术转换”。所以,要暴露C3:

((((c1+c2)/c3)*c4)-c5+c6)
(((c1+c2)/c3)*c4)-c5+c6
(c5 - c6) = (((c1+c2)/c3)*c4)
(c5 - c6) = ((c1+c2)/c3)*c4
((c5 - c6) / c4) = ((c1+c2)/c3)
((c5 - c6) / c4) = (c1+c2)/c3
(c3* ((c5- c6) / c4) = (c1 + c2)
c3* (c5- c6) = (c1 + c2) * c4
c3 = (((c1 + c2) * c4) / (c5 - c6))

我不完全确定我的错误在哪里,我的最终等式与你的不同,但我相信这是我将采取的方法 - 逐步完成每个转换,直到你需要的变量暴露出来。

答案 1 :(得分:1)

如果目标变量发生任意次数,则(通常)不可能导出公式。如果只出现一次,算法非常简单。首先将公式转换为反向抛光表示法。然后构建一个二叉树,它在叶子中有变量,在内部节点中有操作。 (当你有一个反向抛光表示法时,它非常简单,几乎就像表达式的计算一样,但是在堆栈上使用子树而不是数字。)处理从根到所需叶子的路径,求解最简单的方程式:

? + c6 = 0
? = 0 - c6
? - c5 = 0 - c6
? = (0 - c6) + c5
? * c4 = (0 - c6) + c5
? = ((0 - c6) + c5) / c4
(c1+c2)/? = ((0 - c6) + c5) / c4
? = (c1+c2) / (((0 - c6) + c5) / c4)
c3 = (c1+c2) / (((0 - c6) + c5) / c4)

我在这里用?包含目标变量的子树。请注意,您需要解决的每个等式都是形式(...)op? =(...),因此以明显的方式解决。