gpt4 book ai didi

python - 如何在 Python 中执行双线性插值

转载 作者:IT老高 更新时间:2023-10-28 20:36:31 26 4
gpt4 key购买 nike

我想使用 python 执行双线性插值。
我要为其插入高度的示例 gps 点是:

B = 54.4786674627
L = 17.0470721369

使用已知坐标和高度值的四个相邻点:

n = [(54.5, 17.041667, 31.993), (54.5, 17.083333, 31.911), (54.458333, 17.041667, 31.945), (54.458333, 17.083333, 31.866)]

z01    z11

z
z00 z10

这是我的原始尝试:
import math
z00 = n[0][2]
z01 = n[1][2]
z10 = n[2][2]
z11 = n[3][2]
c = 0.016667 #grid spacing
x0 = 56 #latitude of origin of grid
y0 = 13 #longitude of origin of grid
i = math.floor((L-y0)/c)
j = math.floor((B-x0)/c)
t = (B - x0)/c - j
z0 = (1-t)*z00 + t*z10
z1 = (1-t)*z01 + t*z11
s = (L-y0)/c - i
z = (1-s)*z0 + s*z1

其中 z0 和 z1
z01  z0  z11

z
z00 z1 z10

我得到 31.964,但从其他软件我得到 31.961。
我的脚本正确吗?
你能提供另一种方法吗?



2022 年编辑:
我要感谢所有在这个问题发表十多年后给出新答案的人。

最佳答案

这是一个您可以使用的可重用函数。它包括文档测试和数据验证:

def bilinear_interpolation(x, y, points):
'''Interpolate (x,y) from values associated with four points.

The four points are a list of four triplets: (x, y, value).
The four points can be in any order. They should form a rectangle.

>>> bilinear_interpolation(12, 5.5,
... [(10, 4, 100),
... (20, 4, 200),
... (10, 6, 150),
... (20, 6, 300)])
165.0

'''
# See formula at: http://en.wikipedia.org/wiki/Bilinear_interpolation

points = sorted(points) # order points by x, then by y
(x1, y1, q11), (_x1, y2, q12), (x2, _y1, q21), (_x2, _y2, q22) = points

if x1 != _x1 or x2 != _x2 or y1 != _y1 or y2 != _y2:
raise ValueError('points do not form a rectangle')
if not x1 <= x <= x2 or not y1 <= y <= y2:
raise ValueError('(x, y) not within the rectangle')

return (q11 * (x2 - x) * (y2 - y) +
q21 * (x - x1) * (y2 - y) +
q12 * (x2 - x) * (y - y1) +
q22 * (x - x1) * (y - y1)
) / ((x2 - x1) * (y2 - y1) + 0.0)

您可以通过添加运行测试代码:

if __name__ == '__main__':
import doctest
doctest.testmod()

在您的数据集上运行插值会产生:

>>> n = [(54.5, 17.041667, 31.993),
(54.5, 17.083333, 31.911),
(54.458333, 17.041667, 31.945),
(54.458333, 17.083333, 31.866),
]
>>> bilinear_interpolation(54.4786674627, 17.0470721369, n)
31.95798688313631

关于python - 如何在 Python 中执行双线性插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8661537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com