Отчет 5

advertisement
Санкт-Петербургский
Государственный электротехнический университет
Кафедра МОЭВМ
Отчет
по Лабораторной работе №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;
}
Результат работы программы:
Программа рассчитывает интеграл функции с точностью до введенной
эпсилон. Программа написана с использованием функций.
Заключение:
При выполнении лабораторной работы были получены практические
навыки по изучению численных методов, реализации передачи имени
процедуры или функции на языке программирования «С++».
Download