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

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

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

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

[cc lang=»java» lines=»-1″]
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; } } [/cc]

  • Алексей

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

    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;

    }

    • Ну, мне не кажется, я точно знаю, что мой алгоритм работает, а ваш нет. Например, тест
      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++