
- •Содержание
- •2 Интерполяция 1
- •3 Численные методы интегрирования 11
- •3.1 Цель работы 11
- •3.3 Задание на лабораторную работу 14
- •3.5 Индивидуальные задания 16
- •2.2.2 Сплайн-интерполяция
- •2.3 Задание на лабораторную работу
- •2.4 Пример выполнения задания
- •2.4.1 Построение интерполяционного многочлена
- •2.4.2 Программная реализация вычисления интерполяционного полинома
- •2.4.3 Построение сплайн-полинома
- •2.4.4 Программная реализация вычисления сплайн-полинома
- •2.5 Описание графического модуля
- •2.6 Индивидуальные задания
- •3.2.2 Составные формулы интегрирования
- •3.2.3 Схема Ромберга
- •3.2.4 Формулы Гаусса
- •3.3 Задание на лабораторную работу
- •3.4 Пример выполнения задания
- •3.4.1 Интегрирование по схеме Ромберга
- •3.4.2 Интегрирование по формуле Гаусса-Чебышева
- •3.5 Индивидуальные задания
- •Литература
2.4.2 Программная реализация вычисления интерполяционного полинома
Построив
"вручную" многочлен третьей степени,
необходимо программно реализовать
вычисление интерполяционных многочленов
третьей, шестой и девятой степеней.
При этом не требуется
явное вычисление коэффициентов этих
многочленов. Достаточно написать
функции, способные вычислить
,
и
для входного параметра x.
2.4.3 Построение сплайн-полинома
Составим систему уравнений (2.9):
, . (2.9)
. (2.14)
Пусть
по условию задачи известны краевые
условия:
,
.
Добавим к системе (2.14) еще два уравнения,
сформированные согласно (2.10(а)):
, (2.10(а))
(2.15)
Решаем систему уравнений (2.14)-(2.15):
(2.16)
Остальные коэффициенты сплайн-многочленов (2.7) рассчитываются согласно (2.8). Результат представлен в табл. 2.4.
Табл. 2.4 – Коэффициенты сплайн-многочленов
k |
0 |
1 |
2 |
Интервал |
[0, 2] |
[2, 4] |
[4, 6] |
|
-0.0135 |
0.0035 |
-0.0005 |
|
0.0245 |
0.0135 |
-0.0035 |
|
0.3040 |
0.1860 |
0.1520 |
|
-0.0980 |
-0.3040 |
-0.1860 |
2.4.4 Программная реализация вычисления сплайн-полинома
Необходимо программно реализовать вычисление кусочной сплайн-функции, т.е. многочленов (2.7) с коэффициентами, вычисленными аналогично табл. 2.4. Должна быть одна функция с входным параметром x, который может принимать любые значения на интервале [a, b] (в рассмотренном примере таким интервалом был [0, 6]).
2.5 Описание графического модуля
Для проверки правильности расчетов и работоспособности написанных программ необходимо воспользоваться модулем Lab1.dll (написан на С++ под MS Visual Studio 2005). Модуль содержит реализацию "истинных" функций, по которым генерировались задания, а также функцию Interp, реализующую проверку заданий и визуализацию. Она имеет следующий прототип:
// myProc -- тип данных "указатель на функцию" с прототипом Interp
typedef int(*myProc)(int, double (*)(double),
double (*)(double), double (*)(double), double (*)(double));
Первый параметр – номер варианта. Остальные параметры – пользовательские функции, реализующие вычисление интерполяционных многочленов. Все эти функции должны принимать входной параметр x типа double и возвращать вычисленное значение (также типа double). Вызов функции Interp может иметь вид, например,
Interp(var, fun3, fun6, fun9, fsp);
где функции fun3, fun6, fun9, fsp удовлетворяют прототипу double fun3(double);
и реализуют вычисление , , и сплайна соответственно.
Для частичной проверки задания можно при вызове Interp указывать NULL вместо недостающих пользовательских функций.
Для динамической загрузки dll-модуля используется функция LoadLibrary, а затем для получения указателя на нужную функцию этого модуля вызывается GetProcAddress. После чего функцию можно вызывать по полученному указателю. Хорошим стилем является выгрузка библиотеки после её использования. Для этого используется функция FreeLibrary.
Пример главной функции:
int main(int argc, char* argv[]) {
// Загрузим библиотеку
HMODULE hHide = LoadLibrary(L"Lab1.dll");
if(hHide == NULL) {
MessageBox(NULL,L"LoadLibrary() error",NULL,MB_OK|MB_ICONERROR);
return -1;
}
// Получим адрес функции int Interp(...); и поместим его в переменную pFunc
myProc pFunc =(myProc) GetProcAddress(hHide, "Interp");
if(pFunc == NULL) {
MessageBox(NULL,L"Function Interp(...) is not found",NULL,MB_OK);
FreeLibrary(hHide);
return -1;
}
// Вызовем функцию
std::cout<<"Prepare to call\n";
pFunc(0,prim3, prim6, prim9, prims);
MessageBox(NULL,L" Everything is working ",L"Mathematics + DLL",MB_OK);
FreeLibrary(hHide);
return 0;
}