Текст подпрограммы и версий pa09r_p.zip pa09e_p.zip |
Тексты тестовых примеров tpa09r_p.zip tpa09e_p.zip |
Вычисление корней N - й степени из комплексного числа.
Подпрограмма PA09R вычисляет корни N - й степени (N ≥ 2) из комплексного числа y = XR + i XI по формуле
(Y)1/N = (R)1/N (cos Ak + i sin Ak) , где R = (XR2 + XI2)1/2 , Ak = θ / N + 2πk / N, k = 0, 1, ..., N-1 , θ = arctn(XI / XR)
Для экономии машинного времени, которая имеет место для N ≥ 3, значения cosAk и sinAk вычисляются при помощи рекуррентного процесса, основанного на формулах сложения углов:
cos(α + β) = cosα cosβ - sinα sinβ sin(α + β) = sinα cosβ + cosα sinβ
procedure PA09R(XR :Real; XI :Real; N :Integer; var YR :Array of Real; var YI :Array of Real);
Параметры
XR, XI - | действительная и мнимая части заданного комплексного числа (тип: вещественный); |
N - | заданная степень корня (тип: целый); |
YR, YI - | вещественные одномерные массивы длины N, содержащие на выходе вещественные и мнимые части вычисленных корней соответственно, т.е. вещественная часть J - го корня содержится в YR (J), а его мнимая часть - в YI (J), J = 1, 2, ..., N . |
Версии
PA09E - | вычисление корней N - й степени из комплексного числа в режиме расширенной (Extended) точности; при этом параметры XR, XI, YR и YI должны иметь тип Extended. |
Вызываемые подпрограммы
PA02R - | вычисление модуля комплексного числа; используется в подпрограмме PA09R. |
PA02E - | вычисление модуля комплексного числа в режиме расширенной (Extended) точности; используется в подпрограмме PA09E. |
Замечания по использованию: нет
Unit TPA09R_p; interface uses SysUtils, Math, { Delphi } LStruct, Lfunc, UtRes_p, PA09R_p; function TPA09R: String; implementation function TPA09R: String; var _i :Integer; XR,XI :Real; УR :Array [0..2] of Real; YI :Array [0..2] of Real; begin Result := ''; XR := 1.0; XI := 0.0; PA09R(XR,XI,3,YR,YI); Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[YR[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; Result := Result + #$0D#$0A; for _i:=0 to 2 do begin Result := Result + Format('%20.16f ',[YI[_i]]); if ( ((_i+1) mod 3)=0 ) then Result := Result + #$0D#$0A; end; Result := Result + #$0D#$0A; UtRes('TPA09R',Result); { вывод результатов в файл TPA09R.res } exit; end; end. Результаты: YR = ( 1.0, -0.5, -0.5 ) XI = ( 0.0, 0.866025, -0.866026 )