Построение интерполяционного многочлена в форме Лагранжа.(Реализация Java)

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

Данный метод вычисляет значение функции в заданной точке используя принятые на вход множество точек и множество значений в данных точках. точках.

Реализация решения

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class LaGrang {
    public static double f(double arg, double[] x, double[] y) {
        double result = 0;
        for (int i = 0; i < x.length; i++) {
            double k = 1;
            for (int j = 0; j < y.length; j++) {
                if (j != i) {
                    k *= (arg - x[j]) / (x[i] - x[j]);
                }
            }
            result += k * y[i];
        }
        return result;
    }
}
  • Алексей

    мне кажеться или алгоритм неправильно работает?:)
    вот мой вариант:

    private static double lagranj(double arg, double[] x, double[] y) {

    double result = 0;

    for (int i = 0; i < x.length; i++) {

    double k = 1;

    for (int j = 0; j < y.length; j++) {

    if (j != i) {

    k *=x[i] — x[j];

    } else {

    k *= arg — x[j];

    }

    System.out.println(k);

    }

    System.out.println();

    result += y[i] / k;

    }

    return result;

    }

    • http://cybern.ru/ lordrp

      Ну, мне не кажется, я точно знаю, что мой алгоритм работает, а ваш нет. Например, тест
      double[] x = new double[]{1.0, 2.0, 3.0};
      double[] y = new double[]{1.0, 2.0, 3.0};
      f(4.0, x, y) Должен выдать результат 4.0, а ваш алгоритм выдает 0,6666666666

      /**

      * Created with IntelliJ IDEA.

      * User: LordRP

      * Date: 19.10.13

      * Time: 12:47

      * To change this template use File | Settings | File Templates.

      */

      public class Solution {

      public static double f(double arg, double[] x, double[] y) {

      double result = 0;

      for (int i = 0; i < x.length; i++) {

      double k = 1;

      for (int j = 0; j < y.length; j++) {

      if (j != i) {

      k *= (arg — x[j]) / (x[i] — x[j]);

      }

      }

      result += k * y[i];

      }

      return result;

      }

      public static double f2(double arg, double[] x, double[] y) {

      double result = 0;

      for (int i = 0; i < x.length; i++) {

      double k = 1;

      for (int j = 0; j < y.length; j++) {

      if (j != i) {

      k *= x[i] — x[j];

      } else {

      k *= arg — x[j];

      }

      }

      result += y[i] / k;

      }

      return result;

      }

      public static void main(String[] args) {

      double[] x = new double[]{1.0, 2.0, 3.0};

      double[] y = new double[]{1.0, 2.0, 3.0};

      System.out.println(f(4.0, x, y));

      System.out.println(f2(4.0, x, y));

      }

      }

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

  • на Delphi

  • на Java

  • на C++