'Метод расходится!' + #13 + 'Смените исходную точку или метод', 'Метод простых итераций расходится', МВ_ОК + MB_ICONSTOP); Result := false; exit; end

else if (Iter > Maxlter) then if Application.MessageBox(

'Лимит итераций исчерпан.' + #13 + 'Есть опасность, что метод зацикливается.' + #13 + 'Продолжать?', 'Подтвердите продолжение расчета', MB_YESNOCANCEL+MB_ICONQUESTION) IDYES then begin Result := false; exit; end

else Iter := 0;
DX := FDelta;
Inc (Iter);
until false;
end;

Глобальные переменные X, FDelta, DAbsX, DRelX, DF, Func уже были описаны в разд. 4.2 и 4.3. В данном случае добавляется глобальная переменная Х0, в которую заносится начальная точка (начальное приближение корня). Объявление функции Itérât идентично рассмотренным в разд. 4.2 и 4.3 объявлениям функций Dihot и Chord. Так что на этих уже рассмотренных вопросах мы останавливаться не будем.

Оператор uses в коде листинга не отличается от приведенного в листинге 4.1. Подключение модулей Forms и Windows по-прежнему нужно для вызова метода Application.MessageBox.

Теперь рассмотрим функцию Itérât, реализующую метод простых итераций. В ней введена локальная переменная Iter - счетчик числа итераций, и константа Maxlter - максимально разрешенное число итераций. Введение этих величин связано с тем, что в общем случае сходимость метода не гарантирована. Метод может зациклиться, и требуется средство, которое позволяет после достаточно большого числа итераций приостановить расчет и спросить пользователя, стоит ли продолжать поиск корня. Локальные переменные XOld и DX используются, как будет видно далее, для сравнения приращений аргумента на двух итераций, что необходимо, чтобы отследить возможную расходимость метода.

Первые выполняемые операторы функции Itérât сбрасывают на нуль счетчик итераций и заносят в переменную X заданное начальное значение. Далее следуют итерации, оформленные бесконечным циклом repeat ... until false, аналогичным рассмотренному в разд. 4.2 и 4.3. Выход из этого бесконечного цикла реализован внутри его тела. Первый оператор итерации запоминает в переменной XOld значение X на предыдущей итерации. Следующий оператор осуществляет расчет нового приближения корня в соответствии с соотношением (4.6). Третий оператор заносит в переменную FDelta модуль приращения X на данной итерации. Это приращение используется в следующей структуре if, осуществляющей проверку критериев окончания. Отличие от аналогичных структур, рассмотренных в предыдущих разделах, заключается только в отсутствии проверки критерия по невязке. Выше указывалось, что в методе простых итераций критерии по аргументу и невязке идентичны.

Следующая структура if введена для контроля сходимости процесса. Если значение XOld не равно Х0 (т.е. если это не первая итерация), то изменение X на текущей итерации (FDelta) сравнивается с запомненным в конце предыдущей итерации изменением X на предыдущей итерации (DX). Если на текущей итерации изменение больше, чем на предыдущей, то это является признаком расходимости процесса поиска корня. В этом случае методом Application.MessageBox пользователю предъявляется окно, показанное на рис. 4.7, и вычисления прекращаются. В этом случае функция Itérât возвращает false.

Рис. 4.7

Сообщение о расходимости метода простых итераций

4.4 Метод простых итераций одномерный случай

Можно отметить, что заключение о расходимости метода всего по результатам одной итерации может быть слишком пессимистичным. Не исключено, что после большого приращения X на одной итерации метод начнет сходиться, и приращения будут уменьшаться. Если вы хотите избежать излишнего пессимизма, вам будет нетрудно изменить код так, чтобы отказ от расчета происходил, только если приращение X увеличивается подряд, например, на двух итерациях.

После проверки сходимости проверяется сравнением Iter и Maxlter, не превышено ли допустимое число итераций. Дело в том, что отсутствие расходимости еще не гарантирует сходимость метода. Метод может в некоторых ситуациях зацикливаться или очень медленно сходиться. Поэтому в общем случае контроль числа итераций очень желателен. Если превышено допустимое число итераций, то пользователю показывается диалоговое окно, представленное на рис. 4.8. Если пользователь ответит в нем Да (метод Application.MessageBox вернет значение IDYES), то расчет будет продолжен, причем число итераций Iter будет сброшено на нуль. Так что методу предоставится возможность сделать еще Maxlter итераций. При любом другом ответе пользователя в окне рис. 4.8 расчет будет прерван.

Два последних оператора итерации запоминают изменение X на данной итерации (переменной DX присваивается значение FDelta) и увеличивают на единицу число сделанных итераций Iter.

Рис. 4.8

Диалоговое окно, показываемое, если исчерпан лимит итераций

4.4 Метод простых итераций одномерный случай

4.3 Метод хорд || Оглавление || 4.5 Метод Ньютона одномерный случай


⇐ Предыдущая страница|

Приемы программирования в Delphi на основе VCL



Новости за месяц

  • Май
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс