Составить программу , используя интерполяционный многочлен Ньютона - Free Pascal

Формулировка задачи:

Помогите, пожалуйста. Функция f=sin(x) задана таблично. Вычислить значение интерполяционного многочлена Ньютона для интерполирования назад в точке x=0.15, сравнить его со значением функции f(x) в данной точке. Узлы интерполирования приведены в таблице:
x0x1x2x3x4
00.050.10.20.25
Теория: интерполяционная формула Ньютона для неравноотсоящих узлов
Интерполяционный многочлен Ньютона для случая неравноотсоящих узлов записывается с применением разделённых разностей. Пусть функция f задана на (связном) множестве X, и фиксированы попарно различные точки Тогда разделённой разностью нулевого порядка функции f в точке xj называют значение f(xj), а разделённую разность порядка k для системы точек определяют через разделённые разности порядка (k-1) по формуле в частности, Обычно разделённые разности записывают в виде таблицы (пример для 5 узлов интерполяции):
 Порядок разделённых разностей
 01234
x0
x1
x2
x3
x4
f(x0)
f(x1)
f(x2)
f(x3)
f(x4)
f(x0; x1)
f(x1; x2)
f(x2; x3)
f(x3; x4)
f(x0; x1; x2)
f(x1; x2; x3)
f(x2; x3; x4)
f(x0; x1; x2; x3)
f(x1; x2; x3; x4)
f(x0; x1; x2; x3; x4)
С помощью разделённых разностей функции f для узлов (x0, ..., xn) можно записать как интерполяционный многочлен Ньютона «вперёд»: так и интерполяционный многочлен Ньютона «назад»: Преимущества интерполяционного многочлена Ньютона:
  1. для вычислений разделённых разностей требуется действий (деления), что меньше, чем в других алгоритмах;
  2. вычислять значения интерполяционного многочлена можно по схеме Горнера за O(n) действий (умножения);
  3. хранения требуют (n+1) узел и (n+1) разность, причём разности можно хранить (получить) в тех же ячейках, где были заданы значения f(xk), поскольку этот многочлен использует только верхнюю("вперёд") или только нижнюю ("назад") строку таблицы разделённых разностей, хотя для вычисления этой строки необходимы и все остальные элементы таблицы;
  4. по сравнению с интерполяционным многочленом Лагранжа упрощено добавление нового узла.
Хотя обе формулы ("вперёд" и "назад") по всем параметрам равноценны, целесообразно применять ту, для которой меньше разность между точкой интерполяции и точкой, в которой в конечной формуле вычисляется разделённая разность нулевого порядка, то есть, "вперёд", если x ближе к x0, и "назад", если x ближе к xn.

Код к задаче: «Составить программу , используя интерполяционный многочлен Ньютона - Free Pascal»

textual
const m = 4;
type arr = array [0..m] of extended;
const x: arr = (0, 0.05, 0.1, 0.2, 0.25); //узлы интерполяции
      xp: extended = 0.15; //целевая точка
var f: arr; //разделённые разности
    i, k: integer; //счётчик, порядок разделённых разностей
    p, sx: extended; //Pn(x), sin(x)
begin
  for i := 0 to m do f[i] := sin(x[i]); //вычисление разделённых разностей порядка 0
  for k := 1 to m do //цикл по порядкам разделённых разностей
    for i := 0 to m - k do //цикл вычисления всех разделённых разностей порядка k
      f[i] := (f[i + 1] - f[i]) / (x[i + k] - x[i]); //вычисление разделённой разности порядка k
  //вычисление интерполяционного многочлена Ньютона по схеме Горнера
  p := f[0];
  for i := 1 to m do p := p * (xp - x[i]) + f[i];
  //печать результатов
  writeln('  P(', xp:0:2, ') = ', p:20:17);
  sx := sin(xp);
  writeln('sin(', xp:0:2, ') = ', sx:20:17);
  writeln('   Ошибка = ', p - sx:20:17);
  readln
end.

12   голосов, оценка 4.167 из 5


СОХРАНИТЬ ССЫЛКУ