给定函数的反函数

时间:2014-07-08 17:54:14

标签: algorithm math inverse

我有一个包含两个输入xy的函数,它根据某些条件(依赖于zx的值返回y )。类似于以下伪代码的东西。

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也是由您自己编写的,您知道它的一切。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  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 ???;
     }
    

    如果你缺乏像我这样的想象力,那么为了更好地理解画一张地图

    fmap

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

    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
    

    这3个定义的x,y区间也可以提供相同的z

  2. 反函数

    返回x,y的时间间隔不是一个好主意,您可以g() 2D 函数,例如x=g2d(y,z)y=g2d(x,z)。< / p>

    或者您返回所有有效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
      }
     }
    
  3. <强> [注释]

    所有代码都在C ++中