Главная страница  Алгоритмы 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [ 23 ] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57]

begin wro]: = aXw[0]; d[j]: = cIj]Xw[0];

Кроме того, нужно добавить еще один символ end перед

посладней строкой end potyx;

Исправленный алгоритм был транслирован и дал правильные результаты для следующих примеров-1) 2x+Sx+\, xtVX; 2) bx+x+Sx+Q, x=2t+Z-3) 3x4+:2, х=Ы+А; 4) -x+W, x~2t+\.

АЛГОРИТМ 306

Нахождение комплексных корней полинома

с использованием формул Берстоу-Ньютона [С21

В процедуре rootpol (сокращение от root - корень, polinomial--полином) при синтетическом делении многочленов используются корректурные формулы Берстоу и Ньютона. Коэффициенты исходного полинома степени п задаются в виде a[i] {i=0, l,...,n), где а[п] -свободный член. Коэффициенты преобразуются делением на их среднее геометрическое. Метод итераций Берстоу или Ньютона почти всгда будет сходиться с точностью до k-й цифры либо к значениям корней, либо к их обратным значениям. Если совместные итерации по Ньютону и Берстоу не дают сходимости .к значениям корней или к их обратным значениям за it повторений, то требование к сходимости последовательно понижается на одну значащую цифру. Данная программа предупреждает и защищает от потери смысла при квадратичном* синтетическом делении многочленов [13i, с. 644-647]. Действительная и мнимая части .каждого корня обозначаются как u[i] я v[i] соответственно вместе с соответствующей константой acc[i], используемой дл-я проверки сходимости.

procedure rootpol (n,a,it,k) result: (u,v,acc);

value n,a,it,k; integer n,it,k; array a,u,v,acc; begin real t,kk,ps,qs,pt,qt,s,rev,r,p,q; integer i,j,m;

array h,b,c,d,e[-2:n];

bl-l]:=bl-2]:=cl-l]: = cl-2]: = dl-l]: = e[-l]:=h[-1 :=0; for j:= 0 step 1 unti! n do ЬШ"-= &[]]; t: = l; kk-lOfk; testO: if h[n] =0 Д n>0 then



begin uin]:=vln]:=0; acc[nj:=kk;

n:=n-1; go to testO end;

g.tart: if n=0 then go to fin;

ps:=qs: = pt:=qt:=s:=0;

.rev: = l; kk: = 10fk;

If n=l then begin r:=-hlll/h[0]; go to lin end;

for j:= 0 step 1 until n do ,, if h[j]0 then s: = s+In(abs(ii[j]));

s:-=exp(s/(n+l));

for j:= 0 step 1 until n do hlj]:=ih[j]/s; if abs (h[n-l]/h[n])>abs(h[l]/hIO]) theii revers: begin t:==-t; m:= (n-1) -r-2;

for j:= 0 step 1 until m do begin s: = hij]; h[j]:=h[n-jl; h[n-j]: = s end

end; Sf qsO then

begin p: = ps; q: = qs; go to iter end; if Щп-2]=0 then begin q: = l; p:=-2 end else begin q: = hi[n]/h[n-2];

p: = (h[n-I]-q X h[n-3]) /h[n-2] end;

if n=2 then go to quadr; r:=0;

iter:

for i:= 1 step 1 until it do begin

bairstow: for ]:= 0 step 1 until n do

-pXb[

qXblj-2]; qXclj-2]

testbn: newton:

begin bO]: = h[j]

c[j]: = b01-pXc[j end;

if h[n-l]=0V4n-1]=0 then go to testbn; if abs(h[n-1]/Цп-l])<kk then go to newton; b[n]:=.hi[n]-qXib[n-2]; if bln]=0 then go to quadr; if abs(h(n]/b[n3) >kk then go to quadr; for j:= 0 step 1 until n do begin dO]:=h[jl+rXdO-1];

eO]: = dO]+rXeO-l] end;

if di[n]=0 then go to lin;

if abs(4n]/d[n3) >kk then go to lin;

Ф-1]:=-p X cin-2]-q X Ф-3];



s: = ctn-212-cln-lix otn-3j; if s=0 Шеп begin p: = p-2; q:=qX(q+l) end else begin p: = p+(b[n-llxc[n-гНЪИх

c[n-3])/s; q:=.q+ ( b[n-1] Xc[n-1] -l-b[n] X

c[n-2])ys end;

r:= if e[n--1]=0 then r-1 else r-d[n]/eln-1] end iter;

ps:=pt; qs:=qt; pt:p; qt:=q; if rev<0 then kk:=kk/10; rev:-rev; go to revers; Iin: if t<0 then r:=:==l/r; u[n]:=r; v[n]:=0; acc[n]:=kk; n:=n-1; Sf n=:0 then go to fin; for j:=0 step 1 until n do

h[i]: = if abs(hlj]/d[j])<kk then d[j] else 0; go to iter; . quadr: If t<0 then

begin p: = p/q; q: -1/q end; s:=q-(p/2)t2; if s>0 then begin s:=sqrt(s); uln]:=uln-1]:=-p/2;

v.[n]: = s; v[n- Ij:=-s end else

begin s:=sqrt(-s);

uln]:== if p<0 then -р/2+s else -p/2-s;

u[n-l]: = q/u[n]; v[n]:=vln-1]:=0 end;

acoIn]:=accIn-l]:=kk; n:=:n-2; if n=0 then go to fin; for j:= 0 step 1 until n do

hO]:= if abs(h[j]/blj]) <kk then bij] else 0; go to start; fin: end rootpol;

Свидетельстве к алгоритму 306

Аяг#ритм 306 получен в ре#ультат« внесения в алгоритм 30а двух поправок, гедлвжвнных Г. В. Пеледовым в его «Замечании н подтверждении к алгоритму 30а» (см. ниже).




[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [ 23 ] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57]

0.0153