没有人知道如何做一个"反向"三线性插值?
-
21-08-2019 - |
题
三线性插值近似值的一点(x、y、z)内部一个立方体使用价值的立体折点。我试着去做一个"反向"三线性插值。知道的价值观的立体折点和价值附有一点我怎样才能找到(x、y、z)?任何帮助将受到高度赞赏。谢谢你!
解决方案
正在求解给定的1个数据的3个未知数,并且如使用的是线性内插你的答案通常是一个平面(2个自由变量)。根据不同的立方体可能没有解决方案或3D解空间。
我将执行以下操作。令v为初始值。对于每个立方体的外观的12个边(一对相邻顶点)的“边缘”,以查看是否1个顶点是> = v和其他<= V - 调用此跨越V时边缘
如果没有边交叉V,则没有可能的解决方案。
否则,对于跨越V,如果两个顶点的边缘等于V,那么整个边缘为溶液每个边缘。否则,线性内插的边缘发现具有V的值的点因此,假设边缘是(X1,Y1,Z1) - > V1 <= V <=(X2,Y2,Z2) - >。V2
s = (v-v1)/(v2-v1)
(x,y,z) = (s*(x2-x1)+x1, (s*(y2-y1)+y1, s*(z2-z1)+z1)
这会给你等于v所有边缘点这是一个解决方案,但可能你想要一个内部的解决方案 - 要知道,如果有一个内部的解决方案总是会有一个边缘的解决方案。
如果你想要的内部溶液,然后只取任何点线性边缘溶液之间 - 如你线性内插,则结果也将是V
其他提示
我不知道你可以为所有的情况。例如使用三线性滤波颜色,其中在每一个点的每种颜色(C)是相同意味着无论你插值到您仍都会得到C返回的颜色。在这种情况下,任何的X,Y,Z可能是有效的。这样就不可能说用于确定什么初始插补值均
我敢肯定,一些情况下,你可以扭转数学,但是,我想,有太多太多的情况下,这是不可能不知道更多的输入信息的事情。
祝你好运,我希望有人会证明我错了:)
的 维基百科页三线性插值 已经链接到 美国航天局的网页 据称描述了反转过程-你有看吗?
为你描述它的问题有些不明确。结果 什么你问的基本上转化为这样的:我有3D功能,我知道它在8个已知点的值。我想知道什么是在收到价值五,功能点点击 麻烦的是,在最大似然存在这样的点,这使得一组的表面上,线或点,这取决于数据的无限数量。结果 找到这组的一种方法是使用ISO-浮出水面算法如移动立方体的。
让我们从 2d 开始:想想在正方形上的双线性山丘上,高度为0 10 20 30,在4个角落,水平飞机在高度z处切下山丘。从 0 角到 30 角画一条线(无论是相邻角还是对角线)。对于任何Z,飞机都必须切割这条线,因此所有点X,Y,Z都落在这条线上,对吗?唔。
好吧,有很多解决方案——任何 z 平面都以轮廓曲线切割山。说我们希望解决方案在整个山丘上散布,即同时最小化两件事:
- 垂直距离 z - bilin(x,y),
- 从 x,y 到正方形中某个点的距离。
Scipy.optimize.leastsq 是实现此目的的一种方法,示例代码如下;三线性类似。
(同时优化任何两件事需要任意权衡或权重:食物对比金钱、工作对比玩 ...比照。 有限理性 )
""" find x,y so bilin(x,y) ~ z and x,y near the middle """
from __future__ import division
import numpy as np
from scipy.optimize import leastsq
zmax = 30
corners = [ 0, 10, 20, zmax ]
midweight = 10
def bilin( x, y ):
""" bilinear interpolate
in: corners at 0 0 0 1 1 0 1 1 in that order (binary)
see wikipedia Bilinear_interpolation ff.
"""
z00,z01,z10,z11 = corners # 0 .. 1
return (z00 * (1-x) * (1-y)
+ z01 * (1-x) * y
+ z10 * x * (1-y)
+ z11 * x * y)
vecs = np.array([ (x, y) for x in (.25, .5, .75) for y in (.25, .5, .75) ])
def nearvec( x, vecs ):
""" -> (min, nearest vec) """
t = (np.inf,)
for v in vecs:
n = np.linalg.norm( x - v )
if n < t[0]: t = (n, v)
return t
def lsqmin( xy ): # z, corners
x,y = xy
near = nearvec( np.array(xy), vecs )[0] * midweight
return (z - bilin( x, y ), near )
# i.e. find x,y so both bilin(x,y) ~ z and x,y near a point in vecs
#...............................................................................
if __name__ == "__main__":
import sys
ftol = .1
maxfev = 10
exec "\n".join( sys.argv[1:] ) # ftol= ...
x0 = np.array(( .5, .5 ))
sumdiff = 0
for z in range(zmax+1):
xetc = leastsq( lsqmin, x0, ftol=ftol, maxfev=maxfev, full_output=1 )
# (x, {cov_x, infodict, mesg}, ier)
x,y = xetc[0] # may be < 0 or > 1
diff = bilin( x, y ) - z
sumdiff += abs(diff)
print "%.2g %8.2g %5.2g %5.2g" % (z, diff, x, y)
print "ftol %.2g maxfev %d midweight %.2g => av diff %.2g" % (
ftol, maxfev, midweight, sumdiff/zmax)