1. 引入依赖库
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
  1. 定义一个类来表示二维坐标点
class Point {double x;double y;double z;Point(double x, double y, double z) {this.x = x;this.y = y;this.z = z;}double distance(Point other) {double dx = this.x - other.x;double dy = this.y - other.y;double dz = this.z - other.z;return Math.sqrt(dx * dx + dy * dy + dz * dz);}
}
  1. 定义一个类来表示克里金插值
class Kriging {List<Point> points = new ArrayList<>();double nugget;double range;double sill;Kriging(List<Point> points, double nugget, double range, double sill) {this.points = points;this.nugget = nugget;this.range = range;this.sill = sill;}double semivariance(Point p1, Point p2) {double distance = p1.distance(p2);if (distance < this.range) {return this.nugget + this.sill * (3 * distance / 2 / this.range - 1 / 2 * Math.pow(distance / this.range, 3));} else {return this.nugget + this.sill;}}double[][] buildMatrix(List<Point> points) {int n = points.size();double[][] A = new double[n][n];for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {A[i][j] = semivariance(points.get(i), points.get(j));}}return A;}double[] buildVector(List<Point> points, Point origin) {int n = points.size();double[] b = new double[n];for (int i = 0; i < n; ++i) {b[i] = semivariance(points.get(i), origin);}return b;}double solve(double[][] A, double[] b) {int n = A.length;double[] x = new double[n];Arrays.fill(x, 1);int iterMax = 100;double tol = 1e-16;double lambda = 0.001;for (int iter = 0; iter < iterMax; ++iter) {double[] r = new double[n];for (int i = 0; i < n; ++i) {double temp = 0;for (int j = 0; j < n; ++j) {temp += A[i][j] * x[j];}r[i] = b[i] - temp;}double[] s = new double[n];for (int i = 0; i < n; ++i) {double temp = 0;for (int j = 0; j < n; ++j) {temp += A[i][j] * r[j];}s[i] = temp;}double nrs = 0;double drs = 0;for (int i = 0; i < n; ++i) {nrs += r[i] * r[i];drs += s[i] * x[i];}if (nrs < tol) {break;}double mu = nrs / drs;for (int i = 0; i < n; ++i) {x[i] += lambda * mu * r[i];}}return x[n - 1];}double interpolate(Point p) {double[] b = buildVector(this.points, p);double[][] A = buildMatrix(this.points);return solve(A, b);}
}
  1. 定义一个调用示例
public static void main(String[] args) {List<Point> points = new ArrayList<>();points.add(new Point(0, 0, 1));points.add(new Point(0, 1, 2));points.add(new Point(1, 0, 4));points.add(new Point(1, 1, 8));Kriging kriging = new Kriging(points, 0, 1.5, 10);Point p = new Point(0.5, 0.5, 0);double result = kriging.interpolate(p);System.out.println(result); // 输出 3.6011398496240605
}

代码解释

这份代码实现了一个基于克里金(Kriging)算法的插值方法,用 Java 语言实现。下面对代码每个部分进行解释。

  1. 引入依赖库
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

引入需要的 Java 库,包括 ListArrays 和 ArrayList

  1. 定义一个类来表示二维坐标点
class Point {double x;double y;double z;Point(double x, double y, double z) {this.x = x;this.y = y;this.z = z;}double distance(Point other) {double dx = this.x - other.x;double dy = this.y - other.y;double dz = this.z - other.z;return Math.sqrt(dx * dx + dy * dy + dz * dz);}
}

定义一个 Point 类来表示三维空间中的一个点,包括 x,y,z 三个坐标。同时,定义了点之间的距离计算方法 distance

  1. 定义一个类来表示克里金插值
