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

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

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

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

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

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

Кафедра ВМиК

Лабораторная работа №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)= , также были рассчитаны значение точной, теоретической погрешности, погрешности, рассчитанной по правилу Рунге и коэффициента уменьшения погрешности, представленные в результатах работы алгоритма.

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