python实现梯度距离平方反比法GIDS

1 梯度距离平方反比法

梯度距离平方反比法(gradient plus inverse distance squared (GIDS))由Nalder和Wein于1988年提出,是一种考虑了气象要素随经纬度和海拔高度变化的反距离权重法,其空间插值计算公式如下:

在这里插入图片描述

式中:

  • z z z 表示代插点的估算值
  • z i z_i zi 为第 i i i 个样本点的实测值
  • d i d_i di 为第 i i i 个样本点与待插点之间的距离
  • n n n 为参与计算的实测样本点个数
  • x 、 y 、 e x、y、e xye 分别为待插点的经度、纬度和海拔高度
  • x i 、 y i 、 e i x_i、y_i、e_i xiyiei 分别为第 i i i 个样本点的经度、纬度和海拔高度
  • C x , C y , C e C_x,C_y,C_e Cx,Cy,Ce 分别为站点气象要素值与经度、纬度和海拔高度的偏回归系数,其值直接决定各样本点的插值权重,通过建立样本点的气象要素值与其经纬度和海拔高度的多元线性回归模型,利用最小二乘估计法对这3个系数进行求解,回归模型如下:

在这里插入图片描述

式中:

  • z i ^ \hat{z_i} zi^ 表示第 i i i 个样本点的气象要素估计值
  • C 0 C_0 C0 为回归常数
2 基于经验气温垂直递减率的梯度距离平方反比法

由上可知,样本点气象要素值与经纬度和海拔高度的关系直接决定空间插值的效果。

对气温进行空间插值时,当样本点海拔与待插值点之间的海拔相差较小时,可以得到准确度较高的插值结果; 但当研究区位于地形起伏剧烈区域时,待插值点与样本点的海拔高度差异较大,此时得到的偏回归系数 C x , C y , C e C_x,C_y,C_e Cx,Cy,Ce 不能准确描述待插值点气温与经纬和海拔高度的关系,所得插值误差就会较大,无法满足应用需求。

基于经验气温垂直递减率的改进梯度距离平方反比法 GIDS-EAR,考虑到海拔高度对气温的影响规律与经纬度不同,将海拔与经纬度的影响分开考虑:

  • 首先根据气温垂直递减率经验值确定气温与海拔高度的偏回归系数 C e C_e Ce
  • 并对样本点气温值 z i z_i zi 进行修正得到 z m i z_{mi} zmi,消除由于海拔的差异对气温值的影响
  • 再将 z m i z_{mi} zmi 代入多元线性回归模型,作为模型最小二乘求解的样本点气温的初值,解算得到气温与经纬度的偏回归系数 C x , C y C_x,C_y Cx,Cy
  • 再依据 GIDS 插值公式计算待插值点的温度值

GIDS-EAR 方法详细步骤如下:

  1. C e C_e Ce 的确定: 考虑到海拔高度对气温的影响相较于经纬度更具有规律性,气温与海拔高度的偏回归系数与样本站点区域的气温垂直递减率接近,不同于 GIDS 法的线性回归求解,本文以气温垂直递减率的经验值 T g T_g Tg 作为各样本点气温值与海拔的偏回归系数 C e C_e Ce,即 C e = T g C_e=T_g Ce=Tg;

  2. C x 、 C y C_x、C_y CxCy 的求解: 由于第一步中已经考虑海拔高度对待插点气温的影响,故建立只考虑经纬度的多元线性回归模型,相应地,各样本点的气温值也应进行修正以消除海拔的影响, 如下:

在这里插入图片描述

式中: z ^ m i \hat{z}_{mi} z^mi 为修正后第 i i i 个样本点的气温估值。样本点气温修正值 z m i z_{mi} zmi 的计算方法为:
在这里插入图片描述

  1. 将上述所得 C x , C y , C e C_x,C_y,C_e Cx,Cy,Ce 代入式 (1) 中,求得基于经验气温垂直递减率的 GIDS 插值结果。
3 python实现

这是按自己理解复现的代码,感觉不是很对,效果不是很好,仅供参考。


from sklearn.cross_decomposition import PLSRegression

