是否可以在Python中反转任意lambda?

时间:2012-03-28 21:24:21

标签: python math lambda

我最近一直在玩Python和数学,然后我遇到了一些我还没弄清楚的东西。也就是说,给定一个任意的lambda,是否有可能返回该lambda的逆数进行数学运算?也就是说,invertLambda使得invertLambda(lambda x:(x + 2))(2)= 0. lambdas仅限于表达式的事实给了我希望,但到目前为止我还没有能够使它工作。我知道任何结果都会导致丢失信息的功能出现问题,但是如果必须的话,我愿意将用户和我自己限制在无损功能上。

2 个答案:

答案 0 :(得分:6)

当然不是:如果lambda不是injective function,则无法将其反转。示例:您无法将lambda映射x反转为x*x,因为原始x的符号将丢失。

抛开注入性,有些函数在计算上非常复杂。例如,考虑从其md5哈希中恢复原始值。 (对于lambda计算md5哈希,反向函数必须在密码意义上破坏md5!)


编辑:
事实上,如果我们限制可以在那里使用的表达式,理论上我们可以使lambdas可逆。例如,如果lambda是1参数的线性函数,我们可以很容易地将其反转。如果它是度数的多项式> 4,我们有代数精确解的问题。

当然,我们可以避免使用精确解决方案,只需将函数以数字方式反转即可。这是可能的,使用等式lambda(x) = value numerical solving的任何方法都可以做到(最简单的二元搜索)。

答案 1 :(得分:1)

我有点迟了,但我刚刚发布了一个python包,它可以准确地完成这个任务。你可能想借用它的一些想法: https://pypi.python.org/pypi/pynverse

它基本上遵循这一策略:

  1. 确定函数是增加还是减少。对于这两个参考点ref1和ref2是必需的:
    • 如果间隔有限,则点参考点在整个区间内为1/4和3/4。
    • 在无限的时间间隔内,任何两个值都可以正常工作。
    • 如果f(ref1)< f(ref2),函数正在增加,否则正在减少。
  2. 计算出区间中函数的图像。
    • 如果提供了值,则使用这些值。
    • 在一个封闭的区间内,只计算f(a)和f(b),其中a和b是区间的末端。
    • 在开放时间间隔内尝试计算f(a)和f(b),如果这有效,则使用它们,否则将假定为(-Inf,Inf)。
  3. 使用以下条件构建有界函数:
    • bounded_f(X):
      • 返回 - 如果x低于间隔,并且f正在增加。
      • 如果x低于间隔,则返回+ Inf,并且f正在减小。
      • 如果x高于间隔,则返回+ Inf,并且f正在增加。
      • 返回 - 如果x高于间隔,则f正在减小。
      • 返回f(x)否则
  4. 如果反转所需的数字y0在图像之外,则引发异常。
  5. 通过最小化(bounded_f(x)-y0)** 2,使用Brent方法找到bounded_f(x)-y0的根,确保最小化的算法从原始内部的某个点开始通过将ref1,ref2设置为括号来设置间隔。只要超出允许的间隔,bounded_f就会返回无限,迫使算法返回到间隔内搜索。
  6. 检查解决方案是否准确并且它们满足f(x0)= y0到某个所需精度,否则会发出警告。
  7. 当然,正如弗拉德指出的那样,该函数必须是可逆的,因为逆存在,并且在域中也是连续的,以便工作。