Главная Промышленная автоматика.

for i:=0 step 1 until n-1 do

begin alpha[i]: = alp.ha[i] X gamma + xO; beta[i]: == beta[i] X gamm a

end i; lambda: = gamma; coda(n,c);

comment Мы можем теперь заново вычислить полином из степенного ряда; for j: = l step 1 until г do begin xl:=zO]; f: = cln]; for i:=n-1 step -1 until 0 do f:=fXxl+c[i]; outreal(l,xl); outreal(l,f) end j

end xl end curfit;

Свидетельство к алгоритму 746 Процедура curfit алгоритма 746 не отличается от процедуры curfit алгоритма 74а, за исключением того, что был изменен порядок расположения параметров в заголовке процедуры, а именно выходные параметры помещены в конце списка формальных параметров и отделены от остальных параметров разделителем параметров

) result: (

В комментариях к процедуре curfit были сделаны некоторые уточнения. Название алгоритма заменено более полным.

Алгоритм был транслирован в системе ТА-1М на машине М-220 с предварительной заменой в процедуре curfit двух операторов

outreal(l,z[j]); outreal(l,f)

на оператор и операторов на оператор

pl04l(zO],f) outreal(l,xl); outreal(l,i)

р1041(х1,[)

в соответствии с системой ввода-вывода транслятора ТА-1М. Входные массивы были описаны в начале ведущей программы следующим образом:

array a,b[ 1 :k],x,y,w{ 1 :m],alpha,beta[0:п- l],z[ 1 :r],

s,c[0:n],sgmsq[k:n]; Были проведены следующие варианты контрольных решений.

1. Аппроксимация точек, лежащих на одной прямой, полиномом первой степени.

Задавались n=k=l; а[1:1]=2; Ь[1:1]=-3; г=1; z[l:l]==l; Хо=0; gamma=\ при следующих вариантах значений остальных параметров.

1а. Аппроксимация одной точки, т. е. т-\; х[1:1]=0; г/[1:1]=1; а;[1:1]=1.

Получено с[0:1]= (1,1), т. е. точное уравнение г/=х+1 прямой, проходящей через две заданные точки (ai,bi) = (2,3) и (xi,i/i) = (0,1). В процессе своего выполнения процедура дважды напечатала пару чисел (1,2), соответствующую 2[1]=1 и /=2.

16. Аппроксимация четырех точек, т. е. т=4; л;[1:4]= (0,1,3,5); Ml:41=( 1,2,4,6); U)[l:4]=(l,l,l,l).



Получено с[0:1]=(1Д). т. е. то же, что и в предыдущем случае. О точности аппроксимации в этом случае можно было бы судить и по значению sgmsq-0.

1в. Вариация масштабных коэффициентов xQ и gamma.

Значения Хо и gamma на результатах аппроксимации не отражаются, и их МОЖНО задавать любыми (кроме gamma=0). Так результаты трансляции для тех же параметров, что и в п. 16, но при {Хо, gamma) -(-1,- I), (-1,2) и (1,1), ничем не отличались от результатов п. 16. Однако нужно иметь в виду, что при задании {Xogamma) Ф(!д,\) выходные значения х, у и w будут отличаться от входных. Масштабные коэффициенты {xB,gamma) ф (0,1) можно использовать, например, для ликвидации переполнения или потери точности, которые могут возникнуть в процессе выполнения процедуры.

2. Аппроксимация точек параболы у=х+\ полиномом второй степени.

Задавались n=k2; а[1:2]=)(0.5,4.5); 6[1:2]= (1.25,21.25); г=1з 2[1:1]==1; д;о=0; gatnma==l при следующих вариантах остальных параметров.

2а. Аппроксимация шести точек одной из ветвей параболы, т. е. т=6; 41:6]= (0,1,2,3,4,5); /[1:6]= (1,2,5.10.17.26); u)[l:6]= (1.1,1,1,1,1).

Получено 40:2]= (0.96021126, 0.11619718, 0.92676056), в то время как точные коэффициенты параболы должны быть (1,0,1). Неудовлетворительность аппроксимации видна и по значению sgms=0.47l 14436. Улучшить аппроксимацию можно подбором весовых коэффициентов, как это видно из нижеследующего пункта.

