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

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

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

Поможем написать учебную работу

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

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

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 5.4.2025

БДЗ № 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. На тему- ldquo;Государственный кредитrdquo;.html
3. Общей электротехнике и электронике
4. МЕТА Православный СвятоТихоновский Гуманитарный Университет Олимпиада по Основам православной куль
5. Жилища и стоянки первобытного человека.html
6. Солнечная радиация и химический состав воздуха Что понимают под понятием солнечная радиация
7. 1950 Семен Людвигович Франк философом который пытался разъяснить природу человеческой души и знаний челов
8. Морфофункціональні особливості легень при високій гострій кишковій непрохідності та її корекції в експерименті
9. Модуль уск.я- направляющ.html
10. Фридрих Ницше Так говорил Заратустра