Главная страница
Навигация по странице:

  • «Московский государственный технологический университет «СТАНКИН» (ФГБОУ ВО «МГТУ «СТАНКИН»)

  • Тема: «Интерполяция непрерывной функции кубическими полиномами (кубическим сплайном дефекта 1)»

  • Постановка задачи

  • Реализация метода Гаусса

  • Исходная система 15х15: Упрощение и основная матрица

  • Решаем данную систему методом Гаусса и получаем следующие корни

  • График сплайна Подсчёт погрешности

  • вычмат лаба 2. Интерполяция непрерывной функции кубическими полиномами (кубическим сплайном дефекта 1)


    Скачать 1.69 Mb.
    НазваниеИнтерполяция непрерывной функции кубическими полиномами (кубическим сплайном дефекта 1)
    Анкорвычмат лаба 2
    Дата15.05.2022
    Размер1.69 Mb.
    Формат файлаdocx
    Имя файлаLR2.docx
    ТипЛабораторная работа
    #530577










    МИНОБРНАУКИ РОССИИ


    федеральное государственное бюджетное образовательное учреждение высшего образования

    «Московский государственный технологический университет

    «СТАНКИН»

    (ФГБОУ ВО «МГТУ «СТАНКИН»)


    Лабораторная работа №2 по дисциплине

    «Вычислительная математика»

    Тема: «Интерполяция непрерывной функции кубическими полиномами (кубическим сплайном дефекта 1)»

    Вариант №14

    Выполнил: студент группы ИДБ-19-06

    Макаров М.А.
    Преподаватель:

    Красикова Е.М.
    Москва, 2021

    Постановка задачи:

    Пусть на некотором отрезке [𝑎, 𝑏] действительной оси существует некоторая непрерывная функция y(x), значения которой известны лишь в n+1 точке данного отрезка, которые обозначим через 𝑥𝑖 , 𝑖 = , и 𝑥𝑖 = 𝑎 + 𝑖ℎ, , 𝑥0 = 𝑎, 𝑥𝑛 = 𝑏. Требуется найти для каждых двух соседних точек (узлах) 𝑥𝑖 , 𝑥𝑖+1, 𝑖 = данного отрезка кубический полином, аппроксимирующий данную функцию в каждой точке интервала (𝑥𝑖 , 𝑥𝑖+1 ), значения которого совпадают со значениями функции на концах интервала.

    Необходимо получить кубический сплайн дефекта 1 для функции cos*3(x/3) на отрезке функции [−1;1], построить график сплайна и cos*3(x/3) на одной координатной плоскости для сравнения определить погрешность построенного сплайна

    Практическая часть


    Для построения данного сплайна необходимо разредить отрезок [−1;1] на несколько равных отрезков. Пусть данный отрезок будет разделен на 5 равных отрезков. Тогда шаг такого разделения будет равен  = 0,4.





    Н
    азовем кубическим сплайном функции  , [-1;1] на сетке точек, указанных в таблице выше, функцию S(x), удовлетворяющую следующим условиям:

    Запишем полиномы Si(x) и их производные в виде:



    Возьмём первую и вторую производную нашего полинома:





    Подставим xi вместо x и получим:







    Отсюда следует, что для выполнения третьего условия в узлах интерполяции:

    , при i=1,2,3,4,5

    Требуя непрерывности сплайна в узлах xi, i = 1,2,3,4 и выполнения третьего условия при i = 0, получаем:

    , при i=1,2,3,4,5

    Или

    , при i = 1,2,3,4,5

    Второе условие относительно непрерывности первой производной сплайна в узлах xi, i = 1,2,3,4 приводит к соотношению:

    , i = 2,3,4,5.

    Аналогично, для второй производной сплайна:

    , i = 2,3,4,5.

    Дополнительные граничные условия (четвертое условие) дают последних два уравнения:





    В итоге получается система, содержащая в сумме 3*5 = 15 линейных алгебраических уравнений для отыскания 3*5 = 15 неизвестных: bi, ci, di, i = 1,2,3,4,5.

    Реализация метода Гаусса:
    #include

    #include

    #include
    using namespace std;
    int main()

    {

    setlocale(LC_ALL, "RUS");

    int i, j, n, m, k;

    float d;
    //создаем массив

    cout << "Кол-во уравнений в системе: ";

    cin >> n;

    cout << "Кол-во переменных: ";

    cin >> m;

    m += 1;

    float** matr = new float* [n];

    for (i = 0; i < n; i++)

    matr[i] = new float[m];
    //вводим элементы матрицы
    for (i = 0; i < n; i++)
    for (j = 0; j < m; j++)

    {

    cout << " Элемент " << "[" << i + 1 << " , " << j + 1 << "]: ";

    cin >> matr[i][j];

    }

    //выводим матрицу

    cout << "Матрица: " << endl;

    for (i = 0; i < n; i++)

    {

    for (j = 0; j < m; j++)

    cout << matr[i][j] << " ";

    cout << endl;

    }

    cout << endl;
    //Метод Гаусса

    //Прямой ход, приведение к верхнетреугольной матрице

    float* X = new float[m];

    for (i = 0; i < n; i++)

    {

    d = matr[i][i];

    for (j = n; j >= i; j--)

    matr[i][j] = matr[i][j] / d;

    for (j = i + 1; j < n; j++)

    {

    d = matr[j][i];

    for (k = n; k >= i; k--)

    matr[j][k] -= d * matr[i][k]; // Диагональная матрица

    }

    }
    //обратный ход

    // считаем корни
    X[n - 1] = matr[n - 1][n];

    for (i = n - 2; i >= 0; i--)

    {

    X[i] = matr[i][n];

    for (j = i + 1; j < n; j++)

    X[i] = X[i] - matr[i][j] * X[j];

    }

    //Вывод решения

    for (i = 0; i < n; i++)

    cout << "X" << i + 1 << " = " << X[i] << endl;

    cout << endl;
    delete[] matr;

    return 0;

    }

    Исходная система 15х15:


    Упрощение и основная матрица



    Решаем данную систему методом Гаусса и получаем следующие корни:
    b1 ​= 0.2092105283284274

    b2 = 0.0552631527008294

    b3 = -0.05526315270082938

    b4 = -0.2092105283284274

    b5 = -0.3078947512551961
    с1 = -0.4934211146338432

    с2 = -0.2763157635041469

    с3 = -0.2763157635041469

    с4 = -0.49342111463384336

    с5 = -4.336808689942016e-17 = 0
    d1 = -1.2335527865846057

    d2 = 0.5427633778242403

    d3 = -0.0

    d4 = -0.5427633778242417

    d5 = 1.2335527865846085
    a1 = 2.940199733523725

    a2 = 2.993335802103367

    a3 = 2.993335802103367

    a4 = 2.940199733523725

    a5 = 2.834870838944213

    Подставив данные коэффициенты в изначальное уравнение сплайна, мы получим пять сплайнов, каждый для своего диапазона











    График сплайна



    Подсчёт погрешности





    Вывод

    В данной лабораторной работе мы разобрали интерполяцию кубическим сплайном дефекта 1. Попрактиковались на предложенной функции, построили график сплайна и оценили погрешность данного метода.


    написать администратору сайта