26. Подбор весовых коэффициентов.

После замены весов на aj[l:6]=i(0.5,l,1,1,1,0.5) при остальных параметрах тех же, что и в п. 2а, были получены точные коэффициенты полинома <?[0:2]= (1,0,1) и соответственно sgmsq=Q. Такие же результаты были и для значений су[1:6]= (0,0.5.1.1,0.5.0), (0.5,0.75,-1,1,0.75,0.5) (0.5,1,1,1,1,1).

2в. Аппроксимация И точек обеих ветвей параболы, т. е. т=1Т; 41:11]= (-5,-4,-3,-2,-1,0.1.2,3,4,5); 1:111= (26,17,10,5,2.1.2,5.10,17, 26); и;[1:11]=(0.5,0.75,1,1,1,1,1,1,1,0.75,0.5).

Получено точное решение с[0:2]= (1,0,1), sgmsq=0. Но при задании всех весов равными единице, было полученэ столь же неудовлетворительное решение, что и в п. 2а.

Таблица U

г[»Т

f при а)=а;1

f при U)=ai2

exp{z\i\)

0.25

1.0873588

1.0893908

1.2840254

0.75

2.1870061

2.1860578

2.1170000

1.25

3.5216607

3.5209833

3.4903429

1.75

5.7459572

5.7466345

5.7546026

2.25

9.5145303

9.5154786

9.4877358

2.75

15.482014

15.479982

15.642631

3. Аппроксимация точек экспоненты у=е, заданной четырьмя точками,, т. е. т=4; х[1:4]= (0.1,2,3); уЩ==ехр.{х[1\ для t= 1,2,3,4; л;о=0; Y=l; г=6; z[l:6]= (0.25,0.75,1.25,1.75.2.25,2.75) параболой п=3, прохо-



дящей через три точки а[1:3]= (0.5,1.5,2.5) и b[i]=exp{a[i]) для t= 1,2,3 при w=wl= (1,1,1,1) и Щ) = Щ)2=,(0.5,1,1,0.5).

Полученные в результате трансляции ординаты f аппроксимирующей кривой в заданных точках z[i] приведены в табл. И.

Значения sgmsq были 0.22944672 при w=w2 и 0.15392303 при w=wl.

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

Алгоритм 74а получен в результате ординарной переработки алгоритма 74 (Реек J. Е. L. «САСМ», 1962, № 1).

В алгоритме 74 была обнаружена опечатка во второй строке после метки start, а именно, символ «=» должен быть заменен символом-«:=». Кроме того, проведена модификация алгоритма 74, заключающаяся в замене всех указаний о выдаче параметров на обращения к процедуре outreal, рекомендованной международным АЛГОЛ-коми-тетом в 1964 г. [21].

Подтверждение к алгоритму 74

К. Исода (I s о d а К. «САСМ», 1963, № 6)

Алгоритм 74 был вручную переведен на язык SOAP Па для машины IBM 650 и успешно прошел без всяких исправлений, кроме случая, когда начало (0,0) дается как условие или как проба.

АЛГОРИТМ 756

Разложение многочлена на множители [С2]

Процедура factors (factors - множители) находит все рациональные линейные множители (uiX+Vi), где lir, многочлена floX"+aiX"--t-...+ап-1л;+а„ с целыми коэффициентами. Кроме того, находится общий наибольший делитель с коэффициентов ai.

Метод заключается в том, что находятся все делители р коэффициента flo и все делители q коэффициента а„ (причем lploof и 19а„). Составляются всевозможные пары из найденных р и q. и проверяется, не является ли двучлен (px-q) множителем многочлена.

procedure factors (n,a) result: (u,v,r,c);

value n; integer n,r,c; integer array a,u,v; begin integer i,f,g,p,q;

r:=0;c: = l;

comment Сначала исключаются множители вида (IXx-0);. zero: if a[n]=0 then

begin n: = n-1; r:=r-M; u[r]: = l; vlr]:=0; go to zero end zero; for p:=l step 1 until abs(al0]) do if (alO]-p)Xp=a[0]then begin comment Найден p, являющийся делителем ao; for q:=l step 1 until abs(a[n]) do





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

0.0034