Лабораторные / Лаба3
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
Уфимский Государственный Авиационный Технический Университет
Кафедра ВМиК
Лабораторная работа №3
по дисциплине «Вычислительная математика»
МЕТОДЫ ЧИСЛЕННОГО ИНТЕГРИРОВАНИЯ ФУНКЦИЙ
Выполнил:
ст. гр. ИВТ-
Проверила:
профессор каф. ВМиК
Шерыхалина Н.М.
Уфа 2022
1 Цель работы
Ознакомление с методами численного интегрирования, с понятием порядка точности численного метода, а также со способами контроля численных результатов.
2 Выполнение работы
Алгоритм численного интегрирования функции f(x)= с использованием квадратурной формулы параболы, представленный в виде программы, написанной на языке C++ показан ниже.
#include <iostream>
#include <cmath>
#include <math.h>
#include <Windows.h>
#include <iomanip>
using namespace std;
int main()
{
setlocale(LC_ALL, ".1251");
double eps, M4, c, h, a, b, fxi, fxih, integral, Jh, Jh2, Jh4;
int n, k, i, j, times;
a = 0; b = 1.5; n = 2; k = 4; eps = 0.000001;
M4 = 0.1031750855569;
c = M4 / 2880;
double* kdelta = new double[16];
double* exact = new double[16];
double* rynge = new double[16];
double* theor = new double[16];
kdelta[0] = 0;
for (times = 0; times < 2; times++)
{
integral = -1.747010831659769;
for (i = 0; i < 16; i++)
{
h = (b - a) / n;
theor[i] = c * pow(h, k);
n = n * 2;
}
n = 2;
for (i = 0; i < 16; i++)
{
fxi = 0; fxih = 0;
h = (b - a) / n;
double* x = new double[n];
for (j = 0; j < n; j++)
{
x[j] = a + j * h;
}
for (j = 1; j < n; j++)
{
fxi = fxi + pow(x[j], 1.0 / 3) * sqrt(1 + pow(x[j], 2));
}
for (j = 0; j < n; j++)
{
fxih = fxih + pow(x[j] + h / 2, 1.0 / 3) * sqrt(1 + pow(x[j] + h / 2, 2));
}
exact[i] = abs(integral) - abs(h / 6 * ((pow(a, 1.0 / 3) * sqrt(1 + pow(a, 2)) + pow(b, 1.0 / 3) * sqrt(1 + pow(b, 2)) + 2 * fxi + 4 * fxih)));
n = n * 2;
}
n = 4;
for (i = 1; i < 16; i++)
{
fxi = 0; fxih = 0;
h = (b - a) / n;
double* x = new double[n];
for (j = 0; j < n; j++)
{
x[j] = a + j * h;
}
for (j = 1; j < n; j++)
{
fxi = fxi + pow(x[j], 1.0 / 3) * sqrt(1 + pow(x[j], 2));
}
for (j = 0; j < n; j++)
{
fxih = fxih + pow(x[j] + h / 2, 1.0 / 3) * sqrt(1 + pow(x[j] + h / 2, 2));
}
Jh = h / 6 * ((pow(a, 1.0 / 3) * sqrt(1 + pow(a, 2)) + pow(b, 1.0 / 3) * sqrt(1 + pow(b, 2)) + 2 * fxi + 4 * fxih));
fxi = 0; fxih = 0;
double* y = new double[2 * n];
for (j = 0; j < 2 * n; j++)
{
y[j] = a + j * (h / 2);
}
for (j = 1; j < 2 * n; j++)
{
fxi = fxi + pow(y[j], 1.0 / 3) * sqrt(1 + pow(y[j], 2));
}
for (j = 0; j < 2 * n; j++)
{
fxih = fxih + pow(y[j] + (h / 2) / 2, 1.0 / 3) * sqrt(1 + pow(y[j] + (h / 2) / 2, 2));
}
Jh2 = (h / 2) / 6 * ((pow(a, 1.0 / 3) * sqrt(1 + pow(a, 2)) + pow(b, 1.0 / 3) * sqrt(1 + pow(b, 2)) + 2 * fxi + 4 * fxih));
fxi = 0; fxih = 0;
double* z = new double[4 * n];
for (j = 0; j < 4 * n; j++)
{
z[j] = a + j * (h / 4);
}
for (j = 1; j < 4 * n; j++)
{
fxi = fxi + pow(z[j], 1.0 / 3) * sqrt(1 + pow(z[j], 2));
}
for (j = 0; j < 4 * n; j++)
{
fxih = fxih + pow(z[j] + (h / 4) / 2, 1.0 / 3) * sqrt(1 + pow(z[j] + (h / 4) / 2, 2));
}
Jh4 = (h / 4) / 6 * ((pow(a, 1.0 / 3) * sqrt(1 + pow(a, 2)) + pow(b, 1.0 / 3) * sqrt(1 + pow(b, 2)) + 2 * fxi + 4 * fxih));
kdelta[i] = (Jh2 - Jh) / (Jh4 - Jh2);
n = n * 2;
}
n = 1;
for (i = 0; i < 16; i++)
{
fxi = 0; fxih = 0;
h = (b - a) / n;
double* x = new double[n];
for (j = 0; j < n; j++)
{
x[j] = a + j * h;
}
for (j = 1; j < n; j++)
{
fxi = fxi + pow(x[j], 1.0 / 3) * sqrt(1 + pow(x[j], 2));
}
for (j = 0; j < n; j++)
{
fxih = fxih + pow(x[j] + h / 2, 1.0 / 3) * sqrt(1 + pow(x[j] + h / 2, 2));
}
Jh = h / 6 * ((pow(a, 1.0 / 3) * sqrt(1 + pow(a, 2)) + pow(b, 1.0 / 3) * sqrt(1 + pow(b, 2)) + 2 * fxi + 4 * fxih));
fxi = 0; fxih = 0;
double* y = new double[2 * n];
for (j = 0; j < 2 * n; j++)
{
y[j] = a + j * (h / 2);
}
for (j = 1; j < 2 * n; j++)
{
fxi = fxi + pow(y[j], 1.0 / 3) * sqrt(1 + pow(y[j], 2));
}
for (j = 0; j < 2 * n; j++)
{
fxih = fxih + pow(y[j] + (h / 2) / 2, 1.0 / 3) * sqrt(1 + pow(y[j] + (h / 2) / 2, 2));
}
Jh2 = (h / 2) / 6 * ((pow(a, 1.0 / 3) * sqrt(1 + pow(a, 2)) + pow(b, 1.0 / 3) * sqrt(1 + pow(b, 2)) + 2 * fxi + 4 * fxih));
rynge[i] = (Jh2 - Jh) / (pow(2, k) - 1);
n *= 2;
}
n = 2;
cout << "|" << setw(5) << "№" << " | " << setw(9) << "K" << " | " << setw(12) << "Точное" << " | " << setw(12) << "По Рунге" << " |" << setw(12) << "Теоретическое" << "|" << endl;
cout << "________________________________________________________________" << endl;
for (i = 0; i < 16; i++)
{
cout << "|" << setw(5) << n << " | " << setw(9) << kdelta[i] << " | " << setw(12) << exact[i] << " | " << setw(12) << rynge[i] << " | " << setw(12) << theor[i] << "|" << endl;
cout << "________________________________________________________________" << endl;
n *= 2;
}
cout << endl;
a = 0.001;
}
return 0;
}
Результаты работы алгоритма:
Вывод:
В ходе лабораторной работы было изучено применение квадратурной формулы параболы при численном интегрировании для оценки значения интеграла функции f(x)= , также были рассчитаны значение точной, теоретической погрешности, погрешности, рассчитанной по правилу Рунге и коэффициента уменьшения погрешности, представленные в результатах работы алгоритма.