
МП_С / Колоквиум_2012
.docКоллоквиум
Теоретические сведения
Вычисление
значения
с заданной точностью методом
прямоугольников
Для вычисления значения определённого интеграла функции, монотонной и непрерывной на конечном отрезке [a,b], можно воспользоваться методом прямоугольников. Для вычисления первого приближения интеграла разделим отрезок [a,b], отвечающий пределам интегрирования (рис.1), на n равных частей (n = 4), определим значения
xi = a+h*i-h/2;
h = (b-a)/n.
Вычислим
площадь одного прямоугольника si=h*f(xi).
Сумма si
площадей
полученных прямоугольников является
приближенным значением интеграла:
.
Однако
одно приближение не позволяет оценить
точность, с которой вычислено значение
интеграла, необходимо найти следующее
приближение. Для этого увеличим n в два
раза, т.е. n = 2n. Аналогично найдем
.
Рис.1 Вычисление интеграла методом прямоугольников
Требуется вычислить значение интеграла с точностью , поэтому проверим условие |S1 - S2|<. Если условие выполняется, то S2 принимается за искомое значение интеграла; если не выполняется, то последнее выполненное значение S2 считается предыдущим, т.е. S1 = S2. После этого удвоим число точек деления отрезка и вычислим новое значение S2. Процесс удвоения n и вычисления S2 будем продолжать до тех пор, пока модуль разности S1 и S2 не станет меньше .
Пример
1. Вычисление
интеграла
методом прямоугольников.
#include <iostream.h>
#include <conio.h>
#include <math.h>
#define Pi 3.14159
int main()
{unsigned long i, n = 4;
float a,b,x,h,S1,S2,eps,exact;
a = 0; b = 3/(2*Pi); eps = 0.001;
S1 = 0;
h = (b – a)/n;
//Вычисляем сумму в первом приближении
for (i = 1; i<=n; i++)
{ x = a + i*h – h/2;
S1 = S1+ (1/(5–3*cos(x)))*h;
}
//Вычисляем текущее приближение и сравниваем его с предыдущим
do {n = 2*n;
h = (b – a)/n;
S2 = 0;
for (i = 1; i<=n; i++)
{x = a + i*h – h/2;
S2 = S2 + (1/(5–3*cos(x)))*h;
}
exact = fabs(S1 – S2);
S1 = S2;
} while(exact>eps);
cout << "S = " << S2) ;
return 0;
}
Решение уравнения f(x) = 0 с заданной точностью
методом деления отрезка пополам
Для
решения уравнения
на отрезке
,
где
непрерывная функция, меняющая знак на
отрезке, можно применять метод деления
отрезка пополам. Метод деления отрезка
пополам заключается в следующем.
Проверяется перемена знака функцией
на отрезке [a,b] (рис.2).
Рис.2. Метод деления отрезка пополам.
Для
этого вычисляются значения функций
f(a) и f(b). Если f(a)*f(b)>0, то этот метод не
приводит к желаемому результату. Если
f(a)*f(b)<0, т.е. на концах отрезка [a,b] функция
f(x) имеет противоположные знаки, то поиск
корня происходит следующим образом.
Находим в точке a значение функции y1
= f(a). Затем
определяем значение
и вычисляем значения y2
= f(х). Теперь,
если f(a)*f(х)>0, то корень находится на
отрезке [x,b], если f(a)*f(x)0,
то корень находится на отрезке [a,x].
В первом случае перемещаем точку а
вправо, выполняя присваивание а = х, во
втором случае перемещаем b
влево, b=x.
Таким образом, получаем второй отрезок
[a,b], но вдвое меньший предыдущего. Процесс
деления отрезка пополам продолжаем до
тех пор, пока отрезок [a,b] не станет меньше
заданной точности. После этого вычисляем
значение x = (a+b)/2.
Пример
2. Решение
уравнения
с заданной точностью
= 0.01 методом
деления отрезка пополам, если корень
находится на отрезке
[1,3].
#include <iostream.h>
#include <conio.h>
main()
{ int n = 0;
float x, a = 1, b = 3, y1, y2, eps = 0.001, e, r, l;
l = a; r = b;
y1 = a*a*a – 2*a*a – 3;
y2 = b*b*b – 2*b*b – 3;
if (y1*y2>0) { cout << "Корней нет" <<endl;
getch();
exit(1) ;
}
do { ++n;
x = (a+b)/2;
y1 = a*a*a – 2*a*a – 3;
y2 = x*x*x – 2*x*x – 3;
if (y1*y2>0) a = x;
else b = x;
} while (b – a)>eps;
x = (a + b)/2;
cout << "Корень уравнения на отрезке "<< l << ", " << r << "равен " << x << " и получен за " << n <<"шагов";
cout << endl;
return 0;
}
Контрольные вопросы
-
Каким образом цикл while может имитировать цикл for?
-
Каким образом цикл while может имитировать цикл do-while?
-
В каких случаях используются операторы break, goto и continue и функция exit()?
Порядок выполнения коллоквиума
1. Получить от преподавателя номер варианта.
2. Ознакомиться с данным описанием и составить программу, указанную в задании.
3. Подготовить файл с программой и отладить её. Результаты показать преподавателю.
4. Оформить отчет.
Лабораторное задание
1. Для своего варианта cоставить программу вычисления суммы бесконечного ряда c точностью, значение которой ввести с клавиатуры задание 1.
2. Реализовать указанные в задании 2 методы, согласно номеру своего варианта.
Требования к отчету
Отчет должен содержать:
-
название и цель работы;
-
схему алгоритма;
-
краткие теоретические сведения;
-
текст программы для варианта задания, полученного от преподавателя;
-
результаты выполнения программ.
Варианты заданий
Задание 1
Ввести с клавиатуры х и точность вычисления Eps. Вычислить с заданной точностью сумму
Номер варианта |
Задание |
1, 16 |
|
2, 17 |
|
3, 18 |
|
4, 19 |
|
5, 20 |
|
6, 21 |
|
7, 22 |
|
8, 23 |
|
9, 24 |
|
10, 25 |
|
11, 26 |
|
12, 27 |
|
13, 28 |
|
14, 29 |
|
15, 30 |
|
Задание 2
Номер варианта |
Задание |
1, 16 |
Методом
деления отрезка пополам найти
приближенное значение корня уравнения
x + ln(x + 0.5)
– 0.5 = 0 на
интервале [0,2]. Абсолютная погрешность
не превышает
|
2, 17 |
Методом
деления отрезка пополам найти
приближенное значение корня уравнения
2x3
+ 4x –
1 = 0 на
интервале [0,0.5]. Абсолютная погрешность
не превышает
|
3, 18 |
Методом
деления отрезка пополам найти
приближенное значение корня уравнения
1/x = sin x
на интервале [0,2]. Абсолютная погрешность
не превышает
|
4, 19 |
Методом
прямоугольников вычислить приближенное
значение интеграла
|
5, 20 |
Методом деления отрезка пополам найти приближенное значение корня уравнения x4 + 2x3 – x – 1 = 0 на интервале [0,1]. Абсолютная погрешность не превышает 0.00015. |
6, 21 |
Методом деления отрезка пополам найти приближенное значение корня уравнения x3 + 12x – 2 = 0 на интервале [0.5,1]. Абсолютная погрешность не превышает 0.00015. |
7, 22 |
Методом
прямоугольников вычислить приближенное
значение интеграла
|
8, 23 |
Методом деления отрезка пополам найти приближенное значение корня уравнения x5 – x – 0.2 = 0 на интервале [0.9,1.1]. Абсолютная погрешность не превышает 0.0001. |
9, 24 |
Методом деления отрезка пополам найти приближенное значение корня уравнения 5x + 8lnx – 1 = 0 на интервале [4,5]. Абсолютная погрешность не превышает 0.0015. |
10, 25 |
Методом
прямоугольников вычислить приближенное
значение интеграла
|
11, 26 |
Методом деления отрезка пополам найти приближенное значение корня уравнения x3 – 2x2 + x – 3 = 0 на интервале [2.1,2.2]. Абсолютная погрешность не превышает 0.001. |
12, 27 |
Методом деления отрезка пополам найти приближенное значение корня уравнения x3 + x2 – 3 = 0 на интервале [0.5,1.5]. Абсолютная погрешность не превышает 0.00001. |
13, 28 |
Методом
прямоугольников вычислить приближенное
значение интеграла
|
14, 29 |
Методом
прямоугольников вычислить приближенное
значение интеграла
|
15, 30 |
Методом
прямоугольников вычислить приближенное
значение интеграла
|