
- •Соглашения
- •Общие замечания
- •Порядок выполнения первого задания
- •Общий порядок выполнения очередного (не первого) задания
- •Признак успешности выполнения алгоритма
- •Практическое задание №1. Метод половинного деления
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №2. Метод простых итераций
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №3. Метод Ньютона
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №4. Метод секущих
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №5. Метод простых итераций (СЛАУ)
- •Методические указания
- •Порядок выполнения задания
- •Варианты СЛАУ
- •Практическое задание №6. Метод Зейделя (СЛАУ)
- •Методические указания
- •Порядок выполнения задания
- •Варианты СЛАУ
- •Практическое задание №7. Метод Гаусса (СЛАУ)
- •Методические указания
- •Порядок выполнения задания
- •Варианты СЛАУ
- •Практическое задание №8. Интерполяционный многочлен Лагранжа
- •Методические указания
- •Порядок выполнения задания
Затем в цикле по столбцам 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, j≠i xi x j
Заметим, что вычисление произведения начинается со значения, равного единице. Значением произведения является переменная L, которая возвращается функцией. Переменная a предназначена для вычисления значения одного элемента произведения (x–xj)/(xi –xj).
11. Описываем вычисление функции по формуле (функция lagran):
N −1
f(x) = ∑f (xi )li (x)
i=0
Заметим, что вычисление суммы начинается со значения, равного нулю. Значением суммы является переменная Y, которая является результатом вычислений.
45