"""类函数"""
class GIDS:
    def __init__(self, x, y, elev, z, Tg=None):
        self.x, self.y, self.elev, self.z = x, y, elev, z
        self.Tg= Tg
        if Tg is None:
            feature = np.c_[x, y, elev]
        else:
            feature = np.c_[x, y]
        self.pls = PLSRegression(n_components=2)
        self.pls.fit(feature, z)

            
    def fit(self, x_new, y_new, elev_new):
        if self.Tg is None:
            feature_new = np.c_[self.x-x_new, self.y-y_new, self.elev-elev_new]
            z_new = self.pls.predict(feature_new)
        else:
            feature_new = np.c_[self.x-x_new, self.y-y_new]
            z_new = self.pls.predict(feature_new)+self.Tg*(self.elev-elev_new)

        di = (self.x-x_new)**2+(self.y-y_new)**2
        z = np.sum((self.z+z_new)/di)/np.sum(1/di)
        return z 


"""demo"""
import numpy as np
import matplotlib.pyplot as plt

# create sample points with structured scores
X1 = 10 * np.random.rand(1000, 2) -5
elev = np.random.randint(1, 100, 1000)

def func(x, y, z):
    return np.sin(x**2 + y**2+ z**2) / (x**2 + y**2 + z**2)

z1 = func(X1[:,0], X1[:,1], elev)

# 'train'
gids = GIDS(X1[:,0], X1[:,1], elev, z1)


# 'test'
spacing = np.linspace(-5., 5., 100)
X2 = np.meshgrid(spacing, spacing)
grid_shape = X2[0].shape
X2 = np.reshape(X2, (2, -1)).T
elev2 = np.random.randint(1, 100, X2.size//2)
z2 = []
for x2,y2, elev in zip(X2[:,0],X2[:,1], elev2):
    z2.append(gids.fit(x2, y2, elev))
z2 = np.array(z2)

# plot
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, sharex=True, sharey=True, figsize=(10,3))
ax1.contourf(spacing, spacing, func(*np.meshgrid(spacing, spacing), elev2.reshape(100,100)))
ax1.set_title('Ground truth')
ax2.scatter(X1[:,0], X1[:,1], c=z1, linewidths=0)
ax2.set_title('Samples')
ax3.contourf(spacing, spacing, z2.reshape(grid_shape))
ax3.set_title('Reconstruction')
plt.show()

在这里插入图片描述

参考:一种适用于气温空间插值的改进梯度距离平方反比法*.李框宇等.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/153940.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试,你一定要知道的知识

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

Mybatis的Mapper接口传递多个参数的时候必须要加@Param注解吗?

答案是&#xff1a;不一定&#xff0c;取决于mybatis的版本、jdk的版本和javac的编译选项。 测试代码 Maven依赖&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId>…

手把手教你搭建属于自己的快递小程序

在数字化时代&#xff0c;小程序已经成为各行各业连接用户、提供服务、创造价值的重要工具。其中&#xff0c;快递寄件小程序因其实用性和广泛的需求&#xff0c;成为很多企业和开发者关注的焦点。本文将详细介绍如何快速创建快递寄件小程序&#xff0c;以及如何利用它实现盈利…

UI设计是什么意思?一文给你讲清楚

随着互联网的快速发展&#xff0c;用户界面UI设计在中国也逐渐发展&#xff0c;用户界面UI设计的目的不仅是让用户&#xff0c;有视觉享受&#xff0c;而且解决用户如何与互联网设备交互&#xff0c;因此&#xff0c;用户界面UI设计是通过用户使用习惯、操作逻辑、界面交互和视…

非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)

题目环境&#xff1a; 没错&#xff0c;又是我&#xff0c;这群该死的黑客竟然如此厉害&#xff0c;所以我回去爆肝SQL注入&#xff0c;这次&#xff0c;再也没有人能拿到我的flag了 做了好多这个作者出的题了&#xff0c;看来又要上强度了 判断注入类型 username&#xff1a;a…

【下载器】NDM和IDM介绍(含安装包和教程)

1 IDM&#xff08;增强型下载管理器&#xff09; 1.1 IDM介绍 官网&#xff1a;Internet Download Manager (IDM) 优缺点&#xff1a; 高速下载&#xff1a; IDM通过多线程下载和分段下载技术&#xff0c;能够显著提高下载速度&#xff0c;从而节省用户的时间。暂停和恢复功…

线程的面试八股

Callable接口 Callable是一个interface,相当于给线程封装了一个返回值,方便程序猿借助多线程的方式计算结果. 代码示例: 使用 Callable 版本,创建线程计算 1 2 3 ... 1000, 1. 创建一个匿名内部类, 实现 Callable 接口. Callable 带有泛型参数. 泛型参数表示返回值的类型…

2023年第九届数维杯国际大学生数学建模挑战赛

2023年第九届数维杯国际大学生数学建模挑战赛正在火热进行&#xff0c;小云学长又在第一时间给大家带来最全最完整的思路代码解析&#xff01;&#xff01;&#xff01; D题解题思路如下&#xff1a; 完整版解题过程及代码&#xff0c;稍后继续给大家分享~ 更多题目完整解析点…

