Будь умным!


У вас вопросы?
У нас ответы:) SamZan.ru

на n равных частей n 4 определим значения xi hih-2; h b-n

Работа добавлена на сайт samzan.ru: 2015-07-10


БДЗ № 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/(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;

}

Вычисление  по формуле Симпсона
путем деления отрезка [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). Затем аналогичным образом получим
x
3 = 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

Остановить отладку

При отладке следуйте следующим правилам:

  •  введите в критические места программы точки прерываний;
  •  на критическом участке выполняйте программу по шагам;
  •  если вызывается ваша функция – используйте отладку с заходом в функции, если же в текущей строке программы вызываются только библиотечные функции – используйте отладку без захода в функции;
  •  для слежения за значениями переменных внутри функции используйте окно значений локальных переменных;
  •  для слежения за выбранными переменными используйте окно слежения за переменными;
  •  в окне слежения за переменными используйте Ins для добавления переменной и Del для удаления.

Отладка приложений позволяет выявить ошибки алгоритма и ошибки программиста, которые компилятор самостоятельно выявить не может.

28

PAGE  27




1. Марго
2. По теме - Общая спортивная и физическая подготовка в
3. Налоговый учет для бухгалтера
4. составитель кандидаты экономических наук доцент М
5. кафедрой дмн доцент Галактионова М
6. Учебник подготовлен на базе действующего законодательства с учетом последних изменений связанных с реорган
7. а Рубинштейн- становление сознания связано со становлением новой формы бытия ~ бытия человеческого ~ новой
8. Курсовая работа- Восстановление базы данных
9. Курсовая работа- Архивное дело в Российской Федерации
10. Вступ 3 РОЗДІЛ 1 Економі
11. Проект организации лесного питомника в Майнском лесничестве Ульяновской области
12. Красноярский государственный медицинский университет имени профессора В
13. Обзор экономической ситуации в России
14. тематичний аналіз Розглянуто та схвалено
15. Тема- Разработка проекта структурированной кабельной системы на предприятии OОO ИнтерКом
16. тематического расположения материала
17. И начав от Моисея из всех пророков изъяснял им сказанное о Нем во всем Писании
18. Основные понятия лесной фитоценологии и биогеоценологии
19. ТЕМА- СЛЕДСТВЕННЫЕ ВЕРСИИ И ПЛАНИРОВАНИЕ РАССЛЕДОВАНИЯ
20. Политическая система Франции и пятая республика