Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 Вычислительная математика практика 01-08.pdf
Скачиваний:
17
Добавлен:
05.06.2015
Размер:
550.13 Кб
Скачать

Затем в цикле по столбцам j к сумме прибавляется элемент уравнения k по схеме: B = B + Akj × X[Rj]. Цикл по столбцам j производится по значениям от N – 1 до k + 1.

После цикла по строкам вычисляется корень k: X[Rk] = AkN – B / Akk.

Варианты СЛАУ

См. задание № 5.

Практическое задание №8. Интерполяционный многочлен Лагранжа

Краткое описание задания: заданы N точек некоторой известной функции вида f(x). Вычислить интерполяционный многочлен Лагранжа и значение функции в произвольной точке.

Методические указания

1.Программа ничего не принимает с клавиатуры. Все исходные данные задаются в коде программы, как правило, в основном модуле, во время вызова функции метода (внутри функции main).

2.Программа решает задачу одним способом.

3.Название модуля (файла типа .h) для функции метода mlagran.

4.Название функции метода lagran.

5.Сигнатура функции метода для способа 1 имеет следующий вид:

double lagran(int N, double X0[], double Y0[], double X);

Здесь:

-N — число точек минус 1;

-X0 — массив значений xi;

-Y0 — массив значений y=f(xi);

-X — искомая точка.

Функция метода возвращает вычисленное значение интерполируемой точки X.

6. В основной функции вызывается вспомогательная функция, называе-

мая далее функцией вычислений. Функция вычислений производит вычис-

ление точек, вызов функции метода и вывод результатов.

Порядок выполнения задания

1. Сначала выполните действие 1, описанное выше в разделе «Общий порядок выполнения очередного (не первого) задания».

43

2.Добавьте в решение новый модуль типа .h (заголовочный) с названием mlagran. Процесс добавления нового модуля описан в практическом задании №1.

3.Добавьте в новый модуль файловый комментарий, например:

/* Файл lagran.h

*/

/* ОТИ НИЯУ МИФИ

*/

/* 1ПО-XXД

*/

/* Пономарев Владимир Вадимович

*/

/* Вычислительная математика

*/

/* Программа VM1

*/

/*

Интерполяционный многочлен Лагранжа */

/*

22.04.2013

*/

4. Добавим описание константы (число точек), массивы для значений точек и значений функции в этих точках, а также функцию, которая используется для интерполяции:

//Число точек

#define NOL 5

//Значения X double XOL[NOL];

//Значения Y double YOL[NOL];

//интерполируемая функция (тангенс) double flagran(double x) {

return tan(x);

}

5.Добавим вспомогательную функцию, которая будет вычислять i-тый полином Лагранжа li(x):

//Вычисляет i-тый полином l[i](x)

double ilagran(int N, double X0[], double X, int i) { double L = 1.0, a = 0.0;

return L;

}

6. Добавим функцию метода:

/* Вычисляет значение функции в точке X многочленом Лагранжа */ double lagran(int N, double X0[], double Y0[], double X) {

double Y = 0.0, a = 0.0; return Y;

}

7.Добавим функцию вычислений:

//Производит вычисления

void s_lagran() {

printf("***** Lagrange method *****\n\n");

}

44

8. Перейдем в основной модуль VM1.cpp.

Вызовем функцию вычислений в основной функции:

void _tmain() { s_lagran();

}

9. Возвращаемся в модуль mlagran.h.

В функции вычислений вычислим значения точек X0 и значения вычисляемой функции Y0 в этих точках. Одновременно вычислим точное значение функции в точке 0,75 и вычисленное значение:

void s_lagran() {

printf("***** Lagrange method *****\n\n");

int i = 0; XOL[i] = -1.5;

for (i = 1; i < NOL; i++ ) { XOL[i] = XOL[i - 1] + 0.75;

}

for (i = 0; i < NOL; i++ ) { YOL[i] = flagran(XOL[i]);

}

double x = 0.75;

// точное значение функции в точке x

printf("Exact:

f(%0.4f)=%0.4f\n\n", x, flagran(x));

// вычисленное

значение функции в точке x

double y = lagran(NOL, XOL, YOL, x); printf("Calculated: f(%0.4f)=%0.4f\n\n", x, y);

}

10. Описываем вычисление i-того многочлена Лагранжа по формуле (функция ilagran):

li (x) = N 1 x x j

j=0, ji xi x j

Заметим, что вычисление произведения начинается со значения, равного единице. Значением произведения является переменная L, которая возвращается функцией. Переменная a предназначена для вычисления значения одного элемента произведения (xxj)/(xi xj).

11. Описываем вычисление функции по формуле (функция lagran):

N 1

f(x) = f (xi )li (x)

i=0

Заметим, что вычисление суммы начинается со значения, равного нулю. Значением суммы является переменная Y, которая является результатом вычислений.

45