class Kriging {List<Point> points = new ArrayList<>();double nugget;double range;double sill;Kriging(List<Point> points, double nugget, double range, double sill) {this.points = points;this.nugget = nugget;this.range = range;this.sill = sill;}double semivariance(Point p1, Point p2) {double distance = p1.distance(p2);if (distance < this.range) {return this.nugget + this.sill * (3 * distance / 2 / this.range - 1 / 2 * Math.pow(distance / this.range, 3));} else {return this.nugget + this.sill;}}double[][] buildMatrix(List<Point> points) {int n = points.size();double[][] A = new double[n][n];for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {A[i][j] = semivariance(points.get(i), points.get(j));}}return A;}double[] buildVector(List<Point> points, Point origin) {int n = points.size();double[] b = new double[n];for (int i = 0; i < n; ++i) {b[i] = semivariance(points.get(i), origin);}return b;}double solve(double[][] A, double[] b) {int n = A.length;double[] x = new double[n];Arrays.fill(x, 1);int iterMax = 100;double tol = 1e-16;double lambda = 0.001;for (int iter = 0; iter < iterMax; ++iter) {double[] r = new double[n];for (int i = 0; i < n; ++i) {double temp = 0;for (int j = 0; j < n; ++j) {temp += A[i][j] * x[j];}r[i] = b[i] - temp;}double[] s = new double[n];for (int i = 0; i < n; ++i) {double temp = 0;for (int j = 0; j < n; ++j) {temp += A[i][j] * r[j];}s[i] = temp;}double nrs = 0;double drs = 0;for (int i = 0; i < n; ++i) {nrs += r[i] * r[i];drs += s[i] * x[i];}if (nrs < tol) {break;}double mu = nrs / drs;for (int i = 0; i < n; ++i) {x[i] += lambda * mu * r[i];}}return x[n - 1];}double interpolate(Point p) {double[] b = buildVector(this.points, p);double[][] A = buildMatrix(this.points);return solve(A, b);}
}

定义了 Kriging 类来表示基于克里金算法的插值计算。主要包含以下部分:

  • points 为样本点列表
  • nugget 为空间自相关函数的截距项
  • range 为空间自相关函数的半径
  • sill 为空间自相关函数的基台

同时,定义了克里金算法的几个核心方法:

  • semivariance 计算半方差函数
  • buildMatrix 构造克里金方程系数矩阵
  • buildVector 构造克里金方程右侧向量
  • solve 求解克里金方程
  • interpolate 插值方法
  1. 定义一个调用示例
public static void main(String[] args) {List<Point> points = new ArrayList<>();points.add(new Point(0, 0, 1));points.add(new Point(0, 1, 2));points.add(new Point(1, 0, 4));points.add(new Point(1, 1, 8));Kriging kriging = new Kriging(points, 0, 1.5, 10);Point p = new Point(0.5, 0.5, 0);double result = kriging.interpolate(p);System.out.println(result); // 输出 3.6011398496240605
}

在 main 函数中,定义了一个样本点列表,包含了四个空间点,然后定义了克里金插值的一些参数,包括 nuggetrange 和 sill。接着定义了一个待插值的空间点,然后调用克里金的 interpolate 方法进行插值计算,并将结果打印出来。

