当前位置:   article > 正文

反距离加权IDW

反距离加权

反距离加权IDW

理论:每个采样点对插值结果的影响随距离增加而减弱,距目标点近的样点赋予的权重较大。

应用:利用已知点数据计算需要的未知点数据,该理论以距离为参考,如果未知数据对于距离的耦合不高,可能不适用。

在IDW插值之前,得事先获取一个离散点子集,用于计算插值的权重;

比如取坐标点A1(0,2); A2(10,8); A3(20,10);A4(30,16);A5(40,25);A6(50,28).

在这里插入图片描述

插值步骤:
①计算未知点到所有点的距离;
在这里插入图片描述

② 计算每个点的权重:权重是距离的倒数的函数。
在这里插入图片描述
计算所需的数据,比如A11(1,a11),A12(2,a12)等等

#!/usr/bin/python3


def IDW( src_data, dst_data):
    #搜索最近点
    floating = []
    distance = []
    dMinIndex = 0
    dMin = 0
    d = 0
    i_index = 0
    
    for i in range(0, 6):
        d = abs(src_data[i][0] - dst_data)
        #print("d = ", d)
        if (i == 0):
            dMin = d
            dMinIndex = src_data[i][0]
            i_index = i
        else:
            if (d < dMin):
                dMin = d
                dMinIndex = src_data[i][0]
                i_index = i
                            
    if (dMin == 0):
        #完全匹配
        dst_data = src_data[i_index][1]
        print("all in 1", dMinIndex ,"data:" ,dst_data)
        return dst_data
    
    #距离平方倒数
    floating.append(src_data[i_index][1])
    distance.append(1.0/dMin)
    floatingIndex = 1

    for j in range(0, 6):   
        if(j != i_index):
            d = abs(src_data[j][0] - dst_data)
            floating.append(src_data[j][1])
            distance.append(1.0/d)
            floatingIndex = floatingIndex + 1
            
    #累加
    distanceSum = 0
    for n in range(0, floatingIndex):
        distanceSum = distanceSum + distance[n]
      
    #权重
    if(distanceSum == 0):
        #完全匹配
        dst_data = src_data[i_index][1]
        print("all in 2", dMinIndex ,"data:" ,dst_data)
    else:
        floatingDst = 0
        speedDst = 0
        for i in range(0, floatingIndex):
            distance[i] = distance[i] / distanceSum
            if (distance[i] != 0):
                floatingDst = floatingDst + floating[i] * distance[i]
            else:
                print("IDW: 0")
		
        dst_data = floatingDst

    return dst_data

number = []

number.append([0, 2])
number.append([10, 8])
number.append([20, 10])
number.append([30, 16])
number.append([40, 25])
number.append([50, 28])

num2 = []
for i in range(0, 51):
    num2.append(i)

for i in range(0, 51):
    num2[i] = IDW(number, num2[i])

for i in range(0, 51):
    print("cal ", i, " data:", num2[i])

input("按下 enter 键后退出。")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

打印
all in 1 0 data: 2
all in 1 10 data: 8
all in 1 20 data: 10
all in 1 30 data: 16
all in 1 40 data: 25
all in 1 50 data: 28
cal 0 data: 2
cal 1 data: 4.1625722105839476
cal 2 data: 5.721906846316942
cal 3 data: 6.869896029454955
cal 4 data: 7.7173512428846385
cal 5 data: 8.329157175398631
cal 6 data: 8.740222088507196
cal 7 data: 8.96100368424269
cal 8 data: 8.973908680381335
cal 9 data: 8.713698806343224
cal 10 data: 8
cal 11 data: 8.910305720132655
cal 12 data: 9.60778859527121
cal 13 data: 10.167058794250753
cal 14 data: 10.616850179388843
cal 15 data: 10.965189873417721
cal 16 data: 11.205857504928192
cal 17 data: 11.31666939906999
cal 18 data: 11.248967330078859
cal 19 data: 10.897028586954129
cal 20 data: 10
cal 21 data: 11.132639147385538
cal 22 data: 12.006830309498397
cal 23 data: 12.750355516137276
cal 24 data: 13.414519056261344
cal 25 data: 14.021739130434783
cal 26 data: 14.580036297640655
cal 27 data: 15.087009004404493
cal 28 data: 15.52785485592316
cal 29 data: 15.864696432419723
cal 30 data: 16
cal 31 data: 16.18999897195644
cal 32 data: 16.583552384528726
cal 33 data: 17.105395006160325
cal 34 data: 17.73134328358209
cal 35 data: 18.45886075949367
cal 36 data: 19.300012371644193
cal 37 data: 20.28321917283733
cal 38 data: 21.463649007459857
cal 39 data: 22.951972208040708
cal 40 data: 25
cal 41 data: 23.23278045371821
cal 42 data: 22.35959190500084
cal 43 data: 21.976169464806013
cal 44 data: 21.922870740112685
cal 45 data: 22.135535307517088
cal 46 data: 22.599123633236417
cal 47 data: 23.333552499095546
cal 48 data: 24.394501060119005
cal 49 data: 25.887094525454405
cal 50 data: 28

从上看,可以算出想要的点的数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/306009
推荐阅读
相关标签
  

闽ICP备14008679号