Текст подпрограммы и версий 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