Міністерство освіти і науки України
Національний університет “Львівська політехніка”
/
ЛАБОРАТОРНА РОБОТА № 7
з дисципліни:
"Чисельні методи"
на тему:
«Наближене обчислення визначених інтегралів»
ЛАБОРАТОРНА РОБОТА № 7
Тема роботи:
Наближене обчислення визначених інтегралів.
Мета роботи:
Вивчити методи наближеного обчислення визначених інтегралів.
Варіант 24:
Обчислити визначений інтеграл методом прямокутників, трапецій, парабол, трьох восьмих, Монте-Карло та оцінити абсолютну та відносну похибку обчислення. Проміжок інтегрування вибрати [N;N+2], де N- номер студента у списку.
1) заданий інтеграл обчислити наближено та точно. Похибку знайти як різницю точного та обчисленого значення. Дослідити як кількість ітерацій впливає на точність обчислень.
2) заданий подвійний інтеграл обчислити наближено на області [N;N+2]х[N;N+2]. Оцінити похибку обчислення.
3) заданий невластивий інтеграл обчислити наближено. Застосувати спеціальні методи обчислення невластивих інтегралів. Оцінити похибку обчислення.
1.
2.
3.
Код програми:
#include <Windows.h>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <random>
#include <ctime>
using namespace std;
double Function1(double x) {return pow(x, 1 / 3.0);}
double Function2(double x, double y) {return pow(x + y, 1 / 3.0);}
double Function3(double x, int n) {return log(1 + sin(n)*cos(x)) / cos(x);}
double Integral_Rect(double a, double b, int n) {
double result = 0;
double h = (b - a) / n;
for (int i = 0; i < n; i++)
result += Function1(a + (i + 0.5)*h);
return result*h;
}
double Integral2_Rect(double a, double b, double c, double d, int nx, int ny) {
double result = 0, xi, yj;
double hx = (b - a) / nx;
double hy = (d - c) / ny;
for (int i = 0; i < nx; i++) {
for (int j = 0; j < ny; j++) {
xi = a + hx / 2 + i*hx;
yj = c + hy / 2 + j*hy;
result += Function2(xi, yj);
}
}
return hx*hy*result;
}
double Integral3_Rect(double a, double b, int n) {
double result = 0;
double h = (b - a) / n;
for (int i = 0; i < n; i++)
result += Function3(a + (i + 0.5)*h, 12);
return result*h;
}
double Integral_Trapeze(double a, double b, int n) {
double result = 0;
double h = (b - a) / n;
for (int i = 1; i < (n - 1); i++)
result += (2 * Function1(a + i*h));
result += Function1(a) + Function1(b);
return result*h / 2;
}
double Integral2_Trapeze(double a, double b, double c, double d, int nx, int ny) {
double result = 0 , xi, yj, q;
double hx = (b - a) / nx;
double hy = (d - c) / ny;
for (int i = 0; i < nx; i++) {
for (int j = 0; j < ny; j++) {
xi = a + hx / 2 + i*hx;
yj = c + hy / 2 + j*hy;
if ((i == 0 && j == 0) || (i == 0 && j == ny) || (i == nx && j == 0) || (i == nx && j == ny))
q = 1 / 4.0;
else{
if (((i == 0 || i == nx) && (j%ny != 0))||((j == 0 || j == ny) && (i%nx != 0)))
q = 1 / 2.0;
else{
if (i&nx != 0 || j%ny != 0)
q = 1.0;
}
}
result += q* Function2(xi, yj);
}
}
return hx*hy*result;
}
double Integral_Simpson(double a, double b, int n) {
double result = 0;
double h = (b - a) / n;
for (int i = 1; i < n; i++) {
if (i % 2 == 1)
result += (2 * Function1(a + i*h));
else
result += (4 * Function1(a + i*h));
}
result += Function1(a) + Function1(b);
return result*h / 3;
}
double Integral_38(double a, double b) {
double result = 0;
result = Function1(a) / 8 + 3 * Function1((2 * a + b)/3) / 8 + 3 * Function1((a + 2 * b)/3) / 8 + Function1(b) / 8;
return (b - a)*result;
}
double Integral_MonteCarlo(double a, double b, int N) {
srand(time(NULL));
double result = 0;
double u;
for (int i = 0; i < N; i++) {
u = rand() % (int)b + (int)a;
result += Function1(u);
}
return (b - a)*result / N;
}
double Integral2_MonteCarlo(double a, double b, double c, double d, int N) {
double result = 0;
double u, v;
for (int i...