三线性插值近似值的一点(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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top