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

Рис. 4.6. Метод простых итераций при ти'(х) > 1 (а) и при fM'(x) < -1 (б)

Приведем сначала частный пример. Пусть вам надо решать уравнение вида А + В • х - ехр(х) = 0 при различных значениях А и В. Привести его к виду (4.5) можно различными путями. Можно выделить переменную х из второго члена уравнения. Тогда получится уравнение:

х = [ехр(х) - А] /В.

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

х = In (А + В • х) .

Правая часть этого уравнения содержит вместо экспоненты медленно меняющуюся функцию - логарифм. Производная правой части равна В / (А + В • х) и при А + В • х > В заведомо меньше единицы. При такой записи уравнения метод простых итераций при больших х будет сходиться. Правда, при малом (например, нулевом) значении А и х < 1 в этом варианте тоже будет наблюдаться расходимость.

Мы рассмотрели частный пример записи уравнения. Более общий подход заключается в следующем. Пусть к вас имеется уравнение f(x) = 0, которое вы хотите решать методом простых итераций. Тогда вы можете его переписать в виде:

х = х - к • f(x) = fи(х) .

Тем самым вы введете функцию fH(x), равную х - к ■ f(x). Производная этой функции равна fH'(x) = 1 - к ■ f'(x). Если выбрать коэффициент к, совпадающий по знаку с производной f ' (х) и меньший, чем единица, деленная на максимальный ожидаемый модуль |f (х)|, то производная fH'(x) будет меньше единицы, и метод простых итераций сойдется.

Теперь рассмотрим программную реализацию метода простых итераций в модуле Еqui.pas. В листинге 4.3 приведены фрагменты кода этого модуля, относящиеся к методу простых итераций.

Листинг 4.3. Фрагменты файла Equipas, относящиеся к методу простых итераций

unit Equl;

// Методы поиска корней нелинейного уравнения interface

// X и FDelta: результат расчета - значение корня и невязки // ХО: начальная точка

// DAbsX: заданная абсолютна допустимая погрешность X

// DRelX: заданная относительная допустимая погрешность X

var X, FDelta, ХО: real;
DAbsX: real = 0.001;
DRelX: real = 0.001;
DF: real = 0;
// Func: переменная - функция var Func: function(X: real): real;
// Метод простых итераций function Itérât: boolean;

implementation

uses Forms, Windows;
function Iterat: boolean;

// Метод простых итераций

// Maxlter: максимальное число итераций

const Maxlter = 1000;
// XOld: приближение корня на предыдущей итерации // DX: изменение оценки корня на предыдущей итерации // Iter: текущее количество итераций var XOld, DX: real;
Iter: integer;
begin Iter := 0;
X := X0;
repeat XOld := X;
X := Func(X);
FDelta := Abs(X - XOld);

if (FDelta <= DAbsX) or (FDelta <= Abs(X * DRelX)) then begin

Result := true;
exit ;
end;

if (XOld X0) then if (FDelta > DX) then begin Application.MessageBox(


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

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



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

  • Сентябрь
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс