我有一些函数,它将一些输入映射到输出。输出是一个复数。我真正感兴趣的是反函数。但由于这种反演不能以分析方式完成,我需要用数值近似来完成。
由于的计算成本很高,我的想法是使用查找表方法。我可以使用维度生成一个2D查找表(正向查找表),但我实际需要的是此查找表的反转 - 根据给定的产生。
对于查找表的反转,我能想到的最简单的方法是使用正向查找表的条目作为顶点,并在规则网格中插入它们,产生反向查找表。如果反向查找表对于所需的精度要大,我将生成粗表并使用这些值作为优化算法的起始值。有没有比我更容易的方法?
,为常量且,为。
答案 0 :(得分:2)
f(x,y)
您可以使用f(x,y)->(a,b)
2D LUT(查找表)
但是存储的网格点必须选择得如此密集,以便每个网格矩形最多有一个凹凸,否则插值将无法正常工作。
如果要使用线性插值,则局部最小值/最大值必须是LUT内的点,对于更高阶的多项式插值,并不总是需要。我会使用4 point cubic interpolation
如何计算g(a,b)->(x,y)
(x,y)
个点返回相同的(a,b)=f(x,y)
?f
是否起作用?如果f
不起作用,那么你遇到了问题,你无法解决这个问题,除非以某种方式将范围细分为f
功能的子范围,然后你必须选择合适的范围根据一些规则,取决于你想做什么。因此,假设f
是函数
那么如何计算(x,y)=g(a,b)
?
f(x,y)=(a,b)
我会从结果的近似开始。因此,请在整个范围内尝试足够的(x,y)
值,并将最近的点存储到所需的输出,以使|f(x,y)-(a,b)|
最小化。
然后重新开始,但不是全范围,而是围绕这一点而不是
(a(t),y(t))
并且需要逆3D点(a0,y0,z0)
你可以在那里使用我的近似类近似的嵌套如下所示:
int n=5; // recursions
double e; // Error Of Solution Variable
approx ax,ay;
// min max step
for (ax.init(-100.0,+100.0,10.0,n,&e);!ax.done;ax.step())
for (ay.init(-100.0,+100.0,10.0,n,&e);!ay.done;ay.step())
{
e=|f(ax.a,ay.a)-(a,b)|;
}
// here (ax.a,ay.a) should hold your solution for input point `(a,b)`
g(a,b)
形状太复杂,那么这可能无法正常工作从这里你可以计算逆LUT表......
10
,因此明智地选择n
。对于2D和奇点,这个表现并不差O((log(N))^2)
。我在3D O((log(N))^3)
上执行此操作,每100
次计算e
点,这很慢(大约35秒)
N=(10^n)*(max-min)/step
和n
是递归次数step/(10^n)