RBF = {
function RBF(points, values, distanceFunction, normFunction, epsilon) {
let epsilon_ = epsilon;
const M = numeric.identity(points.length);
const M_ = Matrix.eye(points.length);
for (let j = 0; j < points.length; j++) {
for (let i = 0; i < points.length; i++) {
M[j][i] = normFunction(points[i], points[j]);
M_.set(j, i, normFunction(points[i], points[j]));
}
}
if (epsilon === undefined) {
epsilon = numeric.sum(M) / (Math.pow(points.length, 2) - points.length);
epsilon_ = sumM(M_) / (Math.pow(points.length, 2) - points.length);
}
for (let j = 0; j < points.length; j++) {
for (let i = 0; i < points.length; i++) {
M[j][i] = distanceFunction(M[j][i], epsilon);
M_.set(j, i, distanceFunction(M_.get(j, i), epsilon_));
}
}
let valuesByDimension = new Array(2);
for (let i = 0; i < 2; i++) {
valuesByDimension[i] = values.map((value) => value[i]);
}
let w = new Array(2);
let w_ = new Array(2);
const LU = numeric.LU(M);
for (let i = 0; i < 2; i++) {
w[i] = numeric.LUsolve(LU, valuesByDimension[i]);
w_[i] = mlMatrix.solve(M_, Matrix.columnVector(valuesByDimension[i]));
}
function interpolant(p) {
let distances = new Array(points.length);
for (let i = 0; i < points.length; i++) {
distances[i] = distanceFunction(normFunction(p, points[i]), epsilon);
}
const distances_ = new Matrix(distances.map((d) => [d]));
let sums = new Array(2);
let sums_ = new Array(2);
for (let i = 0; i < 2; i++) {
sums[i] = numeric.sum(numeric.mul(distances, w[i]));
sums_[i] = sumM(mulM(distances_, w_[i]));
}
return sums_;
}
interpolant.weights = w_;
return interpolant;
}
return RBF;
}