Консультация № 159227
30.01.2009, 19:48
0.00 руб.
0 1 1
Здравствуйте! Помогите решить задание.

Для функции, заданной в таблице построить интерполяционный многочлен и найти приближенное значение функции при данном значении аргумента. Составить блок - схему алгоритма и программу на одном из языков высокого уровня для вычисления значения функции. Хранение значений функции, заданной таблично, организовать в виде линейною списка.
Для функции заданной таблицей
Хi |0,12 | -3,48 | -4,45 | -6,19 | 1,1 | -3,81 | 0,84 | -2,08 | -1,28 | 5,44 |
Yi |82,16| 61,02 | 44,56 | 82,52 | 99,17 | 70,24 | 63,23 | 66,48 | 48,35 | 40,24 |

построить интерполяционный многочлен Ньютона и вычислить по нему приближенно значение функции в точке х=-4,32

Проблемма в том что я незнаю как найти приблеженное значение.
Начинаю методом половинного деления (a+b)/2, а дальше что-то не получается.
Подскажите пожайлуста. Заранее благодарю

Обсуждение

давно
Посетитель
7438
7205
30.01.2009, 22:53
общий
это ответ
Здравствуйте, Грибанов Фёдор!
Метод половинного деления, увы, к интерполяционному многочлену Ньютона не имеет никакого отношения...
Мне изучать численные методы приходилось аж 25 лет назад... Давненько это было...
Ничего, вспомним молодость...
Как известно, интерполяционный многочлен Ньютона задается формулой
Ln(X) = f(X0)+(X-X0)f(X0,X1)+(X-X0)(X-X1)f(X0,X1,X2)+...+(X-X0)(X-X1)...(X-Xn-1)f(X0,X1,...,Xn)
где f(X0,...,Xn)=Sum(i=0,...n)(f(Xi)/((Xi-X0)...(Xi-Xi-1)(Xi-Xi+1)...(Xi-Xn)))
Более подробно теорию смотрим, например, здесь
Осталось только запрограммировать. Требуемая программа в приложении. Программа небольшая, разберетесь.
Таблицы X и Y задал в виде массивов.


Приложение:
//Ln(X) = f(X0)+(X-X0)f(X0,X1)+(X-X0)(X-X1)f(X0,X1,X2)+...+(X-X0)(X-X1)...(X-Xn-1)f(X0,X1,...,Xn)
//f(X0,...,Xn)=Sum(i=0,...n)(f(Xi)/((Xi-X0)...(Xi-Xi-1)(Xi-Xi+1)...(Xi-Xn)))
#include <stdio.h>

void main(void)
{
const int n = 10;
double Xi[n] = { 0.12, -3.48, -4.45, -6.19, 1.1, -3.81, 0.84, -2.08, -1.28, 5.44};
double Yi[n] = {82.16, 61.02, 44.56, 82.52, 99.17, 70.24, 63.23, 66.48, 48.35, 40.24};
double X = -4.32;
double f, LN, XXX, XX=1.;
int i, j, k;

for (i=1, LN=Yi[0]; i<n; i++)
{
XX *= (X-Xi[i-1]);
for (j=0,f=0; j<=i; j++)
{
for (k=0,XXX=1.; k<=i; k++)
{
if (k!=j)
XXX *= Xi[j]-Xi[k];
}
f += Yi[j]/XXX;
}
LN += XX * f;
}
printf("Y[X] = %g\n",LN);
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа