Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОМ лаб2-3 2012.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
647.68 Кб
Скачать

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;

}