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

Узнай цену своей работы

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

Помогите, пожалуйста. Функция f=sin(x) задана таблично. Вычислить значение интерполяционного многочлена Ньютона для интерполирования назад в точке x=0.15, сравнить его со значением функции f(x) в данной точке. Узлы интерполирования приведены в таблице:
x0 x1 x2 x3 x4
0 0.05 0.1 0.2 0.25
Интерполяционный многочлен Ньютона для случая неравноотсоящих узлов записывается с применением разделённых разностей. Пусть функция f задана на (связном) множестве X, и фиксированы попарно различные точки Тогда разделённой разностью нулевого порядка функции f в точке xj называют значение f(xj), а разделённую разность порядка k для системы точек определяют через разделённые разности порядка (k-1) по формуле в частности, Обычно разделённые разности записывают в виде таблицы (пример для 5 узлов интерполяции):
  Порядок разделённых разностей
  0 1 2 3 4
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.

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

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.

Объяснение кода листинга программы

  1. Объявлены константы и типы переменных — m = 4 - количество узлов интерполяции — arr = array [0..m] of extended - массив для хранения узлов интерполяции — x = (0, 0.05, 0.1, 0.2, 0.25) - узлы интерполяции — xp = 0.15 - целевая точка — f = array of extended - разделённые разности — i, k = integer - счётчики для циклов — p, sx = extended - интерполяционный многочлен Ньютона и sin(x)
  2. Вычисление разделённых разностей порядка 0 — Цикл for i := 0 to m выполняет вычисление разделённых разностей порядка 0 для всех узлов интерполяции — f[i] = sin(x[i])
  3. Вычисление разделённых разностей порядка k — Цикл for k := 1 to m выполняет вычисление разделённых разностей порядка k для всех узлов интерполяции — Цикл for i := 0 to m — k выполняет вычисление разделённых разностей порядка k для всех узлов интерполяции — f[i] = (f[i + 1] — f[i]) / (x[i + k] — x[i])
  4. Вычисление интерполяционного многочлена Ньютона по схеме Горнера — p = f[0] — Цикл for i := 1 to m выполняет вычисление интерполяционного многочлена Ньютона по схеме Горнера — p = p * (xp — x[i]) + f[i]
  5. Печать результатов — Выводится значение интерполяционного многочлена Ньютона — Выводится значение sin(xp) — Выводится ошибка интерполяционного многочлена Ньютона (разница между p и sx)
  6. Ввод/вывод данных — Введены значения для узлов интерполяции (x) — Вычислены значения разделённых разностей порядка 0 (f) — Вычислены значения интерполяционного многочлена Ньютона (p) — Вычислены значения sin(x) (sx) — Выведена ошибка интерполяционного многочлена Ньютона (p — sx)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы