Kriging 克里金算法Java实现

这篇具有很好参考价值的文章主要介绍了Kriging 克里金算法Java实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  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 方法进行插值计算,并将结果打印出来。文章来源地址https://www.toymoban.com/news/detail-666629.html

到了这里,关于Kriging 克里金算法Java实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python也可以使用克里金插值算法吗?

          挪威大陆架的声学压缩慢度测量的空间变化 在处理地质和岩石物理数据时,我们通常希望了解这些数据在我们的地区是如何变化的。我们可以做到这一点的方法之一是对我们的实际测量值进行网格化,并推断这些值。 进行这种外推的一种特殊方法是 克里金法, 这是一

    2024年02月10日
    浏览(23)
  • 回归克里格、普通克里格插值在ArcGIS中的实现

      本文介绍基于 ArcMap 软件,实现 普通克里格 、 回归克里格 方法的空间插值的具体操作。 目录 1 背景知识准备 2 回归克里格实现 2.1 采样点与环境变量提取 2.2 子集要素划分 2.3 异常值提取 2.4 土壤有机质含量经典统计学分析 2.5 回归方程求取 2.6 残差提取 2.7 残差普通克里

    2024年02月09日
    浏览(23)
  • Python 站点数据插值到格点 反距离权重插值 克里金法 径向基函数(RBF)插值

    假设:彼此距离较近的事物要比彼此距离较远的事物更相似。当为任何未测量的位置预测值时,反距离权重法会采用预测位置周围的测量值与距离预测位置较远的测量值相比,距离预测位置最近的测量值对预测值的影响更大。反距离权重法假定每个测量点都有一种局部影响,

    2024年02月05日
    浏览(71)
  • 【数据结构】用Java实现七大排序算法

    目录 🌷1. 排序的概念及引用 1.1 排序的概念 1.2 衡量指标 1.2 十个排序算法  1.3 十个排序性能对比 🌷2. 冒泡排序 2.1 算法描述 2.2 动图 ⭐️代码优化 🌷3. 选择排序 3.1 算法描述 3.2 动图  3.3 代码 🌷4. 插入排序 4.1 算法描述 4.2 动图  4.3 代码 🌷5 希尔排序 5.1 描述 5.2 动图  

    2023年04月23日
    浏览(39)
  • 【算法与数据结构】Java实现查找与排序

    也叫做折半查找,属于有序查找算法。 前提条件 :数组数据必须有序,从小到大,或者从大到小都是可以的。 如果是无序的,也可以先进行排序。 但是排序之后,会改变原有数据的顺序,查找出来元素位置跟原来的元素可能是不一样的,所以排序之后再查找只能判断当前数

    2024年01月19日
    浏览(38)
  • 【一起学数据结构与算法】Java实现双链表

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 打印双链表非常简单,只需要单独创一个结点

    2024年02月22日
    浏览(34)
  • 数据结构与算法中的七大排序(Java实现)

    目录 一、直接插入排序 二、希尔排序 三、直接选择排序 四、堆排序 五、冒泡排序 六、快速排序 七、归并排序               定义i下标之前的元素全部已经有序 ,遍历一遍要排序的数组,把i下标前的元素全部进行排序,当遍历玩这个数组后,就已经排好序了。        

    2024年02月06日
    浏览(43)
  • 【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)

    🍃 数据结构是 计算机 存储 、 组织 数据的方式 🎉 线性 结构 线性表(数组、链表、栈、队列、哈希表) 🎉 树形 结构 二叉树 AVL 树 红黑树 B 树 堆 Trie 哈夫曼树 并查集 🎉 图形 结构 邻接矩阵 邻接表 🎁 线性表是具有 n 个 相同类型元素 的有限 序列 (n = 0) a1 是首节点

    2024年02月10日
    浏览(63)
  • 深入理解Java线程池ThreadPoolExcutor实现原理、数据结构和算法(源码解析)

    什么是线程池?         线程池主要是为了解决执行新任务执行时,应用程序为减少为任务创建一个新线程和任务执行完毕时销毁线程所带来的开销。通过线程池,可以在项目初始化时就创建一个线程集合,然后在需要执行新任务时重用这些线程而不是每次都新建一个线

    2024年02月07日
    浏览(34)
  • 数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。

    最短路径的算法有两个, Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解决的是 单源 最短路径问题 。 Floyd算法解决的是 多源 最短路径问题,并且可以处理负权图 。 今天要讲的就是Dijkstra算法。 加: feng--Insist (大写的i),进java交流群讨论互联网+技术。可索要PPT等资料。 其他资料

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包