【问题标题】:Inverse function of a given function给定函数的反函数
【发布时间】:2014-07-08 17:54:14
【问题描述】:

我有一个带有两个输入 xy 的函数,它根据某些条件(依赖于 xy 的值)返回 z。类似于下面的伪代码。

f(x, y)
    if x < a && y < b
        return z=x+y;
    else if x >= a && x < c && y >= b && y < d
        return z=x-y;
    else x >= c && y >= d
        return z=x*y;

现在我想编写一个几乎充当f 的反函数的函数(我们称之为g)。伪代码应该类似于以下内容:

g(z)
    return x1, x2, y1 and y2; //x's, y's are corresponding boundaries for given z

假设f 非常简单,只基于几个条件,返回值就像一些算术语句一样简单(与上面提供的完全相似)。你怎么写g?您是否只需存储来自f 的边界和相应的返回值,然后使用给定的z 在它们之间遍历以找到适当的边界?我想看看其他人是如何破解这个的。请注意,f 也是您自己编写的,您对此一无所知。

注意:假设返回值在任何时候都是不同的,并且在任何情况下都没有任何重叠

【问题讨论】:

  • 为什么会返回两对(x, y)?
  • 这个问题似乎跑题了,因为它是关于数学的
  • 看起来 f 是多对一映射。我怀疑它会有少量的逆!
  • @RachelGallen SO中有数学和算法部分和标签!
  • @AaronGolden 我非常简化了我的问题。这就是为什么我想知道人们如何为这些类型的问题想出一个通用的解决方案。

标签: algorithm math inverse


【解决方案1】:

您将从查看每个条件开始。如果 x 和 y 要满足条件的最低限度,它们的值是多少。例如,如果 x 和 y 分别仅略小于 a 和 b,那么方程 x+y 是否能够满足 z。即 x+y 将大于 z。如果不是,则不可能排除任何小于当前 x 和 y 的数字。然后你可以进入下一个条件,依此类推。如果 x 和 y 的值可以满足条件,那么您将从下边界开始并迭代该范围内的可能值,或者使用代数来解决它。

【讨论】:

    【解决方案2】:
    1. 你的功能

      double f(double x,double y) // z=f(x,y)
       {
             if ((x<a)&&(y<b))                return x+y;
       else if ((x>=a)&&(x<c)&&(y>=b)&&(y<d)) return x-y;
       else if ((x>=c)&&(y>=d))               return x*y;
                                              return ???;
       }
      

      如果你像我一样缺乏想象力,那么为了更好地理解绘制地图

      现在更明显的是这是一对多的映射

      z=x+y -> y=z-x , x=z-y
      z=x-y -> y=x-z , x=z+y
      z=x*y -> y=z/x , x=z/y
      

      x,y 的这 3 个定义间隔也可以给出相同的 z

    2. 反函数

      返回x,y 的区间不是一个好主意,要么将g() 设为2D 函数,如x=g2d(y,z)y=g2d(x,z)

      或者您返回所有有效x,y 对的列表而不是间隔!这也可以通过您的 2D g() 函数完成

      2D示例g函数

      double g2d(double x,double z) // y=g(x,z)
       {
            if (x<a) return z-x;
       else if (x<c) return x-z;
       else          return z/x;
       }
      

      您还应该在返回之前添加计算的y 范围检查以获取有效的解决方案,但我对此太懒了。

      1D示例g函数

      void g(double *x,double *y,int &n,double z) // x[n],y[n]=g(z)   ... x,y should be allocated big enough or use some list/vector template
       {
       double xx;
       const double min =-1e+3;
       const double max =+1e+3;
       const double step=+1e-3;
       n=0; // reset found solution count
       for (xx=min;xx<=max;xx+=step) // go through valid x axis
        {      
        x[n]=xx;
        y[n]=g2d(xx,z);
        // here add check if solution valid and continue if not
        // also can add check for max n to avoid overrun of arrays x[],y[]
        n++; // add new valid solution to list
        }
       }
      

    [注释]

    所有代码都是 C++

    【讨论】:

    • 我对细节不是很细致,因为我认为读者会做出一些合理的假设。另外,您的回答只是详细说明我所说的另一种方式添加我的问题的结尾Do you simply store boundaries and corresponding return values from f and then traverse between them with the given z to find the appropriate boundaries?
    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2013-02-20
    相关资源
    最近更新 更多