Главная страница Алгоритмы [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] „ у4. В качестве функции соответствия сыла взята f,(Xi) =entier ((x-min)/(max-min) X (n-l)), где min - минимальное число данной последовательности; max - максимальное число данной последовательности; п - число элементов вектора х. Подтверждение к алгоритму 23 Р. В. Реншоу (Ranshaw R. W. «САСМ», 1961, № 5) Процедура MATHSORT в том виде, как она опубликована, была закодирована для машины IBM 7070 на языке ФОРТРАН. Обнаружились два дефекта... *. Используя процедуру MATHSORT десять раз и подавая при помощи процедуры / каждую цифру по порядку, 1000 случайных чисел были расположены в монотонную последовательность по 10 цифр в каждой в течение 31 с. Метод отыскания наименьшего элемента, помещения его в качестве первого элемента и продолжения таким образом до тех пор, пока весь список не будет просмотрен, дает полную сортировку тех же 1000 случайных чисел за 227 с. При употреблении сцециальной машииной команды 7070 «поиск минимального числа в таблице» на сортировку той же последовательности случайных чисел было затрачено 56 с. АЛГОРИТМ 246 Решение трехдиагональной системы линейных алгебраических уравнений (с экономией памяти) IF4] Процедура tridag находит решение системы пХл линейных уравнений, имеющих трехдиагональную . матрицу, т. е. ai,j=d для г-/2. Параметрами являются главная диагональ 6р, диагональ ниже главной Ог. диагональ выше главной Сг, правые части d (где р - \,..., п и /=1,...,п-1) и порядок матрицы п. Вектор-решение помещается на место вектора d. Вектор b в процессе вы- числения затирается. На входе должно быть 6[1]#0. * Указываются две ошибки в алгоритме Ш и приводится новая исправленная процедура, соответствующая приведенной в алгоритме 23а. (Прим. ред.) ftfocedure tridag (ri,a,b,c) dataresult: (d); * value n; integer n; array a,b,c,d; begin real w; integer i; w:=bll]; dtl]: = d,[l]/w; for i:= 2 step 1 until n do begin bli-l]:=:c[i-l]/w; w:=b[i]-a[i-1]X b[i-l]; d[i]:= (d[i]-ati-l]Xd[i-l])/w end; for i:= 1 step 1 until n-l do d[n-i]:=-d[n-i]-bin-i]Xd[n-i+1] . end tridag; Свидетельство к алгоритму 246 Алгоритм 246 является стереотипным переизданием алгоритма 24а (если не считать замены строки букв result в заголовке процедуры на dataresult). Свидетельство к алгоритму 24а Алгоритм 24а получен в результате ординарной переработки алгоритма 24 (Leavenworth В. «САСМ», 1960, №11). С помощью т1ра1Нслятора ТА-1 была решена система трех линейных алгебраических уравнений: Xl = 3, 2Xi -i- 2X2 -\-х= 6, Xi-\-x,3. Результаты решения: Точные значения: Ё л;, =0.999999973, 1.0, f л;, = 1.00000001, 1.0, * л;, = 1.99999999. 2.0. АЛГОРИТМ 256 Нахождение вещественных корней произвольной f \ функции методом Мюллера [С5] Эта процедура находит вещественные корни с, произвольной функции методом Мюллера [12i, 251, 26i]. Каждая итерация определяет корень кривой второго по- рядка, проведенной через три точки, заданные тремя по-следними значениями функции. Если с,-О, то в качестве начальных значений функции процедура берёт -1, 1 и 0. Если же заданы Сг = 30, то начальные значения равны 0.9Р, 1.1 ри ,р.. Параметры процедуры: п - ожидаемое число корней; func{r, f) вычисляет 31начение функции f но-данному аргументу г; max - максимально допустимое число итераций; epsl-относительный КритерИЙ сходимости итераций; eps2 - абсолютный критерий сходимости по значениям функции; eta используется для кратных корней таким образом, что если \r-Ci \ <eps3, то г заменяется на r+eta. Можно пользоваться, например, параметрами: epsl = = 10-в, eps2= 10-18, eps3==10-*8, eta= 10 procedure zeros(func,n,rnax,epsl,eps2,eps3,eta) dataresult: (c); value n,max,epsl,eps2,eps3,eta; real epsl,eps2,eps3, eta; integer n,max; array c; procedure func; begin real p,pl,p2,x0,xl,x2,r,f,fl,d,e,h,u,v,w,t; integer i,j,k; switch s: = sl,s2,s3,s4; for k:==l step 1 until n do begin j:=0; p:=0.9Xc[k]; • ph=l.lXc{k]; p2: = 4k]; if c[k]=0 then begin p:=:-1; pl: = l; p2:=0 end; r: = p; go to reg; sl: r:.= pl; xO:=fl; go to reg; . - , s2: r: = p2; xl: = fl; go to reg; s3: x2: = fl; d:=-0.5; h:= if c[k]=0 then -1 else -0.lXc[k]; iter: e:=l + d; t:=xOXdt2-xlXet2+x2X(d+e); u:=tt2-4Xx2XdXeX (xOXd-xl Xe-bx2); u:=if u <0 then 0 else sqrt(u); v:=t+u; w:=i-u; u:= if abs(v) abs(w) then w else v; if u=:0 then u: = l; [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.0122 |