我有一个包含两个输入x
和y
的函数,它根据某些条件(依赖于z
和x
的值返回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
也是由您自己编写的,您知道它的一切。
注意:假设返回值始终不同,并且在任何情况下都没有任何重叠
答案 0 :(得分:1)
您首先要查看每个条件。如果它们满足条件的最小值,则x和y的值是多少。例如,如果x和y分别仅略小于a和b,则等式x + y将能够满足z。那将是x + y大于z。如果没有那么就没有任何方法可以排除任何小于当前x和y的数字。然后你可以进入下一个条件,依此类推。如果x和y的值可以满足条件,那么您将从较低的边界开始并迭代该范围内的可能值,或者使用代数来解决它。
答案 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 ???;
}
如果你缺乏像我这样的想象力,那么为了更好地理解画一张地图
现在更明显的是这是一对多映射
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
值
反函数
返回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
}
}
<强> [注释] 强>
所有代码都在C ++中