Главная страница Алгоритмы [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 П. Дж. Рейдер (Rader Р. J. «САСМ», 1961, № 3) Процедура bisec была запрограммирована для машины Royal Precision LGP-30, использующей систему 24.2 интерпретации плавающей запятой с 28 разрядами. В алгоритме необходимо заменить go toyl на gotoyi. После этих исправлений программа прошла хорошо для f{x)=cosx с пераметрами, указанными в табл. 2. Таблица 2 eps I Результат 1.55 2 2 2 2 0.001 0.001 0.001 0.001 0.001 0.001 0.001 signal 1.5703 1.5703 1.5500 1.5625 Эти комбинации параметров проверяют все ветви программы. Алогритм 46 является стереотипным переизданием алгоритма 4а. В «Подтверждении к алгоритму 4» [24] была исправлена одна опечатка: F{x) заменено на /(х). Алгоритм 4а в том виде, как он опубликован, успешно используется в системе БЭСМ-АЛГОЛ. Свидетельство к алгоритму 4а Алгоритм 4а получен в результате переработки алгоритма 4 (G огп S. «САСМ», 1960, № 3), Тело процедуры по существу заново написано в более короткой и наглядной форме. После переработки алгоритм 4а был нроверен с теми же исходными данньши, .которые указаны в нижеследующем подтверждении к алгоритму 4, для первых трех случаев. Получены результаты: 1) выход яа метку signal, 2) 1.67080078, 3) 1.57080078. Вычисление функции Бееселя первого рода разложением в ряд [S18] Процедура bessl вычисляет беоселеву функцию 1-го рода Jriiix), где п и х находятся в пределах, допускающих разложение в ряд. Оператор обращения к .процедуре имеет параметры п, х и абсолютную погрешность eps для определения места, начиная с которого членами ряда можно пренебречь. Особый случай: /о(0) =1. real procedure bessl (n,x,eps); value n,x; real x,eps; integer n; begin real k,term,sum,snfac; integer s,t-, . s-=0; x:=x/2; sum:-term: = snfac:=k: = l; if x=0 Л n=0 then go to fin; for t:= 2 step 1 until n do snfac: = snfacXt; k:=xfn/snfac; x:=xXx; iter: s::=s+l; term:=-termXx/(sX (s+n)); sum: = sum+term; if abs (term) >eps then go to iter; fin: bessl:=kXsum end bessl; Свидетельство к алгоритму 56 Алгоритм 56 получен путем замены процедуры bessl алгоритма 5а процедурой bessl, приведенной в «Замечании к алгоритму 5а» Л. Ф. Лебедева [27, с. 172], с предварительным исправлением в последней одной семантической ошибки. Начало тела .процедуры bessl, имевшее вид begin real k,term,sum; integer s,snfac,t; было заменено на begin real k,term,sum,snfac; integer s,t; Изменение типа integer переменной snfac на real делает семантически допустимым в теле процедуры оператор sum: = term: = snf ас: = к: = 1; Кроме того, такое изменение типа приводит к расширению области применимости алгоритма (это было замечено В. Я- Андерсоном в письме от 27.8.68 редактору выпусков) и к некоторому ускорению выполнения процедуры на машине. Алгоритм 56 был транслирован IB системе ТА-.1М на машине М-220 и дал результаты, приведенные в табл. 3. Таблица 3
Контрольные значения /п(л;) в табл. 3 взяты из работы А. Чистовой [31]. Вычисленные значения /„(х) в табл. 3 не отличаются от вычисленных значений Jn{x) в табл. 36, приведенной в «Замечании к алгоритму 5а» Л. Ф. Лебедева [27], кроме случая n-Q и л;=8.5, тде отмечено расхождение в двух последних цифрах.- Бесселевы функции первого рода можно вычислять также и с помощью более совершенного, но более сложного алгоритма 236а. Свидетельство к алгоритму 66 Алгоритм 66 не публикуется здесь потому, что для вычисления бесселевых функций /„(л;) опубликован более совершенный алгоритм 236а, пригодный не только для целых п и не только для больших х. Как показали расчеты, алгоритм 6 на машине М-220 приводит к переполнению уже при л:<;6.5 (для п=0 и 1). АЛГОРИТМ 76 Алгоритм Евклида для нахождения общего наибольшего делителя двух целых чисел [А1] Процедура comdiv находит общий наибольший делитель любой пары целых чисел а и Ь, для которых о+&>0 (com - начальные буквы слова common - общий, а div - начальные буквы слова divisor - делитель). [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.0173 |