Санкт-Петербургский Государственный электротехнический университет Кафедра МОЭВМ Отчет по Лабораторной работе №5 «Использование итерации в некоторых численных методах. Процедурный (функциональный) тип параметров» Выполнил: Шкулев А.А. Группа: 3304 Факультет: КТИ Санкт-Петербург 2013г. Цель работы: Изучение и практическое использование численных методов, реализация передачи имен процедуры или функции с помощью параметра процедурного типа. Постановка задачи: Нужно вычислить значение интеграла функции f(x) = 1/sqrt(2*x^4 + 1,7) на промежутке от а до b. Интеграл рассчитать по формуле: 𝑛⁄ −1 𝐼 = (ℎ⁄3)(𝑓(𝑎) + 𝑓(𝑏) + 4 (∑𝑖=02 𝑛⁄ −1 𝑎 + (2𝑖 + 1)ℎ) + 2 (∑𝑖=02 𝑎 + 2𝑖ℎ)). С каждой итерацией n увеличивается в 2 раза. Текст программы: /* *lab5 *Вычисление интеграла на интервале [a, b] f(x) = 1/sqrt(2*pow(x, 4) + 1,7) *Лабораторная работа №5 *Шкулев Антон, гр. 3304 */ #include <iostream> #include <math.h> #include <iomanip> using namespace std; int n; float m, c, a = 0.0, b = 2.0, b_max = 3.1; float float float float f(float x); sum_n_f(float h); sum_ch_f(float h); epsilon(); //основная функция //сумма значений основной функции при нечетном коэффициенте при h //сумма значений основной функции при четном коэффициенте при h //вычисление эпсилон int main() { setlocale(LC_ALL, "Russian"); cout << "Нужно найти приближенное значение интеграла I функции f(x) на интервале [a, b]" << endl; cout << "f(x) = 1/sqrt(2*pow(x, 4) + 1.7)" << endl; float epsil = epsilon(); float L = 0; float d; while (b <= b_max) { float I = 0.0; n = 4.0; int j = 0; do { L = I; float h = (b - a)/n; I = (h/3)*(f(a) + f(b) + 4*sum_n_f(h) +2*sum_ch_f(h)); j++; d = fabs(I - L); cout << "b = " << setw(3) << b << " Значение I[" << setw(2) << j << "] = " << setw(8) << I << " n = " << setw(7) << n << " |I - L| = " << d << endl; n *= 2; } while( d >= epsil); cout << "!!!b = " << setw(3) << b << " Значение I[" << setw(2) << j << "] = " << setw(8) << I << " n = " << setw(7) << n << " |I - L| = " << d << endl; b += 0.2; } } float sum_n_f(float h) { float s = 0; for(int i = 0; i <= ((n/2) - 1); i++) { float m = a + (2*i + 1)*h; s += f(m); } return s; } float sum_ch_f(float h) { float s = 0; for(int i = 0; i <= ((n/2) - 1); i++) { float c = a + 2*i*h; s += f(c); } return s; } float f(float x) { float g = 1/sqrt(2*pow(x, 4) + 1.7); return g; } float epsilon() { short p; cout << "Epsilon = 10^(-p); Введите p (p>0):"; cin >> p; float epsil = pow(10.0, -p); //Epsil = 10^(-p) cout << "Epsilon = " << epsil << endl; return epsil; } Результат работы программы: Программа рассчитывает интеграл функции с точностью до введенной эпсилон. Программа написана с использованием функций. Заключение: При выполнении лабораторной работы были получены практические навыки по изучению численных методов, реализации передачи имени процедуры или функции на языке программирования «С++».