我有一个任意函数或不等式(由许多三角函数,对数函数,指数函数和算术术语组成),它带有几个参数,我希望知道所有参数的域的范围。是否有任何Java库可以帮助解决问题?这样做的最佳做法是什么?我是对的,对于一个任意函数,唯一能做的就是蛮力逼近吗?此外,我对可以为给定域构建交叉点和补充的函数感兴趣。
更新。用户输入了这些功能,因此无法预测复杂性。但是,如果图书馆至少会处理简单的案例(1-2个变量,1-2个术语),那就没问题了。我建议函数主要定义区间,最多包含2个自变量。例如,像
这样的定义y > (x+3), x ∈ [-7;8]
y <= 2x, x ∈ [-∞; ∞]
y = x, x ∈ {1,2,3}
将在99%的案例中得到处理,现在已经足够了。
好吧,也许用一种简单的蛮力来治疗这种情况会更快。对我的情况来说可能会令人满意,但如果有更好的选择我想学习它们。
答案 0 :(得分:2)
符号说明:我假设您要查找函数的range,即函数可以采用的值集。
我认为这个问题并不简单。我认为“蛮力”根本不是解决方案,当我们有连续的间隔时(即无限多点!),“蛮力”甚至意味着什么。
但是,可能存在一些特殊情况,这实际上是可行的。例如,当您使用 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] union(0,+ inf)= [-1,+ inf)。
当然这种方法存在许多问题,例如+对范围的操作并不总是联合。假设你有两个函数F(x)= Sin(x)和G(x)= 1-Sin(x)。两者都有范围[-1,1],但它们的总和折叠为{1}。您需要检测并处理此类行为,否则您将只获得可能范围的上限(如此类型的codomain)。
如果您提供更多示例,也许有人可以提出更好的解决方案,我想很大程度上取决于功能的细节。
<高性能标记:我看过JAS,它的主要目的似乎是处理多元多项式环,但问题提到三角函数,对数和其他transcendental functions所以纯多项式算法不会足够。答案 1 :(得分:1)
这是另一种方法,取决于您的功能有多疯狂(请参阅编辑),它可能会为您提供通用的解决方案。
撰写最终表达式,可能相当复杂。
之后使用numerical methods查找函数的最小值和最大值 - 这应该会给出结果范围。
编辑:只有在您的最终表达不连续的情况下,上述情况才会起作用,您必须分成连续的部分,每个部分必须找到最小值和最大值。最后你必须联合那些。
答案 2 :(得分:0)
我原以为这是解决计算机代数系统的自然问题。我用Google搜索,JAS似乎是被引用最多的Java CAS。
如果我不得不将自己局限于数值方法,那么我可能会通过各种间隔计算来处理它。所以:sin的codomain是[-1,1],exp的codomain是(0,+ Inf),exp(sin(表达式))的codomain是......
告诉你,这是我要去的地方 Mathematica (可以从Java调用)。