Лабораторные / Лаба4
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
Уфимский Государственный Авиационный Технический Университет
Кафедра ВМиК
Лабораторная работа №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 – Результаты эксраполяции данных, полученных при удвоении числа слагаемых, с помощью метода Ромберга: А) – сравнение с эталоном;
Б) – оценки по правилу Рунге
Вывод: в ходе лабораторной работы было рассмотрено применение экстраполяции для ускорения сходимости последовательностей, был реализован метод Ромберга в виде программного алгоритма.