Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
БДЗ № 2
Цель работы: Научиться применять циклические алгоритмы для решения задач, использующих численные методы.
Теоретические сведения
Вычисление значения с заданной точностью методом прямоугольников
Для вычисления первого приближения интеграла разделим отрезок [a,b], отвечающий пределам интегрирования (рис.4.1), на n равных частей (n = 4), определим значения xi = a+h*i-h/2; h = (b-a)/n.
Вычислим площадь одного прямоугольника si=h*f(xi). Сумма si площадей полученных прямоугольников является приближенным значением интеграла: .
Однако одно приближение не позволяет оценить точность, с которой вычислено значение интеграла, необходимо найти следующее приближение. Для этого увеличим n в два раза, т.е. n = 2n. Аналогично найдем .
Рис.4.1 Вычисление интеграла методом прямоугольников
Требуется вычислить значение интеграла с точностью , поэтому проверим условие |S1 - S2|<. Если условие выполняется, то S2 принимается за искомое значение интеграла; если не выполняется, то последнее выполненное значение S2 считается предыдущим, т.е. S1 = S2. После этого удвоим число точек деления отрезка и вычислим новое значение S2. Процесс удвоения n и вычисления S2 будем продолжать до тех пор, пока модуль разности S1 и S2 не станет меньше .
Пример 4.1. Вычисление интеграла методом прямоугольников.
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
#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/(53*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/(53*cos(x)))*h;
}
exact = fabs(S1 S2);
S1 = S2;
} while(exact>eps);
cout << "S = " << S2;
return 0;
}
Вычисление по формуле Симпсона
путем деления отрезка [a,b] на множество более мелких отрезков
Для нахождения интеграла вычислим площадь под графиком функции, являющейся подынтегральным выражением (рис.4.2). Здесь a и b - пределы интегрирования; xi = a + i(b - a)/n.
Для использования формулы Симпсона разбиваем отрезок [a,b] на n (четное) более мелких отрезков.
Формула Симпсона имеет вид:
Здесь n - четное число делений интервала интегрирования; xi = a + i(b a)/n.
Алгоритм состоит в циклическом выполнении расчетов f(xi). При этом следует отдельно рассмотреть случаи для границ интегрирования f(a) и f(b) и учесть, что при нечетном номере вычисляемого элемента значение функции умножается на 4, при четном - на 2. При конечных значениях отрезка умножение не производится.
Рис.4.2. Вычисление интеграла по формуле Симпсона.
Пример 4.2. Вычисление интеграла по формуле Симпсона.
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{unsigned long i, n;
float a,b,x,h,y,s;
cout << "Четное количество делений -> ";
cin >> n;
a = 0; b = 1.8;
s = 0; x = a;
h = (b a)/n;
for (i = 0; i <= n; i++)
{ y = (1/(1+sqrt(x));
x = x + h;
if (i % 2 != 0) s = s + 4*y;
else if (i == 0 || i == n) s = s + y;
else s = s + 2*y;
}
s*=h/3;
cout << "S = " << s;
}
Вычисление с заданной точностью корня уравнения F(x)=0
методом простых итераций
Пусть корень уравнения находится на отрезке [a,b] (рис.4.3). Для использования метода итераций исходное уравнение F(x) = 0 нужно привести к виду x = f(x). Если известно начальное приближение к корню x = x1, то подставив его в правую часть уравнения x = f(x), получим новое приближение x2 = f(x1). Затем аналогичным образом получим
x3 = f(x2),..., xk+1 = f(xk).
Итерационный процесс сходится к корню уравнения, если |f(x)|<1 на отрезке, содержащем корень уравнения. Если выполняется неравенство 1<f ΄(x)<0, то корень уравнения всегда находится на отрезке [xk, xk+1] или [xk+1,xk] и условие окончания итерационного процесса имеет вид неравенства [xk+1 xk]<.
Рис.4.3. Метод простых итераций
Переход от уравнения F(x) = 0 к уравнению f(x) можно осуществить следующим образом. Умножим левую и правую части уравнения F(x) = 0 на некоторую константу h и добавим к обеим частям уравнения неизвестное x. Эти действия не изменяют корней уравнения:
hF(x) + x = 0*h + x;
hF(x) + x = x.
Обозначив f(x) = hF(x) + x, перейдем к уравнению x = f(x). Величину h необходимо выбрать такой, чтобы выполнялись неравенства |f '(x)|<1, f '(x)<0 на отрезке, содержащем корень уравнения.
Исходными данными для программы, соответствующей приведенному алгоритму, являются грубое значение корня и точность вычисления. Условием выхода из итерационного процесса служит неравенство |xg x t|<, при этом искомым значением является xt
Пример 4.3. Решение уравнения методом итераций.
Преобразуем уравнение к виду .
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{ float xt, xg = 2.3, eps = 0.001, x = 5*eps;
int step = 0;
while (fabs(x)>=eps)
{ xt = -0.2*(xg*xg*xg 2*xg*xg 3)+xg;
x = xt-xg;
step++;
xg = xt;
}
cout << "Корень = " << xt << " и получен на шаге " << step;
getch();
return 0;
}
Решение уравнения f(x) = 0 с заданной точностью
методом деления отрезка пополам
Метод деления отрезка пополам заключается в следующем. Проверяется наличие корня на отрезке [a, b] (рис.4.4).
Рис.4.4. Метод деления отрезка пополам.
Для этого вычисляются значения функций f(a) и f(b). Если f(a)*f(b)>0, то уравнение не имеет корней на заданном отрезке. Если f(a)*f(b)<0, т.е. на концах отрезка [a, b] функция f(x) имеет противоположные знаки, то искомый корень лежит на этом отрезке. Поиск корня происходит следующим образом. Находим в точке a значение функции y1 = f(a). Затем определяем значение x как среднюю точку между а и b, вычисляем значения y2 = f(x). Теперь, если f(a)*f(x)>0, то корень находится на отрезке [x, b], иначе на отрезке [a, x]. В соответствии с этим, перемещаем точку а вправо или точку в влево, выполняя, соответственно присваивание а = х или b = x. Таким образом, получаем второй отрезок [a, b], но вдвое меньший предыдущего. Процесс деления отрезка пополам продолжаем до тех пор, пока отрезок [a, b] не станет меньше заданной точности. После этого вычисляем значение x = (a+b)/2.
Пример 4.4. Решение уравнения с заданной точностью = 0.01 методом деления отрезка пополам, если корень находится на отрезке [1,3].
#include <iostream>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
int 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; }
На оценку "3" нужно выполнить только свой вариант из 1 задания, на "4" и "5" из 1 и 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.1, 2]. Абсолютная погрешность не превышает . Сравнить методы вычисления. |
4, 19 |
По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла . Точность не превышает 0.001. Сравнить методы вычисления. |
5, 20 |
Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения x4 + 2x3 x 1 = 0 на интервале [0, 1]. Абсолютная погрешность не превышает 0.00015. Сравнить методы вычисления. |
6, 21 |
Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения x3 + 12x 2 = 0 на интервале [0.1, 1]. Абсолютная погрешность не превышает 0.00015. Сравнить методы вычисления. |
7, 22 |
По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла . Точность не превышает 0.001. Сравнить методы вычисления. |
8, 23 |
Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения x5 x 0.2 = 0 на интервале [0.9,1.1]. Абсолютная погрешность не превышает 0.0001. Сравнить методы вычисления. |
9, 24 |
Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения 5x + 8lnx 1 = 0 на интервале [0.5, 1]. Абсолютная погрешность не превышает 0.0015. Сравнить методы вычисления. |
10, 25 |
По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла Точность не превышает 0.001. Сравнить методы вычисления. |
11, 26 |
Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения x3 2x2 + x 3 = 0 на интервале [2.1, 2.2]. Абсолютная погрешность не превышает 0.001. Сравнить методы вычисления. |
12, 27 |
Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения x3 + x2 3 = 0 на интервале [0.5, 3]. Абсолютная погрешность не превышает 0.00001. Сравнить методы вычисления. |
13, 28 |
По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла . Точность не превышает 0.001. Сравнить методы вычисления. |
14, 29 |
По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла . Точность не превышает 0.001. Сравнить методы вычисления. |
15, 30 |
По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла . Точность не превышает 0.001. Сравнить методы вычисления. |
Приложение
Отладка приложений в ИСР Borland C++ Builder и MS Visual C++.
В ИСР Borland C++ для отладки используются следующие «горячие» клавиши:
F4 |
Run to cursor |
Выполнить до текущего места |
F5 |
Set breakpoint |
Установить точку прерывания программы |
F7 |
Trace into |
Выполнить строку программы с заходом в код вызываемых функций |
F8 |
Step over |
Выполнить строку программы без захода в код вызываемых функций |
F9 |
Run |
Выполнить |
Shift+F7 |
Trace to next source line |
Выполнить до следующей строки с исполняемым кодом |
Ctrl+Alt+L |
Show local variables |
Показать окно значений локальных переменных |
Ctrl+Alt+W |
Show watches |
Показать окно слежения за переменными |
Ctrl+Alt+B |
Show breakpoints |
Показать окно точек прерывания |
Ctlr+F2 |
Stop |
Остановка отладки |
В ИСР Visual C++ для отладки используются следующие «горячие» клавиши:
Ctrl+F10 |
Run to cursor |
Выполнить до текущего места |
F9 |
Set breakpoint |
Установить точку прерывания программы |
F11 |
Trace into |
Выполнить строку программы с заходом в код вызываемых функций |
F10 |
Step over |
Выполнить строку программы без захода в код вызываемых функций |
F5 |
Run |
Выполнить |
Ctrl+Shift+F5 |
Restart |
Выполнить с учётом изменений |
Shift+F5 |
Stop |
Остановить отладку |
При отладке следуйте следующим правилам:
Отладка приложений позволяет выявить ошибки алгоритма и ошибки программиста, которые компилятор самостоятельно выявить не может.
28
PAGE 27