Вариант_12_—_ИДЗ_3
.docИДЗ №3 | Варианта №12
Построить интерполяционный многочлен Лагранжа по пяти данным узлам (xi,yi), i=1.5
Вариант 12
i |
xi |
yi |
1 |
-2 |
3 |
2 |
-1 |
1 |
3 |
0 |
-4 |
4 |
1 |
2 |
5 |
2 |
0 |
Рисунок 1
Листинг кода программы:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <conio.h>
float x[5] = { -2.0, -1.0, 0.0, 1.0, 2.0 };
float y[5] = { 3.0, 1.0, -4.0, 2.0, 0.0 };
x - аргумент
n - степень многочлена или число x - ов
i - номер узла
float L(float xp, int n, int i)
{
float Chesl;
float Znam;
Chesl = 1; Znam = 1;
int k;
вычисление числителя
for (k = 0; k != n; k++)
{
if (k == i) continue;
Chesl *= xp - x[k];
}
вычисление знаменателя
for (k = 0; k != n;k++)
{
if (x[i] == x[k]) continue;
Znam *= x[i] - x[k];
}
return Chesl / Znam;
}
int main(int argc, char* argv[])
{
вычисление степени многочлена
int n = sizeof(y) / sizeof(float);
float R = 0;
произвольная точка для проверки
float px = 1.5; // X1=-2.0, X2=-1.0, X3=0.0, X4=1.0, X5=2.0
for (int i = 0; i != n; i++)
{
R += y[i] * L(px, n, i);
}
printf("Result: %f ", R);
_getch();
return 0;
}
Рисунок 2 – Проверка в точке i=1 (X1 = -2.0)
Рисунок 3 – Проверка в точке i=2 (X2 = -1.0)
Рисунок 4 – Проверка в точке i=3 (X3 = 0.0)
Рисунок 5 – Проверка в точке i=4 (X4 = 1.0)
Рисунок 6 – Проверка в точке i=5 (X5 = 2.0)
Рисунок 7 – Проверка в произвольной точке 1.5