Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные / Лаба4

.docx
Скачиваний:
7
Добавлен:
13.07.2022
Размер:
123.36 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

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

Уфимский Государственный Авиационный Технический Университет

Кафедра ВМиК

Лабораторная работа №4

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

по теме: «Применение экстраполяции для ускорения сходимости последовательностей»

Выполнил:

ст. гр. ИВТ-2

Проверил:

профессор каф. ВМиК

Шерыхалина Н.М.

Уфа 2022

Лабораторная работа №4

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

Цель работы:

Ознакомление с методами экстраполяции, методами оценки погрешности с помощью экстраполяции, методами уточнения результатов численного эксперимента.

Выбранный метод экстраполяции: метод Ромберга.

Код программы:

#include <iostream>

#include <cmath>

#include <math.h>

#include <Windows.h>

#include <iomanip>

using namespace std;

double factor(double j)

{

double c;

c = 1;

for (int i = 1; i <= 2 * log2(j); i++)

{

c = c * i;

}

return c;

}

double factorial(double n, double k, double B)

{

double a, b, c, d;

a = 1;

b = 1;

c = 1;

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

{

a = a * i;

}

for (int i = 1; i <= k + 1; i++)

{

b = b * i;

}

for (int i = 1; i <= n - k; i++)

{

c = c * i;

}

d = a / (b * c) * B;

return d;

}

double upSum(double j)

{

double alpha = 1.1;

double a = 1.1 * 2.1;

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

{

a = a * (alpha + i * 2);

}

return a;

}

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int n, k, num;

double fact, ze, alpha, sum, sum2, as;

alpha = 1.1;

ze = 10.5844484649508098;

num = 0;

sum = 0;

sum2 = 0;

n = 35;

double* Bernulli = new double[n];

double* zn = new double[n];

double* zn1 = new double[n];

double* zn2 = new double[n];

Bernulli[0] = 1;

for (num = 1; num <= 37; num++)

{

for (k = 1; k <= num; k++)

{

fact = factorial(num, k, Bernulli[num - k]);

sum = sum + fact;

}

if ((num > 1) && (num % 2 == 1))

Bernulli[num] = 0;

else

Bernulli[num] = -1 / (num + 1.0) * sum;

sum = 0;

}

zn[0] = ze - 1 / (alpha - 1.0) / pow(2, alpha - 1) + 1 / 2.0 / pow(2, alpha) - alpha / 12.0 / pow(2, 2.1);

for (int i = 1; i <= 16; i++)

{

zn[i] = ze - 1 / (alpha - 1.0) / pow(pow(2, i + 1), alpha - 1) + 1 / 2.0 / pow(pow(2, i + 1), alpha) - alpha / 12.0 / pow(pow(2, i + 1), 2.1) + upSum(i) / factor(2 * i + 2) * Bernulli[2 * i + 2] / pow(pow(2, i + 1), alpha + (2 * i + 1));

}

zn1[0] = zn[0];

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

{

zn1[i] = zn[i] + (zn[i] - zn[i - 1]) / (pow(2, 0.1) - 1);

}

zn2[0] = zn[0];

zn2[1] = zn[1];

for (int i = 2; i <= n; i++)

{

zn2[i] = zn1[i] + (zn1[i] - zn1[i - 1]) / (pow(2, 1.1) - 1);

}

cout << setw(6) << "N" << "| " << setw(8) << "zn - z" << "|" << setw(8) << "zn-zn1" << "|"

<< setw(12) << "zn1-z" << "|" << setw(11) << "delta" << "|" << setw(12) << "zn2-z" << "|" << setw(12) << "delta1" << "|" << endl;

cout << "_____________________________________________________________________________" << endl;

cout << setw(6) << pow(2, 1) << "| " << setw(8) << zn[0] - ze << "|" << setw(8) << "_" << "|" << setw(12) << "_" << "|" << setw(11) << "_" << "|" << setw(12) << "_" << "|" << setw(12) << "_" << "|" << endl;

for (int i = 1; i <= 16; i++)

{

if (i == 1)

cout << setw(6) << pow(2, i + 1) << "| " << setw(8) << zn[i] - ze << "|" << setw(8) << zn[i] - zn1[i] << "|"

<< setw(12) << zn1[i] - ze << "|" << setw(11) << (zn1[i] - ze) / (zn[i] - ze) << "|" << setw(12) << "_" << "|" << setw(12) << "_" << "|" << endl;

else

cout << setw(6) << pow(2, i + 1) << "| " << setw(8) << zn[i] - ze << "|" << setw(8) << zn[i] - zn1[i] << "|"

<< setw(12) << zn1[i] - ze << "|" << setw(11) << (zn1[i] - ze) / (zn[i] - ze) << "|" << setw(12) << zn2[i] - ze << "|" << setw(12) << (zn2[i] - ze) / (zn1[i] - ze) << "|" << endl;

}

return 0;

}

Результат работы программы:

А) Б)

Рисунок 1 – Результаты эксраполяции данных, полученных при удвоении числа слагаемых, с помощью метода Ромберга: А) – сравнение с эталоном;

Б) – оценки по правилу Рунге

Вывод: в ходе лабораторной работы было рассмотрено применение экстраполяции для ускорения сходимости последовательностей, был реализован метод Ромберга в виде программного алгоритма.

Соседние файлы в папке Лабораторные