002 OpenCV dft 傅里叶变换

目录 一、傅里叶变换 1.1 傅里叶变换概念 1.2 opencv中傅里叶变换 二、实验代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、傅里叶变换 2.1 傅里叶变换概念 傅里叶变换&#xff08;Fourier Transform&#xff09;是一种…

CSAPP第四章:Y86 SEQ(指令顺序执行)的硬件结构

SEQ硬件结构的抽象表示。 程序计数器放在寄存器中(左下角&#xff0c;起点)。先向上&#xff0c;再向右 取指&#xff1a;将程序计数器寄存器作为地址&#xff0c;指令存储器读取一个指令的字节&#xff0c;PC增加器计算valP(程序计数器增加后的值)。 解码&#xff1a;寄存器…

openGauss学习笔记-125 openGauss 数据库管理-设置账本数据库-校验账本数据一致性

文章目录 openGauss学习笔记-125 openGauss 数据库管理-设置账本数据库-校验账本数据一致性125.1 前提条件125.2 背景信息125.3 操作步骤 openGauss学习笔记-125 openGauss 数据库管理-设置账本数据库-校验账本数据一致性 125.1 前提条件 数据库正常运行&#xff0c;并且对防…

创建一个用户test且使用testtab表空间及testtemp临时表空间并授予其权限,密码随意

文章目录 1、连接到数据库2、创建表空间创建testtab表空间创建testtemp临时表空间 3、创建用户4、授予权限5、测试 1、连接到数据库 sqlplus / as sysdba2、创建表空间 创建testtab表空间 CREATE TABLESPACE testtab DATAFILE /u01/app/oracle/oradata/orcl/testtab.dbf S…

【Spring】bean的基础配置

bean的别名 当在Spring config文件中定义name作为别名后&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

关于 Git 你了解多少?

1. 什么是Git? Git 是一个版本控制系统&#xff0c;由林纳斯托瓦兹创建。它旨在管理项目代码的更改&#xff0c;以便团队成员可以协作开发和维护代码库。Git 可以让用户跟踪代码的更改、回滚错误的更改、合并代码等。Git 还具有分支和标签的功能&#xff0c;使得团队成员可以在…

个人简历管理系统winform

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#winform架构和sql server数据库 功能模块&#xff1a; 个人简历管理系统 简历信息添加 修改 删除 查询简历 运行环境&#xff1a; 运行需vs2013或者以上版本&#xff0…

Mistral 7B 比Llama 2更好的开源大模型 (三)

Mistral 7B 比Llama 2更好的开源大模型 Mistral 7B是一个70亿参数的语言模型,旨在获得卓越的性能和效率。Mistral 7B在所有评估的基准测试中都优于最好的开放13B模型(Llama 2),在推理、数学和代码生成方面也优于最好的发布34B模型(Llama 1)。Mistral 7B模型利用分组查询注…

Linux(1):开始

计算机组成概述 计算机&#xff1a;接受用户输入指令与数据&#xff0c;经由中央处理器的数学与逻辑单元处理后&#xff0c;以产生或存储有用的信息。 主要可以分为3个部分&#xff1a;输入单元、主机单元、输出单元。 中央处理器&#xff08;Central Processing Unit, CPU&a…

Linux | 进程间通信

目录 前言 一、进程间通信的基本概念 二、管道 1、管道的基本概念 2、匿名管道 &#xff08;1&#xff09;原理 &#xff08;2&#xff09;测试代码 &#xff08;3&#xff09;读写控制相关问题 a、读端关闭 b、写端关闭 c、读快写慢 d、读慢些快 &#xff08;4&a…

【JUC】九、线程池ThreadPool

文章目录 1、线程池2、分类3、线程池的使用4、工作流程5、拒绝策略6、线程池的七个参数7、自定义线程池8、什么时候考虑使用线程池&#xff1f; 1、线程池 线程池和数据库连接池的理念很相似&#xff0c;对于数据库连接池&#xff1a;普通的连接数据库是建立一个JDBC连接&…

目标检测一 SSD代码复现

SSD 背景 这是一种 single stage 的检测模型&#xff0c;相比于R-CNN系列模型上要简单许多。其精度可以与Faster R-CNN相匹敌&#xff0c;而速度达到了惊人的59FPS&#xff0c;速度上完爆 Fster R-CNN。 速度快的根本原因在于移除了 region proposals 步骤以及后续的像素采样或…