package com.ahtsoft.mesher.job;
import Jama.Matrix;
/**
* @Title:克里金插值算法
* @Description:参考西南石油大学硕士论文《空间插值技术的开发与实现》颜慧敏2005.4;
* @Copyright:Copyright (c) 2011
* @Company: micromulti
* @File name: KrigingCore.java
* @Author: 赵敬和
* @Create DateTime: Mar 12, 2012 3:44:04 PM
* @Version: 1.0.0
* @Others:
*/
public class KrigingCore {
/**
* @param x
* x坐标
* @param y
* y坐标
* @param z
* 已知数据的属性值,即对它进行差值
* @param X
* 网格标识x的坐标
* @param Y
* 网格标识y的坐标 既X、Y组成网格点的点的坐标
* @return 插完值的数组,既各个网格点的数据
*/
public double[][] gridData(double[] x, double[] y, double[] z,
double[][] X, double[][] Y) {
int xLength = x.length;
int xSize = X.length;
int ySize = X[0].length;
double[][] data = new double[xLength + 1][xLength + 1];
double[][] data2 = new double[xSize][ySize];
for (int i = 0; i <= xLength; i++) {
for (int j = 0; j <= xLength; j++) {
if ((i < xLength) && (j < xLength)) {
if (i != j) {
data[i][j] = Math.sqrt((x[i] - x[j]) * (x[i] - x[j])
+ (y[i] - y[j]) * (y[i] - y[j]));
} else {
data[i][j] = 0.0001;
}
} else if ((i == xLength) || (j == xLength)) {
data[i][j] = 1;
}
if (i == xLength && j == xLength) {
data[i][j] = 0;
}
}
}
//矩阵的初始化
Matrix m = new Matrix(data);
//矩阵转秩
Matrix mMatrix = m.inverse();
for (int i = 0; i < xSize; i++) {
for (int j = 0; j < ySize; j++) {
double[] rData = new double[xLength + 1];
for (int k = 0; k <= xLength; k++) {
if (k < xLength) {
rData[k] = Math.sqrt((X[i][j] - x[k])
* (X[i][j] - x[k]) + (Y[i][j] - y[k])
* (Y[i][j] - y[k]));
} else {
rData[k] = 1;
}
}
double[] rDa = new double[xLength + 1];
for (int k = 0; k < (xLength + 1); k++) {
for (int k2 = 0; k2 < (xLength + 1); k2++) {
rDa[k] += mMatrix.get(k, k2) * rData[k2];
}
}
for (int k = 0; k < xLength; k++) {
data2[i][j] += z[k] * rDa[k];
}
}
}
return data2;
}
// 变差函数,克里金算法特有的函数
public double function(double h) {
double r = 0;
if (h == 0) {
r = 0;
} else if (h > 0 && h <= 8.35) {
r = 2.048 + 1.154 * ((3 * h * h * h * h) / (4 * 8.535 * 8.535 * 8.535 * 8.535));
} else {
r = 3.202;
}
return r;
}
}
评论6