Интерполяция функции, заданной таблицей значений кубическими сплайнами (реализация Java)

Java   7 января 2012  Автор статьи:  

Программа вычисляет значения кубических сплайнов в заданных точках, используя принятое на вход множество точек и множество значений в данных точках.

public class Splayn {

public SplineTuple[] splines ; // Сплайн

// Построение сплайна
// x - узлы сетки, должны быть упорядочены по возрастанию, кратные узлы запрещены
// y - значения функции в узлах сетки
// n - количество узлов сетки
public void BuildSpline(double[] x, double[] y, int n) {
// Инициализация массива сплайнов
splines = new SplineTuple[n];
for(int i=0;i 0; --i)
splines[i].c = alpha[i] * splines[i + 1].c + beta[i];

// Освобождение памяти, занимаемой прогоночными коэффициентами
beta = null;
alpha = null;

// По известным коэффициентам c[i] находим значения b[i] и d[i]
for (int i = n - 1; i > 0; --i) {
double h_i = x[i] - x[i - 1];
splines[i].d = (splines[i].c - splines[i - 1].c) / h_i;
splines[i].b = h_i * (2.0 * splines[i].c + splines[i - 1].c) / 6.0 + (y[i] - y[i - 1]) / h_i;
}
}

// Вычисление значения интерполированной функции в произвольной точке
public double f(double x) {

SplineTuple s;
int n= splines.length;
//BuildSpline(myx,y,n);
if (x <= splines[0].x) // Если x меньше точки сетки x[0] - пользуемся первым эл-тов массива s = splines[1]; else if (x >= splines[n - 1].x) // Если x больше точки сетки x[n - 1] - пользуемся последним эл-том массива
s = splines[n - 1];
else // Иначе x лежит между граничными точками сетки - производим бинарный поиск нужного эл-та массива
{
int i = 0, j = n - 1;
while (i + 1 < j) { int k = i + (j - i) / 2; if (x <= splines[k].x) j = k; else i = k; } s = splines[j]; } double dx = (x - s.x); // Вычисляем значение сплайна в заданной точке по схеме Горнера (в принципе, "умный" компилятор применил бы схему Горнера сам, но ведь не все так умны, как кажутся) return s.a + (s.b + (s.c / 2.0 + s.d * dx / 6.0) * dx) * dx; } } public class SplineTuple { public double a, b, c, d, x; }

  • Ivan

    Большое спасибо!

  • Max Petrov

    Спасибо!!!

  • Recod

    Все работает. Спасибо!

Научиться программировать

  • на Delphi

  • на Java

  • на C++