ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ И ПРОГРАММ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ С ПРЕДУСЛОВИЕМ




Цель работы

 

Изучение правил программирования программ циклической структуры с предусловием и методов нахождения корней нелинейных и трансцендентных уравнений.

 

Общие сведения

Во многих алгоритмах число повторений цикла заранее неизвестно. Для таких алгоритмов язык Си предоставляет реализации циклов с предусловием и постусловием. В этих видах циклов проверка условия продолжения цикла осуществляется соответственно до и после выполнения тела цикла.

Синтаксис цикла с предусловием:

 

while (выражение)

оператор [блок операторов];

Проверка условия продолжения цикла осуществляется до выполнения тела цикла. Пока результат выражения не равен нулю, выполняется оператор (блок операторов). Перед входом в цикл while первый раз инициализируется одна или несколько переменных для того, чтобы условное выражение имело какое-то значение. Если выражение равно нулю, то тело цикла не выполняется ни разу. Если выражение не равно нулю - выполняется тело цикла.

Оператор в теле цикла должен изменять переменную (переменные) цикла, для того чтобы выражение в конце концов обратилось в нуль и цикл завершился.

Для цикла while, как и для других видов циклов, характерны типичные ошибки, приводящие к зацикливанию. Пример такой ошибки:

i = 0;

while (i < 10);

i + = 2

В этом случае следует помнить, что точка с запятой представляет собой ‘ пустой’ оператор, который будет выполняться бесконечно, а оператор модификации переменной цикла i + = 2; не выполняется.

Другой распространенной ошибкой является использование в условном выражении вместо операции отношения = = операции присваивания =. Например:

while (i = 2)

< блок операторов >.

В этом случае условное выражение всегда дает результат, отличный от нуля, что также приводит к зацикливанию. Закончить выполнение цикла while можно при обращении в нуль выражения, либо используя в теле цикла операторы break и return.

Цикл while можно использовать для контроля каких-либо действий пользователя, например, ввода данных:

int i = 0

while (i < 0 || i >= 100)

{ puts (²Введите число в диапазоне от 1 до 99²);

scan f (² %d ²,&i);}

В этом случае если введенное число не попадает в заданный диапазон, ввод будет повторяться, не пропуская неверные данные для дальнейшей обработки.

Нахождение корней уравнений

Нахождение корней уравнений F(x) = 0 рассматриваемыми методами осуществляется в два этапа: отделение и уточнение корней.

На первом этапе производится нахождение диапазонов, в каждом из которых находится только один корень. Реализация этого этапа может быть приведена графически или табулированием функции. При табулировании в качестве границ диапазона следует выбирать значения аргумента, соответствующие соседним значениям функции, имеющим разные знаки. Второй этап - уточнение корней, т.е. нахождение их значений с необходимой погрешностью, может производиться разными методами. В данной работе рассматриваются простейшие из них: метод половинного деления (дихотомии) и метод Ньютона.

 

Метод половинного деления

Состоит в последовательном делении отрезка (a, b), в котором находится только один корень, пополам: x = (a + b)/2.

После этого находят значение функции F(x) и сравнивают его знак со знаком функции на левой границе интервала F(a). Если знаки совпадают (F(a)×F(x) > 0), корня в диапазоне a, x нет и левая граница сдвигается до значения a = x. Если знаки не совпадают (F(a)×F(x) < 0), корень находится в диапазоне a, x, диапазон x, b - пустой. В этом случае сдвигается правая граница диапазона b = x. Процесс сужения диапазона продолжается до достижения необходимой для данной физической задачи погрешности.

|F(x)| < E. Блок-схема алгоритма уточнения корня уравнения F(x) = 0 методом дихотомии показана на рис. 1. Достоинства данного метода: простота реализации и гарантированная сходимость. Недостаток - медленная по сравнению с другими методами сходимость

 

Метод Ньютона

 

Метод Ньютона (касательных) основан на нахождении очередного приближения , как точки пересечения касательной в точке и оси абсцисс. Итерационный процесс схождения к корню реализуется формулой:

где - первая производная функции F(x), блок-схема алгоритма реализующего метод касательных показана на рис. 2.

В качестве x0 выбирают тот конец отрезка a, b, на котором знаки функции F(x) и ее второй производной F’’(x) совпадают (F(x)×F’’(x) > 0). В этом случае обеспечивается наиболее быстрая (квадратичная) сходимость.

 

Контрольные вопросы

Нарисуйте блок-схему циклического вычислительного процесса с предусловием.

Какое минимальное число раз может выполняться цикл while?

В чем сущность уточнения корней методом половинного деления?

Как подсчитать количество итераций при уточнении корней?

Какое минимальное значение может иметь погрешность уточнения корня для типа float?

Покажите графически, в чем состоит принцип уточнения корней методом Ньютона?

Что неправильно в приведенном цикле?

 

while (i <=S || S > i)

операторы;

 

Варианты заданий

1-6. Вычислить значение интеграла I с погрешностью E < 10-3 по формуле трапеций:

где f(x) - подынтегральная функция, a и b - соответственно нижний и верхний пределы интегрирования, h = (b - a)/n, .

1.

2.

3.

4.

5.

6.

7-13. Уточнить корни уравнения в заданном диапазоне с погрешностью E < 10-3 методом Ньютона:

.

7.3sin(x) + 0.35x - 3.8 = 0 2< x < 3.

8. 0 < x < 1.

9. 0 < x < 1.

10. x - 2 + sin(1/x) = 0 1.2 < x < 2.

11. 1 - x + sin(x) - ln(1 + x) = 0 0 < x < 15.

12. x2 - ln(1+x) - 3 = 0 2 < x < 3.

13. ln(x) - x + 1.8 = 0 2 < x < 3.

 

14-21. Найти корни уравнения с погрешностью E < 10-4 методом половинного деления:

14. .

15. 3x/1.6 - 2.3x - 3 = 0.

16. tg(x) - tg3(x)/3 + tg5(x)/5 = 0.

17. cos(2/x) - 2sin(1/x) + 1/x = 0.

18. .

19. .

20. sin(x2) + cos(x2) - 10x = 0.

21. x2 - cos(2x) - 1 = 0.

 

Лабораторная работа № 6



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-04-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: