Java 如何找到函数范围?

Java 如何找到函数范围?,java,algorithm,math,Java,Algorithm,Math,我有一个任意函数或不等式(由许多三角、对数、指数和算术项组成),它包含几个参数,我想知道它的范围,知道所有参数的域。是否有任何Java库可以帮助解决问题?这样做的最佳实践是什么?对于任意函数,唯一能做的就是蛮力近似,这是对的吗?另外,我对能够为给定域构建交叉点和互补点的函数感兴趣 Upd。功能由用户输入,因此复杂性无法预测。但是,如果库将至少处理简单的情况(1-2个变量,1-2个术语),那么就可以了。我建议函数将主要定义区间,最多包含2个自变量。例如,定义如下 y > (x+3), x

我有一个任意函数或不等式(由许多三角、对数、指数和算术项组成),它包含几个参数,我想知道它的范围,知道所有参数的域。是否有任何Java库可以帮助解决问题?这样做的最佳实践是什么?对于任意函数,唯一能做的就是蛮力近似,这是对的吗?另外,我对能够为给定域构建交叉点和互补点的函数感兴趣

Upd。功能由用户输入,因此复杂性无法预测。但是,如果库将至少处理简单的情况(1-2个变量,1-2个术语),那么就可以了。我建议函数将主要定义区间,最多包含2个自变量。例如,定义如下

y >  (x+3), x ∈ [-7;8]
y <= 2x, x ∈ [-∞; ∞]
y =  x, x ∈ {1,2,3}
y>(x+3),x∈ [-7;8]

y我本以为这是用计算机代数系统解决的一个自然问题。我在谷歌上搜索,似乎是被引用最多的Java CA

如果我必须把自己局限于数值方法,那么我可能会用一些不同的区间计算来解决它。所以:sin的密码域是[-1,1],exp的密码域是(0,+Inf),exp的密码域是


这里是我接触Mathematica(可从Java调用)的地方。

注释:我假设您想找到函数的值,即函数可以采用的值集

我认为这个问题并不简单。我不认为“蛮力”是一个解决方案,当我们有连续的间隔(即无限多个点!)“蛮力”是什么意思

然而,在某些特殊情况下,这实际上是可能的。例如,当你使用sin(F(x))函数时,你知道它的范围是[-1,1],而不管内部函数F(x)或Exp(x),你都知道它的范围是(0,+inf)

您可以尝试使用与每个节点关联的范围的信息构建语法树。然后,您可以尝试从下到上遍历树,尝试计算函数值所在的实际间隔的信息

例如,对于函数Sin(x)+Exp(x)和x in(-inf,+inf),您将得到一棵树

   +          range: [left range] union [right range]
  / \
sin  exp      range [-1, 1]  ,   range: (0,+inf)
 |    |
 x    x       
这里的结果是[-1,1]并集(0,+inf)=[-1,+inf)

当然,这种方法存在很多问题,例如,对+的范围的操作并不总是并集。假设有两个函数F(x)=Sin(x)和G(x)=1-Sin(x)。这两个函数都有范围[-1,1],但它们的和会收缩为{1}.你需要检测并注意这种行为,否则你只能得到可能范围的上限(有点像密码域)

如果你提供更多的例子,也许有人可以提出一个更好的解决方案,我想这在很大程度上取决于函数的细节


@高性能标记:我看了JAS,它的主要目的似乎是处理多元多项式环,但提到的三角、对数和其他纯多项式算法的问题是不够的。

这里有另一种方法,取决于函数的疯狂程度(参见编辑)它可能会为你的问题提供一个通用的解决方案

  • 编写最终表达式,这可能相当复杂

  • 在使用之后,找到函数的最小值和最大值-这将为您提供结果范围


  • 编辑:只有在最终表达式不连续的情况下,上述方法才有效,您必须将每个表达式分成连续的部分,您必须找到最小值和最大值。最后,您必须将它们合并。

    您的记法是正确的,我会解决这个问题。关于蛮力算法,我的意思是n近似到某个精度,当然我们不能完全覆盖区间。关于算法-是的,有很多特殊情况需要处理。这就是为什么我在寻找一个现成的决策,其中有人做了所有肮脏的工作:)我建议我不是唯一对解感兴趣的人,所以可能他们已经对解决方案感兴趣了。my函数是由用户输入的,我无法预测它们的复杂性。但是,我建议在大多数情况下它们非常简单,复杂的情况可以跳过。@Dzmitry:CAS通常可以“完全覆盖间隔”(用集合上的代数表达式象征性地表示它们,准备以给定的精度进行计算,并可用于确定任何给定的数字是否为元素)。(注:蛮力!=接近某个精度。蛮力==问题解空间的穷举搜索)在我看来,这就像是集合算术中的一个问题,有一个明显的额外扭曲,那就是一些集合——那些描述区间的集合——可能是无限的。@GregS,不仅仅是集合算术。这是一个符号代数的问题,例如,关于并集是实现上述目标的方法的建议确实是误导性的。下面是另一个例子,F(x)=sin sin(x)G(x)=0.5清楚地表明,你必须能够简化给定的表达式F(x)+G(x),如果函数范围是连续的,你可以搜索最小值和最大值,从而得到范围(这可能不容易).@Unreason:一般来说,你是对的,但从实践的角度来看,我认为“暴力”这个术语非常清楚地描述了我想说的话。也许,我错了。无论如何,我会看看CAS,可能会有所帮助。@GregS:在我的应用程序中,我想,评估简单的案例就足够了。对于复杂的案例,我想有限的复杂性和不可能在合理的时间内评估区间边界提供警告将是令人满意的。无法相信在某种程度上没有成熟的方法来解决问题。无法抗拒说函数将