lab8_9 (Готовые ЛР и ДЗ (ИУ5))
Описание файла
Файл "lab8_9" внутри архива находится в следующих папках: Готовые ЛР и ДЗ (ИУ5), задания. Документ из архива "Готовые ЛР и ДЗ (ИУ5)", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика" в общих файлах.
Онлайн просмотр документа "lab8_9"
Текст из документа "lab8_9"
Лабораторная работа 8
Численное интегрирование функции.
Цели работы:
- передача в функцию параметров стандартных типов;
- передача в функцию имени функции;
- передача одномерных массивов в функцию;
- вычисление определенного интеграла методом прямоугольников и методом Дарбу-Римана.
Задание.
1. Численное интегрирование функции с заданной погрешностью методом прямоугольников.
Вычислить определённый интеграл в пределах от -1 до 3 для четырех функций f1 = x, f2 = sin( 22 * x ), f3 = x4 и f4 = arctg(x). Требуемая точность вводится с клавиатуры, количество отрезков для достижения нужной точности выбирается автоматически. Вычисление интеграла оформить в виде функции IntRect, формальными параметрами которой являются:
f - имя интегрируемой функции,
xn, xk – границы интервала интегрирования,
eps – требуемая точность,
n – число отрезков, при котором достигнута требуемая точность (выходной).
Исследовать быстродействие алгоритма в зависимости от функции и требуемой точности (быстродействие алгоритма характеризуется числом отрезков). Для каждой функции использовать 5 значений точности . Результаты представить в виде 5 таблиц, по одной таблице для каждого значения точности.
Печать таблицы результатов оформить в виде функции, параметрами которой являются одномерные массивы, хранящие наименования функций и длины наименований, значения интеграла для каждой функции (точное и вычисленное в виде суммы), числа отрезков n, при котором достигнута требуемая точность и требуемая точность вычислений . (Для хранения результатов вычислений можно использовать структуру).
2. Выполнить п.1, используя для интегрирования метод Дарбу-Римана. Вычисление интеграла оформить в виде функции IntSum.
Алгоритм метода Дарбу-Римана аналогичен алгоритму метода прямоугольников, только на каждом шаге вычисляются две суммы – верхняя (S2) и нижняя (S1):
f1 = f( x ); // значение функции на левой границе отрезка
f2 = f( x + dx ); // значение функции на правой границе
if(f1 <= f2 ) // возрастающий участок
{ S1 += f1 * dx; // нижняя сумма
S2 += f2 * dx; // верхняя сумма
}
else // убывающий участок
{ S2 += f1 * dx; // верхняя сумма
S1 += f2 * dx; // нижняя сумма
}
Вычисления прекращаются, если |S2-S1| <eps.
3. Сравнить результаты численного интегрирования с точными значениями, полученными аналитически.
=cos(a*22.0)-cos(b*22.0))/22.0;
=b*atan(b)-a*atan(a)-(log(b*b+1)-log(a*a+1))/2.0;
Ниже приведены примеры передачи в функцию в качестве параметров одномерных массивов и имен функций. Массивы и функции передаются в функцию через указатели.
Имя массива является указателем на его нулевой элемент. Указатель «ничего не знает» о длине массива и длина массива должна передаваться в функцию как параметр.
Имя функции указывает на первую команду кода функции.
Передача одномерных массивов в функцию
#include <iostream.h>
int sum(int *a,int n);
int main() {
int n;
int a[]={1,2,3,4,5,6,7,8};
n=sizeof(a)/sizeof(int);// Определение размерности инициализированного
// массива
cout<<"n="<<n<<endl;
cout << sum(a,n) <<"\n";
return 0;
}
int sum(int* a,int n) //В функцию передаются указатель на начало массива
//(имя массива a) и его размерность(n)
{
int i,s=0;
int k=sizeof(a);//k – размер указателя (4 байта)
cout<<"k="<<k<<endl;
for (i = 0; i < n; i++)
s += a[i];
return s;
}
Передача имен функций в качестве параметров
#include <iostream>
using namespace std;
typedef void (*PF)(int); /*для удобочитаемости программы определяется тип пользователя PF - указатель на функцию, которая имеет один параметр
типа int и не возвращает никакого значения*/
//Определение функции f1
void f1(PF pf) //функция получает в качестве параметра указатель типа PF
{
pf(5); //вызов функции через указатель
}
void f(int i)
{
cout << i<<endl;
}
int main() {
f1(f);
return 0;
}