具有无序变量功能的Java公式求值库

具有无序变量功能的Java公式求值库,java,parsing,math,formula,Java,Parsing,Math,Formula,我目前正在寻找一个用于公式解析和计算的java库(或带有JavaAPI的本机库) 使用此处的推荐,我查看了许多库: JFormula 杰瓦尔 西姆哈 杰普 但没有一个能满足我的需求,即: 具有相关性的多个公式求值(公式始终是使用其他变量或数值对变量的影响) 可能只改变50个配方中的一个,如果只改变一个配方,性能良好 不需要手动处理变量依赖关系 如果公式发生更改,则自动更新其他从属变量 倾听哪个变量发生变化的可能性 无需为变量指定特定格式(用户将直接输入名称,不希望使用复杂符号) 也许一个

我目前正在寻找一个用于公式解析和计算的java库(或带有JavaAPI的本机库)

使用此处的推荐,我查看了许多库:

  • JFormula
  • 杰瓦尔
  • 西姆哈
  • 杰普
但没有一个能满足我的需求,即:

  • 具有相关性的多个公式求值(公式始终是使用其他变量或数值对变量的影响)
  • 可能只改变50个配方中的一个,如果只改变一个配方,性能良好
  • 不需要手动处理变量依赖关系
  • 如果公式发生更改,则自动更新其他从属变量
  • 倾听哪个变量发生变化的可能性
  • 无需为变量指定特定格式(用户将直接输入名称,不希望使用复杂符号)
也许一个例子会更好。假设我们已按以下顺序在系统中输入:

  • a=b+c
  • c=2*d
  • b=3
  • d=2
我希望能够按此顺序输入这4行,并询问“a”(或“b”,无论什么)的结果。 然后,如果在用户界面(基本上是一个表变量公式)“b”更改为“2*d”,库将自动更改“b”和“a”的值,并返回我(或午餐事件,或调用函数)一个更改列表

最好的库应该是一个与JEP类似的库,但它具有无序变量功能,并且可以自动计算依赖变量

我知道编译器和电子表格软件使用这种机制,但我没有发现任何java或java兼容库可以直接使用

有人知道吗


编辑:精确性:问题实际上是关于一个库,或者最终是一组要链接在一起的库。问题在于公司的一个项目,其想法是花费最少的时间。“自己动手”的解决方案已经过评估,不在问题范围内

我不知道有任何库

假设您拥有的是一组方程,其中至少有一个变量位于方程的一侧(不允许使用a+B=C-D),并且没有循环(例如,a=B+1;B=a-2),从技术上讲,您需要做的是构建一个数据流图,显示每个运算符如何依赖于其操作数。对于无副作用的方程(例如,纯数学),这非常容易;最终得到一个有向无环图(一个具有表示共享子表达式的共享子树的林)。然后,如果更改了变量的值或引入了新公式,则修改dag并重新计算更改的部分,将更改沿dag向上传播到dag根。因此,您需要为表达式构建树,然后共享它们(通常通过在子树上散列来找到潜在的等价候选)。因此,需要大量的结构操作来保持dag(和is根值)

但如果它只有50个你所展示的复杂性变量,它就会起作用,你可以简单地重新评估它们。如果将表达式存储为树(或者更好的是,反向波兰),则可以非常快速地计算每个树,并且不需要支付任何开销来保持所有这些数据结构的最新

如果你有数百个方程,dag格式可能会更好


如果你有约束方程(例如,你不受两边的限制),你就在电子表格范例之外,进入了约束求解器,这是一项复杂得多的技术。

你为什么不自己写呢?您对该任务复杂性的评估可能是错误的。这比你想象的要容易得多——很可能,学习如何处理任何第三方库比从头开始实现这样一件小事需要付出更多的努力。在最坏的情况下,这不应该超过几个小时

寻找第三方库来做简单的事情没有任何意义(我知道,这是Java风气的一部分,但仍然…)


我建议你去图书馆看看,从中获得灵感。这是常见的Lisp语言,但思想非常基本,可以在其他任何地方传递。

您也可以查看这些链接

  • MathPiper(JavaYacas版本的Java分支)(有自己的 基于jEdit的编辑器(GPL)

  • Symja/Matheclipse(我自己的项目,使用JAS和Commons数学 图书馆(LGPL)

  • Java代数系统(JAS)(LGPL)
    • 我想嵌入,请参阅关于嵌入的教程。(Java Mindmapper)也使用Groovy编写公式

      每当变量发生变化时,必须将新值放入绑定中。 所有单元代码都应该作为单个代码块提供给Groovy Shell。您可以通过注册更改

      无论如何,我假设您必须实现一个薄层来满足您的需求:

      • 不需要手动处理变量依赖关系
      • 倾听哪个变量发生变化的可能性

      对于一个我还需要一个简单公式解析器的项目,我使用了javaworld.com上文章的代码。它很简单,很小(7节课),你可以根据自己的需要进行调整


      您可以下载源表单(搜索“词法分析第二部分”条目)。

      那么您是在尝试解联立方程组吗?不是真的,我们不应该既没有依赖循环,也不应该在公式中每个变量至少有一个公式,但可能有很多依赖级别不知道如何帮助,祝您好运!一种快速的方法是编写一个简单的解析器来识别每个等式中的每个标记,从而确定一个等式对其他等式的依赖性。这将允许您以正确的顺序将它们注入jep。谢谢!但我们希望避免手动解析和依赖于您的答案!但我真的在找图书馆。