- •Лекция 1 Создание консольного приложения
- •2. Консоль. Построение консольного проекта
- •3. Запуск приложения
- •4. Сохранение и редактирование проекта
- •Лекция 2
- •4. Функции форматированного ввода и вывода
- •4.1. Функция форматированного ввода с клавиатуры
- •4.2. Функция форматированного вывода на экран
- •5. Математические функции
- •Лекция 3 Линейные вычислительные процессы
- •1. Алгоритм. Управляющие структуры
- •2. Линейные вычислительные алгоритмы
- •Лекция 4 Разветвляющиеся вычислительные процессы
- •1. Управляющая структура «развилка». Логические операции и операции отношения
- •2.1. Условный оператор if()
- •2.2. Условное выражение
- •2.3. Оператор выбора switch()
- •Лекция 5 Программирование разветвляющихся вычислительных процессов
- •Лекция 6 Циклические вычислительные процессы.
- •1. Типы циклов
- •3. Операторы безусловного перехода
- •Лекция 7 Вычисление последовательностей
- •4. Примеры вычисления последовательностей
- •5. Структура алгоритмов вычисления рекуррентных последовательностей
- •Лекция 8 Одномерные массивы
- •1. Массивы
- •1.1. Примеры программ обработки одномерных массивов
- •Лекция 9 Алгоритмы сортировки одномерных массивов
- •1. Сортировка одномерных массивов
- •1.1. Метод пузырька (метод обменной сортировкой с выбором)
- •1.2. Сортировка выбором
- •1.3. Сортировка простыми вставками
- •Лекция 10 Двухмерные массивы
- •1. Двухмерные массивы
- •Лекция 11 Алгоритмы матричной алгебры
- •1. Алгоритмы матричной алгебры
- •Лекция 12 Динамические массивы
- •1. Память компьютера. Адресное пространство
- •2. Динамическая память
- •3. Адреса и указатели
- •4. Указатели и массивы. Динамические массивы
- •5. Проблемы, связанные с указателями
- •6. Поразрядные операции
- •Лекция 13
- •1.2. Способы объявления и обращения к элементам двухмерных массивов
- •Лекция 14 Символы и строки
- •1. Символьный тип данных
- •2. Строки
- •Лекция 15 Структуры
- •1. Понятие структуры
- •2. Определение нового имени типа
- •3. Массивы структур. Указатели на структуры
- •3.1. Определение статического массива структур
- •3.1. Определение динамического массива из n структур
- •Лекция 16 Файлы
- •1. Потоковый ввод-вывод данных
- •3. Понятие файла. Функции работы с файлами
- •Лекция 17 Файлы
- •Лекция 18 Функции пользователя
- •I. Приёмы построения алгоритмов
- •2. Понятие функции
- •2.1. Определение функции
- •2.2. Область видимости переменных
- •2.3. Параметры функции
- •2.4. Описание функции
- •2.5. Организация вызова функции
- •2.5. Передача параметров в функцию
- •Лекция 19 Многофайловые программы
- •1. Создание многофайловой программы. Создание и добавление головного файла в проект
- •3. Рекурсия
- •Лекция 20 Нахождение приближенного значения корня нелинейного уравнения
- •На отрезке [a;b] с заданной точностью eps
- •1.1. Метод дихотомии (половинного деления)
- •1.2. Метод хорд
- •1.3. Метод касательных (Ньютона)
- •Лекция 21 Нахождение приближенного значения определенного интеграла
- •1. Нахождение приближенного значения определенного интеграла с заданной точностью
- •Лекция 22 Объектно-ориентированное программирование
- •Полиморфизм – это свойство класса, позволяющее определить одно и то же по имени, но разное по смыслу действие. Основные этапы ооп:
- •Уточнённое имя принадлежит классу (т.Е. Компонентной) функции
- •Лекция 23 Объектно-ориентированное программирование
- •1. Конструкторы и деструкторы
- •Лекция 24 Объектно-ориентированное программирование
- •1. Компонентные данные и компонентные функции
- •1.1. Компонентные данные
- •1.2. Определение компонентных функций
- •Лекция 25 Объектно-ориентированное программирование
- •1. Свойства классов
- •1.1. Наследование классов
- •1.2. Полиморфизм
- •Библиографический список
Лекция 21 Нахождение приближенного значения определенного интеграла
Цели:
познакомиться с алгоритмами нахождения приближенного значения определенного интеграла (с заданной точностью);
методику написания и перевода таких алгоритмов на язык программирования С++ и разработки соответствующего проекта в среде Visual C++ 6.0.
1. Нахождение приближенного значения определенного интеграла с заданной точностью
Существует несколько методов приближенного вычисления определенных интегралов. Численно определенный интеграл равен площади фигуры, ограниченной кривойy=f(x), осью Ox и прямыми x=a и x=b. Такую фигуру называют криволинейной трапецией (рис.17). Рассмотрим методы левых, правых и центральных прямоугольников, а также метод трапеций и метод Симпсона. Суть их в том, что отрезок [a;b] разбивается на n равных частей и находится длина каждого частичного отрезка по формуле . Следовательно, криво-линейная трапеция разбивается на множество элементарных трапеций, и её площадь считается как сумма площадей элементарных трапеций. Площадь же элементарной трапеции приблизительно равна площади элементарного прямоугольника или трапеции и вычисляется по соответствующей формуле.
Для формул прямоугольников площадь каждой элементарной трапеции заменяется площадью прямоугольника и вычисляется как произведение значения функции, аргументом которой будет левая или правая граница каждого частичного отрезка (для формул левых и правых прямоугольников соответственно) или центр каждого частичного отрезка (для формулы центральных прямоугольников) на шаг разбиения h.
В методе трапеций площадь каждой элементарной криволинейной трапеции находится по формуле площади обычной трапеции, известной из школьного курса математики.
В методе Симпсона берутся три ближайшие точки разбиения и по ним строится парабола, график которой приближенно описывает график функции на двух близлежащих частичных отрезках. Ищутся приближенно площади криволинейных трапеций на всех участках и складываются. Это и будет приближенное вычисление определенного интеграла по методу Симпсона. Для нахождения приближенного значения интеграла по методу Симпсона необходимо, чтобы количество частичных отрезков было четным.
В программировании для вычисления интеграла используется цикл, который продолжает свою работу до тех пор, пока ближайшие значения интегралов различаются не более чем на заданную точность eps.
Математические формулы для всех описанных методов приведены в табл.13.
Таблица 13 | |
Название метода |
Формула |
Метод левых прямоугольников | |
Метод центральных прямоугольников | |
Метод правых прямоугольников | |
Метод трапеций | |
Метод Симпсона |
Общая схема вычисления интегралов с точностьюeps:
ввод a
ввод b
ввод количества разбиений n
вычислить шаг h
ввод eps
вычисление интеграла i0
I1=0
пока |I0-I1|>=eps
I1=I0
увеличение количества разбиений n
вычислить новый шаг h
вычисление интеграла I0
все_пока
печать I0
Далее приведены примеры алгоритмов и соответствующих программ для вычисления приближенного значения определенного интеграла.
Вычислить интеграл с точностьюeps методом левых прямоугольников:
Алгоритм |
Программа |
объявление вещ: a,b,h,eps,I0,I1,x; цел: i, n; ввод a,b,n,eps h=(b-a)/n x=a I0=ln(a-3) для i=1 до n-1 шаг 1 x=x+h I0=I0+ln(x-3) все_для i I0=I0*h I1=0 пока |I1-I0|>=eps I1=I0 n=2*n h=(b-a)/n x=a I0=ln(a-3) для i=1 доn-1 шаг 1 x=x+h I0=I0+ln(x-3) все_для i I0=I0*h все_цикл печать I0
|
#include “stdio.h” #include “math.h” int main ( ) { int i,n; float a,b,h,x,I0,I1,eps; printf(“a=”); scanf(“%f”,&a); printf(“b=”); scanf(“%f”,&b); printf(“n=”); scanf(“%i”,&n); h=(b-a)/n; printf(“eps=”); scanf(“%f”,&eps); x=a; I0=log(a-3); for (i=1;i<=n-1;i++) { x=x+h; I0=I0+log(x-3); } I0=I0*h; I1=0; while (fabs(I0-I1)>=eps) { I1=I0; n=2*n; h=(b-a)/n; x=a; I0=log(a-3); for (i=0;i<=n-1;i++) { x=x+h; I0=I0+log(x-3); } I0=I0*h; } printf(“integral=%f \n”,I0); return1; }
|
Вычислить интеграл с точностьюeps методом центральных прямоугольников:
Алгоритм |
Программа |
объявление вещ: a,b,h,eps,I0,I1,x; цел: i, n; ввод a,b,n,eps; h=(b-a)/n; x=a+h/2; I0=ln(a-3); для i=1 доn-1 шаг 1 x=x+h; I0=I0+ln(x-3); все_для i I0=I0*h I1=0 пока |I1-I0|>=eps I1=I0 n=2*n h=(b-a)/n x=a+h/2 I0=ln(a-3) для i=1 до n-1 шаг 1 x=x+h I0=I0+ln(x-3) все_для i I0=I0*h все_цикл печать I0
|
#include “stdio.h” #include “math.h” int main ( ) { int i,n; float a,b,h,x,I0,I1,eps; printf(“a=”); scanf(“%f”,&a); printf(“b=”); scanf(“%f”,&b); printf(“n=”); scanf(“%i”,&n); h=(b-a)/n; printf(“eps=”); scanf(“%f”,&eps); x=a+h/2; I0=log(a-3); for (i=1;i<=n-1;i++) { x=x+h; I0=I0+log(x-3); } I0=I0*h; I1=0; while (fabs(I0-I1)>=eps) { I1=I0; n=2*n; h=(b-a)/n; x=a+h/2; I0=log(a-3); for (i=1;i<=n-1;i++) { x=x+h; I0=I0+log(x-3); } I0=I0*h; } printf(“integral=%f \n”,I0); return 1; }
|
Вычислить интеграл с точностьюeps методом правых прямоугольников:
Алгоритм |
Программа |
объявление вещ: a,b,h,eps,I0,I1,x; цел: i, n; ввод a,b,n,eps h=(b-a)/n x=a+h I0=ln(a-3) для i=2 до n шаг 1 x=x+h I0=I0+ln(x-3); все_для i I0=I0*h I1=0 пока |I1-I0|>=eps I1=I0 n=2*n h=(b-a)/n x=a+h I0=ln(a-3) для i=2 до n шаг 1 x=x+h I0=I0+ln(x-3) все_для i I0=I0*h; все_цикл печать I0
|
#include “stdio.h” #include “math.h” int main ( ) { int i,n; float a,b,h,x,I0,I1,eps; printf(“a=”); scanf(“%f”,&a); printf(“b=”); scanf(“%f”,&b); printf(“n=”); scanf(“%i”,&n); h=(b-a)/n; printf(“eps=”); scanf(“%f”,&eps); x=a+h; I0=log(a-3); for (i=2;i<=n;i++) { x=x+h; I0=I0+log(x-3); } I0=I0*h; I1=0; while (fabs(I0-I1)>=eps) { I1=I0; n=2*n; h=(b-a)/n; x=a+h; I0=log(a-3); for (i=2;i<=n;i++) { x=x+h; I0=I0+log(x-3); } I0=I0*h; } printf(“integral=%f \n”,I0); return1; }
|
Вычислить интеграл с точностьюeps методом трапеций
Алгоритм |
Программа |
объявление вещ: a,b,h,eps,I0,I1,x; цел: i, n; ввод a,b,n,eps h=(b-a)/n x=a I0=0 для i=1 до n-1 шаг 1 x=x+h I0=I0+ln(x-3) все_для i I0= h*((log(a-3)+log(b-3))/2+I0) I1=0 пока |I1-I0|>=eps I1=I0 n=2*n h=(b-a)/n x=a I0=0 для i=1 до n шаг 1 x=x+h I0=I0+ln(x-3) все_для i I0= h*( (log(a-3)+log(b-3))/2+I0) все_цикл печать I0
|
#include "stdio.h" #include "math.h" int main() { int i,n; float x,a,b,h,eps,I0,I1; printf("a = "); scanf("%f",&a); printf("b = "); scanf("%f",&b); printf("n = "); scanf("%i",&n); h=(b-a)/n; printf(“eps=”); scanf(“%f”,&eps); x=a; I0=0; for(i=0;i<=n-1;i++) { I0=I0+log(x-3); x=x+h; } I0=h*((log(a-3)+log(b-3))/2+I0); I1=0; while(fabs(I0-I1)>eps) { I1=I0; n=n*2; h=(b-a)/n; x=a; I0=0; for(i=0;i<=n-1;i++) { I0=I0+log(x-3); x=x+h; } I0=h*((log(a-3)+log(b-3))/2+I0); } printf("I=%f\n",I0); return 1; } |
Вычислить интеграл с точностьюeps методом Симпсона:
Алгоритм |
Программа |
объявление вещ: a,b,h,eps,I0,I1,x,f2i_1,f2i; цел: i, n ввод a,b,n,eps; //если n– нечетное, то умножаем на 2 если n%2= =1 n=n*2 h=(b-a)/n f2i_1=0; //для «нечетных» точек f2i=0; //для «четных» точек x=a+h; для i=1 до (n-1)/2 шаг 1 f2i_1=f2i_1+log(x-3); x=x+h; f2i=f2i+log(x-3); x=x+h; все_для i f2i_1=f2i_1+log(x-3); I0=h*(log(a-3)+log(b-3)+4*f2i_1 +2*f2i)/3; I1=0 пока |I1-I0|>=eps I1=I0 n=2*n h=(b-a)/n x=a I0=0 для i=1 до (n-1)/2 шаг 1 f2i_1=f2i_1+log(x-3); x=x+h; f2i=f2i+log(x-3); x=x+h; все_для i f2i_1=f2i_1+log(x-3); I0=h*(log(a-3)+log(b-3)+4*f2i_1+ 2*f2i)/3; все_цикл печать I0
|
#include "stdio.h" #include "math.h" int main() { int i,n; float x,a,b,h, I0,I1,f2i_1,f2i,eps; printf("a = "); scanf("%f",&a); printf("b = "); scanf("%f",&b); printf("n = "); scanf("%i",&n); //если n– нечетное, то умножаем на 2 if(n%2==1) n=n*2; printf(“eps=”); scanf(“%f”,&eps); f2i_1=0; //для «нечетных» точек f2i=0; //для «четных» точек h=(b-a)/n;x=a+h; for(i=1;i<=(n-1)/2;i++) { f2i_1=f2i_1+log(x-3); x=x+h; f2i=f2i+log(x-3); x=x+h; } f2i_1=f2i_1+log(x-3); I0=h*(log(a-3)+log(b-3)+4*f2i_1+2*f2i)/3; I1=0; while(fabs(I0-I1)>=eps) {I1=I0; n=n*2; f2i_1=0; //для «нечетных» точек f2i=0; //для «четных» точек h=(b-a)/n; x=a+h; for(i=1;i<=(n-1)/2;i++) { f2i_1=f2i_1+log(x-3); x=x+h; f2i=f2i+log(x-3); x=x+h; } f2i_1=f2i_1+log(x-3); I0=h*(log(a-3)+log(b-3)+4*f2i_1+2*f2i)/3; } printf("I=%f\n",I0); return 1; }
|
Примечание. Если сравнить результаты вычислений интегралов с точным значением определенного интеграла, то можно сделать вывод о том, что наиболее точным методом является метод Симпсона.