|
Текст подпрограммы и версий zp11r_p.zip zp11c_p.zip |
Тексты тестовых примеров tzp11r_p.zip tzp11c_p.zip |
Вычисление корней полинома с вещественными коэффициентами методом Дженкинса - Трауба.
Подпрограмма 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