Текст подпрограммы и версий
zp11r_p.zip  zp11c_p.zip 
Тексты тестовых примеров
tzp11r_p.zip  tzp11c_p.zip 

Подпрограмма:  ZP11R (модуль ZP11R_p)

Назначение

Вычисление корней полинома с вещественными коэффициентами методом Дженкинса - Трауба.

Математическое описание

Подпрограмма ZP11R вычисляет NР вещественных и комплексных корней полинома

      A(1) + A(2)*X + A(3)*X2 + ... + A(NP + 1)*XNP , 

у которого коэффициенты  А ( I ),  I = 1, 2, 3, ..., NР + 1 являются вещественными.

М.А.Jenkins, J.F.Тraub, A  Тhree - Stage Аlgorithm for Real Pоlinomials Using Quadratic Iteration, SIАМ Journal on Numerical Аnalysis, 7, 1970.

Использование

procedure ZP11R(NP :Integer; var A :Array of Real;
                var ROOT :Array of Real; var RAB :Array of Real;
                var IERR :Integer);

Параметры

NP - заданная степень полинома (тип: целый);
A - вещественный вектор длины NР + 1, содержащий коэффициенты исходного полинома в порядке возрастания степеней;
ROOT - комплексный вектор длины NР, содержащий вычисленные корни;
RAB - вещественный вектор длины 7 * (NР + 1), используемый в подпрограмме как рабочий;
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом
IЕRR=65 - когда степень полинома меньше 1;
IЕRR=66 - когда коэффициент А (NР + 1) при старшей степени равен 0;
IЕRR=67 - когда вычислено меньше корней, чем степень полинома; соответствующее число корней в конце вектора RООТ полагаются равными (3.4E38, 3.4E38).

Версии

ZP11C - вычисление корней полинома с комплексными коэффициентами методом Дженкинса - Трауба. Тем самым, вектор А имеет тип Complex.

Вызываемые подпрограммы

UTZP10 - подпрограмма выдачи диагностических сообщений при работе подпрограмм ZР11R и ZР11С.

Замечания по использованию

 

Подпрограмма ZР11R использует глобальные записи (структуры данных) с именами _РР11R и _РRРQLJ, а также служебные подпрограммы ZRРQLВ, ZRРQLС, ZRРQLE, ZRРQLЕ, ZRРQLF, ZRРQLG, ZRРQLН, ZRРQLI.

В подпрограмме ZР11С вещественный вектор RАВ имеет длину 10 * (NР + 1) и использует глобальные записи (структуры данных) с именами _PP11C и _РСРQLN, а также служебные подпрограммы ZСРQLВ, ZСРQLС, ZСРQLE, ZСРQLЕ, ZСРQLF, ZСРQLG, ZСРQLН, ZСРQLI, ZСРQLJ, ZСРQLК, ZСРQLL, ZСРQLМ.

Алгоритм, реализованный в подпрограмме ZР11С изложен в статье

М.А.Jenkins, J.F.Тraub, А  Тhree - Stage Variable - Shift Iteration for Рolinomial Zeros and its Relation то Generalized Rayleigh Iteration, Number. Матн., 14, 1970.

Пример использования

1.
Unit TZP11R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ZP11R_p;

function TZP11R: String;

implementation

function TZP11R: String;
var
NP,_i,IERR :Integer;
RООТ :Array [0..5] of Real;
RАВ :Array [0..27] of Real;
const
A :Array [0..3] of Real = ( -2.0,4.0,-3.0,1.0 );
begin
Result := '';  { результат функции }
NP := 3;
ZP11R(NP,A,ROOT,RAB,IERR);
Result := Result + Format(' %5d %5d ',[IERR,NP]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 3 do
 begin
  Result := Result + Format('%20.16f ',[A[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
 begin
  Result := Result + Format('%20.16f ',[ROOT[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 27 do
 begin
  Result := Result + Format('%20.16f ',[RAB[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('TZP11R',Result);  { вывод результатов в файл TZP11R.res }
exit;
end;

end.

Результаты:
       
       RООТ(1) = (1.0, 0.0) ,    RООТ(2) = (1.0, 1.0)
       ROOT(3) = (1.0, - 1.0) ,  IERR = 0

2.
Unit tzp11c_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, ZP11C_p;

function tzp11c: String;

implementation

function tzp11c: String;
var
NP,_i,IERR :Integer;
A :Array [0..7] of Real;
Z :Array [0..5] of Real;
RAB :Array [0..39] of Real;
begin
Result := '';  { результат функции }
NP  := 3;
A[0] := 10.0;
A[1] := 0.0;
A[2] := -8.0;
A[3] := 12.0;
A[4] := -3.0;
A[5] := -6.0;
A[6] := 1.0;
A[7] := 0.0;
ZP11C (NP,A,Z,RAB,IERR);
Result := Result + Format('%6d %6d ',[IERR,NP]) + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 7 do
 begin
  Result := Result + Format('%20.16f ',[A[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 5 do
 begin
  Result := Result + Format('%20.16f ',[Z[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 39 do
 begin
  Result := Result + Format('%20.16f ',[RAB[_i]]);
  if ( ((_i+1) mod 4)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
UtRes('tzp11c',Result);  { вывод результатов в файл tzp11c.res }
exit;
end;

end.

Результаты:

       RООТ = (1.0, 1.0) ,  (1.0, 2.0) ,  (1.0, 3.0)
       IERR = 0