Kriging 克里金算法Java实现相关推荐

  1. 插值算法-克里金法(Java jk3d.jar测试过程)

    算法介绍 kriging 插值作为地统计学中的一种插值方法由南非采矿工程师D.G.Krige于1951年首次提出,是一种求最优.线形.无偏的空间内插方法. 在充分考虑观测资料之间的相互关系后,对每一个 ...

  2. [kriging](一)网上下载的kriging克里金的C++程序的初步调试

    笔者在网上下载了一份克里金的C++程序,水平有限,正在逐步地调试中. 初步 克里金法现在在许多软件都已经有集成了,据笔者所知: arcgis : 看过有的arcgis培训视频里面简略介绍了里面的插值方 ...

  3. Kriging(克里金模型)介绍

    克里金模型最早出现在地质学文献中,用来估计有价值矿物的分布.萨克斯·艾尔1989年将这种方法应用于近似的计算机实验.此后,克里格法被广泛研究并应用于工程领域. 克里格模型也称为高斯过程模型,因为它将目 ...

  4. kriging克里金插值以及前端渲染jS代码部分解释

    .html中的方法调用 //训练使用高斯过程与贝叶斯先验let variogram=kriging.train(positions.map(pos=>pos[2]),positions.map( ...

  5. (超全面,超基础)Kriging插值推导理论笔记,算法,普通克里金

    最近老师让我再重新推导一下克里金插值的方法如何求出预测结果,于是我又无数次地打开了大神的推导原理过程链接

  6. 克里金(kriging)模型的推导详解

    Kriging模型理论推导 1.前言 2.条件 3.基础知识 3.1.方差的理解 3.2.概率密度函数 3.3.多元正态分布 4.理论推导 4.1 模型建立 4.2 模型预测 1.前言 简介:Krig ...

  7. python 克里金空间插值_Python克里金(Kriging)插值计算及可视化绘制

    前面两篇推文我们分别介绍了使用Python和R进行IDW(反距离加权法) 插值的计算及结果的可视化过程,详细内容可见如下: 本期推文,我们将介绍如何使用Python进行克里金(Kriging)插值计算 ...

  8. 基于 Python(gma) 的 克里金(Kriging)法插值的主要过程

      由于克里金插值的复杂性,本文不再对其原理进行介绍.详情可自行百度. 本算法基于 Python 的开源克里金插值包 pykrige. 但本算法已对其进行改造,以使其符合 gma 的整体逻辑. 本算法 ...

  9. GEE:克里金 Kriging 空间插值(以陕西省2013年生物量为例)

    作者:CSDN @ _养乐多_ 本文记录了在Google Earth Engine(GEE)平台上进行 Kriging 插值的介绍和代码案例.本文通过选取的2013年陕西省生物量样本点数据为例,利用 ...

最新文章

  1. python游戏服务器框架_Scut游戏服务器免费开源框架--快速开发(2)
  2. ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展
  3. 十、Sumif 函数
  4. 安卓模拟器按键_安卓模拟机(夜神模拟器)
  5. 4、Power View—卡的应用
  6. 微信小程序学习笔记(五)
  7. java线性表源代码_线性表java实现之顺序存储源码
  8. 苹果秋季新品将要发布,MacBook Pro都有哪些变化
  9. Apache Kylin 部署之不完全指南
  10. T-SQL 查询、修改数据表
  11. ORACLE数据库定时任务自动停止(broken)的原因分析及解决办法
  12. 2022新版WIFI营销微信小程序源码+三级分销
  13. FreeCAD快速开始
  14. GitHub客户端上传本地代码
  15. 有限域f9的特征是多少_密码学数学基本第十一讲有限域.ppt
  16. C语言字母O和数字0怎么区分,车牌数字“0”和字母“O”究竟如何区分?看完终于弄明白了...
  17. win 10网络适配器没有无线网络连接(连不上WLAN)
  18. 入职阿里一年,年收入过百万,网友:阿里快人均百万了?
  19. 倒排表数据结构、通配符查询、拼写纠正详解
  20. 计算机控制 采样电路,计算机模拟量的采样与处理

热门文章

  1. Win10如何安装Microsoft Print to pdf打印机
  2. April 13th Monday (四月 十三日 月曜日)
  3. 厂商是怎么样查到公司在用盗版,有什么方法可以核实真假?
  4. futex wait mysql_linux内核级同步机制--futex
  5. 计算机机房新风量与换气次数设,机房为什么要装新风系统?
  6. 第十五课、用户界面与业务逻辑的分离------------------狄泰软件学院
  7. npx 有什么作用跟意义?为什么要有 npx?什么场景使用?
  8. 干货!自己的程序利用 编程猫 第三方登录获取用户token
  9. Java微信公众号消息推送
  10. 在云服务器快速搭建Docker环境