Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги из ГПНТБ / Смолов, В. Б. Аналого-цифровые и цифро-аналоговые нелинейные вычислительные устройства

.pdf
Скачиваний:
20
Добавлен:
22.10.2023
Размер:
10.52 Mб
Скачать

функции в виде процедуры, включаемой в программу на этапе трансляции, так и при задании функции в виде массива на перфоленте или магнитной ленте. Необходимость преобразования и смещения функции определяется управляющими переменными, значения'.которых задаются проектировщиком.

Монотонные функции, не имеющие точек перегиба, программа разделяет на четыре типа в зависимости от сочетаний знаков первой и второй производ­ ных. Она относит к первому типу функции с положительной первой и отри­ цательной второй производными, ко второму типу — функции с положитель­ ной первой и положительной второй производными, к третьему типу — функции с отрицательной первой и положительной второй производными, а к четвертому типу—функции, первая и вторая производные которых от­ рицательны. Номер типа заданной функции программа записывает в двенад­ цатую строку массива sol.

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

кратна степени числа два. Режим работы программы определяется перемен­ ной о. Если о = 0, то в исходных данных для программы задается число участков аппроксимации махе и она находит коэффициенты аппроксими­ рующей зависимости и относительную погрешность eps. Если же о — 1, то

программа определяет необходимое число участков, на которое разбивается аргумент для получения относительной погрешности eps, и коэффициенты

искомой зависимости. Вид аппроксимирующей зависимости определяется соответствующей стандартной процедурой, включаемой в программу на этапе трансляции. В случае КЛА в программу включается стандартная процедура Ip 1, а при ККА используется стандартная процедура 1р2.

При задании погрешности аппроксимации eps в массиве ар могут быть незаполненные строки. В этом случае из массива ар с помощью стандартной процедуры 1рЪ формируется массив ргар, число строк которого определяется

количеством участков аппроксимации, а количество и назначение столбцов совпадает с числом и назначением столбцов массива ар. Массив ргар запи­

сывается на системную магнитную ленту и печатается.

В программе используются следующие обозначения переменных: q оп­ ределяет вид аппроксимирующей зависимости, Id. — число точек на участке аппроксимации, stn — число участков аппроксимации, nw — текущий но­ мер строки массива ар.

begin real хп, xk, hx, eps, tnaxe, fmax;

integer n, tiacii, kon, Id, nw, maxs, sm, q, v;

array sv [1 : 14];

 

 

 

read (eps, maxs, q, v);

 

 

 

read tape

(svl,

sv);

 

 

n : — sv [2];

xn : =

sv

[3];

xk : = sv

[4];

fmax : =

sv

[7];

hx : =

(xk xn)l(n—1);

if v =

1

then

maxs : =

n ч-

(q + 1);

begin

array

f [0 : n—1],

ар [1 : maxs, 1 : q}+ 6];

procedure

Ip 1;

 

 

 

procedure

Ip

3;

 

 

 

read tape

(ft,

f);

 

 

 

mo: if v =

0 then

1; nach : = 0; Id: = n-~maxs;

begin nw : =

for

kon : =

nach -f Id 1

while nw <; maxs do

begin Ip1 (nach, kon, nw); nw : = nw -+- 1;

 

nach : — kon + 1

 

 

 

end;

 

 

 

 

to

mb

 

nw : — nw — 1; go

 

end;

 

 

 

 

 

 

 

 

240

ml :ld : — n; sm : — 1;

m2 \maxe : = 0; nach : = 0; nw : =

1;

m3 :kon : — nach +

Id — 1; /pi (rnzc/i, kon, nw);

if ap [nw, q +

6] >maxe then

maxe : — ap [nw, q -f 61;

if no>>sm then go to m4;

 

nw : = nw + 1;

nach : — kon -j- 1; go to m3;

m4 :if maxe <feps then go to m5;

sm : = sm X 2; Id : = ld~r-2; go to m2;

m5 :begin array

prap [1 : nw, 1

: q + 6];

Ip 3 (ap,

prap);

 

print

(prap);

 

write

tape

(prap, prapl);

 

sv [14] : =

nw;

 

write

tape

(sv, svl)

 

end

 

 

 

 

end

 

 

 

 

end

 

 

 

 

Программа построения аппроксимирующей зависимости при разбиении отрезка задания аргумента на участки, длина которых кратна степени числа два. Настоящая программа отличается от предыдущей тем, что при построе­ нии аппроксимирующей зависимости по заданной погрешности eps она де­

лит заданный отрезок на участки различной длины, но пропорциональные степени числа два. Поиск необходимого числа участков осуществляется пу­ тем последовательного деления пополам тех участков, на которых погреш­ ность аппроксимации превышает eps. Каждый шаг процесса поиска состоит

из анализа погрешности на каждом участке аппроксимации, полученном на предыдущем шаге, и формирования участков аппроксимации текущего шага. При этом массив ар разбивается на две части. В одной части массива распо­

лагаются границы участков и параметры аппроксимирующей зависимости, полученной на предыдущем шаге поиска, а во второй части запйсываются ре­ зультаты аппроксимации, полученные при выполнении текущего шага. Часть массива, используемая для записи результатов аппроксимации в текущем шаге, определяется переменной р, значение которой изменяется при пере­

ходе к. следующему шагу.

В этой программе используются в основном те же обозначения, что и в предыдущей программе. Переменная so определяет число участков аппрок­

симации, полученное на предыдущем^шаге.

begin real хп, xk, hx, eps, fmax;

nr, q,

so, sn, ns,

p,

 

integer n,

nach,

kon,

Id,

nw,

 

k, maxs;

 

 

 

 

 

 

 

 

 

 

array

sv

[1 : 141;

 

 

 

 

 

 

 

read (eps,

q);

 

sv);

 

 

 

 

 

 

 

read

tape

(svl,

sv

[3];

xk : = sv [4];

fmax

: = sv [7 ];

n : =

sv

[2];

xn : =

hx : = (xkxn)l(n—1); maxs : = n

(q +

1);

: q +

 

begin

array /

[0 : n— 1 ],

ap

[1 : 2

X maxs,

1

6];

procedure

Ip

1;

 

 

 

 

 

 

 

procedure

Ip

3;

 

 

 

 

 

 

 

read tape

(fl, f);

 

: =

0; /pi

(0, n—1, 1);

 

Id : =

n;

sn : = 1; p

 

mo : Id : =;

ld-~2; so : =

sn; sn : =

1;

 

 

 

241

if

jo =

0

then

nw : =

maxs +

1

end

else

 

begin

nr : =

1;

 

begin

nr : =

maxs +

1;

nw : =

n end;

 

 

ml : if ap [nr, q -f 6]

eps then

q -f 6 do

 

begin for

k : =

1 step 1

until

 

 

ap [nw, k) : = ap [nr, k\;

go to m2

 

end;

 

ap

[nr, 1 ];

kon : =

nach +

Id — 1;

 

nach : =

sn + 1;

lp\ {nach, kon,

nw)\

nw : = nw +

1;

sn : =

nach : =

kon +

1; kon\ — nach +

Id — 1;

 

Ipl {nach, kon, nw);

 

nr +

 

 

sn : = sn +

 

m2 : nw : — nw -j- 1; nr : =

1;

 

1;

m3 : ns : — if p =

0 then

nr else nr maxs;

 

mi : if

ns

 

so then go to ml;

p : =

 

 

 

 

if

p = 0

then p : =

1 else

0; •

 

 

m5 : if

sn> so then

go to

mO;

 

 

 

 

 

 

 

sn : =

sn — 1;

 

 

 

: q +

 

 

 

 

m6 : begin array prap [1 : sn, 1

6];

 

 

 

lp3

{ap, prap);

 

 

 

 

 

 

 

 

 

 

print

{prap);

 

 

 

 

 

 

 

 

 

 

 

write tape {prap, prapl); .

 

 

 

 

 

 

 

sv [14] : = sn;

 

 

 

 

 

 

 

 

 

 

write

tape

{sv, svl)

 

 

 

 

 

 

 

 

end

end

end

Программа построения аппроксимирующей зависимости с наименьшим числом участков. Программа предназначена для .нахождения наименьшего числа участков аппроксимации путем последовательного определения участ­ ков наибольшей длины, обеспечивающих приближение функции с заданной относительной погрешностью eps.

Разбиение аргумента функции на участки производится последовательно, причем на каждом шаге этой последовательности с помощью метода поиска делением пополам определяются границы одного участка аппроксимации. Направление разбиения аргумента задается системой переменной р. Если

крутизна функции имеет большее значение в окрестности начальной точки области задания аргумента = 0), то разбиение аргумента, выполняет, на­ чиная с точки, соответствующей значению хп. В противном случае (р = 1)

разбиение аргумента функции осуществляется от точки, соответствующей

значению xk. Образование новых участков

аппроксимации продолжается

до тех пор, пока искомая граница участка не

совпадет с концом области за­

дания аргумента xk (р = 0) или началом хп,

если р = 1.

При отыскании границ участков аппроксимации могут получиться участки, для которых построение аппроксимирующей зависимости выпол­ нить невозможно. Такими участками являются участки, задаваемые одной точкой в случае КЛА и одной или двумя точками в случае ККА. Если они обнаруживаются, то длина последнего участка увеличивается на длину участка, для которого нельзя построить аппроксимирующую зависимость, и снова производится аппроксимация функции на последнем участке.

begin real хп, xk, hx, eps, fthax;

integer n, nach, kon, l, r, nw, m, p, q;

242

array

sv

[1 : 14];

 

 

 

 

 

 

 

 

 

 

read

(eps,

q);

 

 

 

 

 

 

 

 

 

 

 

 

read tape (svl, sv);

 

 

[4]; n : = sv

 

fmax : =

sv [73;

xn: =

sv

[3]; xk : — sv

[2];

p : =

sv

[13];

[0 : n — 1 ],

ap

[1 : n ~ q ,

 

 

 

begin

array

f

<7 +

6];

 

procedure

Ip

1;

 

 

 

 

 

 

 

 

 

 

procedure

Ip

3;

 

 

 

 

 

 

 

 

 

 

read tape

(ft,

/);

 

 

nw : = 1;

 

 

 

 

 

hx : =

(xkxn)l(n 1);

 

 

 

 

 

if p = 1

then

go to m5;

 

 

 

 

 

 

 

mO : nach : = 0;

 

l : =

nach;

r : — kon;

go to m3;

 

 

ml : kon : =

 

n— 1;

 

 

m2 : kon : =

 

(/-+- r)-r-2;

 

 

 

 

 

 

 

 

 

m3 : tpi (nach, kon, nw)',

 

 

then l : =

kon

 

r : =

kon\

if

ap

[nw,

q +

6 ]< ep s

else

if rl

>

1

then

go

to m2;

 

 

 

 

 

 

kon : =

/;

 

then

go

to

mlO;

 

 

 

 

 

if

kon =

 

и—1

 

 

 

 

 

nach : =

 

kon

 

1;

then

 

 

 

 

 

 

 

m4 : if п — nach <

q— 1

 

nw)\

 

 

 

 

 

begin Ip1

(ap

[nw,

1],

ft— 1;

go

to

mlO end;

 

nw : =

nw +

1; go to ml;

 

 

 

 

 

 

 

m5 : kon : =

 

n— 1;

 

 

 

r : =

kon\

 

 

 

 

 

m6 : nach : = 0; l : = nach\

go

to

m8;

 

 

ml : nach : — (l

 

p)--.~2;

 

 

 

 

 

 

 

 

 

m8 : Ip1 (nach, kon, nw);

 

 

 

r : =

nach else

 

nach;

if ap [nw, q -|-

S le ep s then

/ : —

if

r—/ > 1

 

then

go

to

ml;

 

 

 

 

 

 

nach : =

r;

 

 

 

 

 

 

 

 

 

 

 

 

if

nach =

0

then go

to

mlO;

 

 

 

 

 

 

kon : — nach — 1;

 

 

 

 

 

 

 

 

 

m9 : if

kon < 9

— 1

then

 

 

nw); go to mlO end;

 

 

begin Ip1 (0, ap

[nw, 3],

 

 

nw ; =

nw +

1; go to m6;

 

 

 

 

 

 

 

mlO ; begin

array prap [1 : nw, 1

: <7 +

6];

 

 

 

 

lp3

(ap,

prap);

 

 

 

 

 

 

 

 

 

 

print

(prap);

 

prapl);

 

 

 

 

 

 

 

write

tape

(prap,

 

 

 

 

 

 

 

sv [14] : = nw;

 

 

 

 

 

 

 

 

 

 

write

tape (sv, svl)

 

 

 

 

 

 

 

 

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Библиотечная процедура 1р2.

Библиотечная процедура 1р2 используется

в программах ККА для построения полинома Лагранжа второй степени на участке аппроксимации.

Формальными параметрами процедуры являются: номера точек аргу­ мента, соответствующие началу t\ и концу t2 участка аппроксимации, и

243

номер строки массива ар, в которую записываются параметры, характери­ зующие аппроксимирующую зависимость на участке, заданном интервалом

\t 1, /2].

Впроцедуре сначала вычисляются узлы аппроксимации по формулам

(6-19), приведенным в § 6-1, причем в качестве начала и конца участка аппрок­ симации используются номера точек И и Й. Полученные значения коорди­ нат узлов аппроксимации округляются до ближайших целых чисел, которые заносятся в массив дискретных значений узлов аппроксимации xd. Они ис­ пользуются в программе для выбора значений функции из массива fj в узлах

аппроксимации. Эти значения функции обозначаются в программе перемен­ ными ffl, ^1 и [2.

Коэффициенты квадратичного полинома А2, А1, АО вычисляются по фор­ мулам (6-18), причем в качестве узлов аппроксимации для вычисления ко­ эффициентов принимаются действительные значения аргумента функции хО,

х1 и х2.

Если число точек аргумента на участке аппроксимации равно трем, узлы аппроксимации вычисляются с помощью оператора, помеченного мет­ кой m l.

Если число точек аргумента на интервале \t\, t2 ] больше, чем три, то

для каждой точки задания аргумента вычисляется значение абсолютной по­ грешности аппроксимации е, из которых выбирается максимальное значение погрешности етах. После определения значения етах производится попытка

уменьшения этой погрешности за счет сдвигов узлов аппроксимации. Сдвиг узлов аппроксимации осуществляется с помощью эвристического алгоритма который основан на анализе распределения погрешности в различных точках участка, на котором строится квадратичный полином.

Поскольку первоначальный выбор узлов аппроксимации производится по формулам (6-19), то в этом случае абсолютная погрешность аппроксимации трижды меняет знак на каждом участке и в таблице погрешностей имеется четыре экстремальных значения погрешности. Модули экстремальных зна­ чений погрешностей вычисляются и записываются в массив ет. Для запоми­

нания знака погрешности на интервале, где погрешность имеет одинаковый знак, используется переменная signe. Затем в массиве ем отыскивается ми­

нимальное по модулю значение погрешности.

Сдвиг узлов в аппроксимации осуществляется с целью нахождения та­ ких узлов, при которых модули экстремальных погрешностей приблизитель­ но выравниваются (в данной программе это выравнивание производится с точностью 10%). Для дальнейшего сравнения экстремальных значений погрешностей формируется целочисленный массив de. Элементы этого массива соответствуют значениям экстремумов'Тюгрешности из массива ем и прини­

мают значения 1 или 0 в зависимости от величины экстремальных значений. Если разность между экстремальным значением погрешности и f,min меньше, чем 0,1 етах, то соответствующий данному экстремальному значению элемент массива de принимает значение 1, в противном случае — 0. Таким образом,

для каждого распределения погрешности можно получить двоичный код, разрядами которого являются значения элементов массива de.

Направление и величины сдвига узлов для каждого конкретного рас­ пределения погрешности были выбраны на основании серии опытов, прове­ денных для ряда функций, и иллюстрируются табл. 11-1. Первый столбец этой таблицы отводится для записи двоичного кода, соответствующего эле­ ментам массива de, во втором столбце расположен рисунок, иллюстрирующий

один из возможных вариантов распределения погрешности для двоичного кода расположенного в этой строке таблицы, и направление сдвига узлов аппроксимации, а в третьем, четвертом и пятом столбцах указано количество точек, на которое сдвигается узел. Если число точек, на которое сдвигается узел, в таблице напечатано со знаком минус, то сдвиг осуществляется в ле­ вую сторону, в противном случае узлы аппроксимации сдвигаются вправо. Приведенный в таблице алгоритм сдвига узлов в программе реализуется группой операторов, начинающейся с меткой т9. Оператор с меткой т \7

осуществляет вычисление массива новых значений узлов аппроксимации

244

Таблица 11-1

Распределение погрешности и величины сдвига узлов

$ Двоичный

Условное изображение

dx [0]

dx [1]

dx [2]

код

0000

0001

0010

ООП

0100

0101

- Л

;

Х

Г Х

X

X

0

0 '

0

+ 5

+ 5

+ 1

+ 1

+ 2

— 1

r f 2

+ 3

■ + 1

 

 

+ 1

—2

— 1

+ 1

— 1

+ 1

о н о

+ 1

0

— 1

0111

X

V

+ 3

+ 2

+ 1

 

 

1000

 

 

— 1

— 5

— 5

245

Двоичный

код

1001

1010

1011

1100

1101

1110

Условное изображение

Х А -

\ г ^

V v

П родолж ение

т а б л . 11-1

dx [0]

dx [1]

dx[ 2]

— 1

0

+ 1

— 1

+ 1

— 1

— 1

+ 2

+ 1

— 1

—з .

— 2

— 1

— 2

+ 1

— 1

—2

— 3

xdn по значениям узлов аппроксимации xd, выбранным на предыдущем шаге)

и значениям приращений узлов аппроксимации, которые находятся в мас­ сиве dx.

Описанный алгоритм сдвига узлов в программе дополняется проверкой расстояний, которые получаются между новыми значениями узлов. Если в ре­ зультате Сдвига узлов это расстояние становится отрицательным или равным нулю, то в программе производится сдвиг в противоположную сторону тех

узлов, для которых имеет место нарушение приведенного

выше условия.

В противном случае новые значения узлов xdn засылаются

в массив xd и

осуществляется переход к вычислению коэффициентов полинома при выбран­ ных узлах аппроксимации и максимальной погрешности емах, которая и сравнивается с максимальной погрешностью epsM, имевшей место на преды­

дущем шаге определения узлов аппроксимации. Процесс сдвига узлов повто­ ряется до тех пор, пока все экстремальные значения погрешностей не станут равными с заданной степенью точности или пока новый сдвиг узлов не вызо­ вет погрешности, превышающейпогрешность на предыдущем шаге. В этом случае сдвиг узлов заканчивается, и в соответствующие строки массива за­

246

носятся коэффициенты полинома и максимальная погрешность аппрокси­ мации на участке. Управляющая переменная q, которая в начале программы принимается равной нулю, служит для присвоения переменной epsM значе­ ния максимальной погрешности ежах на первом шаге сдвига узлов.

procedure 1р2 (tl,

t2,

 

/3);

 

 

 

 

 

 

 

 

 

 

value

tl,

й ;

/3;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

integer tl,

/2,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

begin real e, emax, etnin, epsm, x, *0, xl, x2, vl, v2,

 

/0, /1, /2, cO, cl, c2, aO, a\, a2;

 

 

 

 

 

 

integer l, j, g, q, signe, dx10, dx21;

 

 

 

 

 

array em [1 : 4];

 

[1 : 4], xd, xdn, dx

 

 

 

 

 

integer

array

de

 

 

[0 :2 ];

 

 

g : = q : = 0; epsm : = 0;

2] : = xn -f

tl

X hx\

 

ар

Ш ,

1 ] : =

tl\

 

ар

U3,

 

ap

[73,

3] : =

i2\

 

ap

[/3,

4 ]: — xn +

t2 X hx\

 

ml : if

t2—tl — 2

then

 

xd

 

 

t\

 

1; xd

 

 

 

begin xd

[0] : =

 

tl\

[1 ] : =

+

[2]

: = 72;

 

go to m4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end;

 

 

=

1

then

 

 

 

 

 

 

 

 

 

 

 

 

m2 : if

t2—tl

 

 

 

 

 

 

 

 

ap

 

 

 

begin

ар

U3,

5] : = ap U3, 8] : = 0;

 

U3,

7]

: = / [fl ];

 

ap

U3,

6 ]: =

(f

U2] f (tl ])/hx\

go to fin

 

 

end;

 

(t2 +

tl)!2.0;

v2 : =

(t2— tl)/2.0;

 

 

 

m3 : vl

: =

 

 

 

xd

[0]

: =

entier

(0.5 +

(wl — v2 X cos (0.5236)));

xd

[1] : = entier (0,5

+

(vl — v2 X cos (1.570796)));

xd

[2]

: =

entier

(0.5 +

(t>l — t>2

X cos (2.618)));

 

m4 : fO : — f

Ixd [0]];

/1

: =

f [xd [1]]; /2

: =

/ [xd [2]];

xO : — xn

+

hx X xd [0];

xl : =

xn +

hx X xd

[1 ];

x2 : = xn

+

hx X xd [2 ];

cO: =

f0l(x0 — xl)/(x0 x2);

cl : = fl/(xl—x0)/(xlx2)\ c2 : = f2l(x2—x0)/(x2—xl);

a2 : =

cO +

cl +

 

c2\

aO : = cO X xl

X x2 + cl

X xO X

x2 +

c2 X xO X xl;

 

x2) — cl X (xO + x2) — c2 X (xQ +xl)

al

: = — cO x

(xl +

 

it ё Ф 0 then go to fin\

 

 

 

 

 

 

 

 

 

mb ', if

t2—tl

=

2 then

: = a2\

apШ, 6] : = al;

 

 

begin

ap

Ш,

5]

 

 

 

ap [Й, 7]

: =

aO;

ap Ш, 8] :. = 0;

go

to fin

 

end;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m6 : for

l : =

1 step 1

until

4 do em

[/]:==

0;

 

 

 

x : — ap

U3,

2];

 

/ : =

1; emax : = 0;

 

X x -,L aO));'

signe : =

sign (f

[til

((a2 x

x + al)

for /

: =

tl

step

1

until

t2

do

 

 

 

 

 

 

 

begin

e : =

f

[/] — ((a2 X x + al) x ^

+

aO);

 

 

 

if abs (e) >

emax then emax : =

abs (e);

 

 

 

 

if e -=f=0 Д sign

(e) ±f=signe then

 

 

 

 

 

 

begin

signe : =

 

sign

(e);

/ :

= / + !

 

end;

 

 

 

if

abs (e) >

em

U]

then

em

[/]

: = abs (e);

 

 

247

 

х : — х +

hx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end;

 

0 then begin q : =

 

1; go to m8 end;

 

 

 

 

 

 

m 7 : if q =

 

 

 

 

 

 

 

 

if emax

epsm then

go

to

fin;

a2\ ap

 

 

 

 

 

 

 

 

 

m8 : epsm : = emax\ ap U3,

5]

 

: =

 

[f3, 6]

: — al;

em

[1 ];

ap

f/3,

7 ] : --- aO;

ap Ш, 8]

: =

epsm!fmax\ emin : =

for l

 

 

l

step

1

until

4

do

em [/];

 

 

 

 

 

 

 

 

if em [l]—emin then emin : =

 

 

 

 

 

 

 

 

for /

: =

1

step

1

until

4

do

then de

[/]

: =

0

 

 

 

if

(em

[Л > emin)/emax <

0.1

 

 

 

else de

[/]

: =

1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m9 : if de [4] =

1

then

 

 

 

 

dx

 

 

 

 

 

 

dx

 

 

 

 

begin

if xd

[2 ] <

t2 then

[2 ] : =

1

 

else

[2 ] ; =

0

end;

if

de

[1 ] =

0 then go to ml3;

 

 

 

 

dx

 

 

 

 

 

 

if xd

[0 ] >

tl

then

dx

[0 ] : =

— 1 else

[0 ] : =

0;

 

 

if

de

[2]

=

0

then go

to

m il;

 

 

 

 

 

 

 

 

 

 

 

if

de

[3]

=

0

then go

to

mlO;

 

 

 

 

 

 

 

 

 

 

 

if

de

[4]

=

0

then

 

dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

begin dx

[1 ] : =

— 2\

 

[2] : =

— 3; go to ml7 end;

 

 

mlO : if de [4] =

0

then

 

 

dx

 

[2] : =

— 2; go to ml7 end;

 

 

begin dx

[1 ] : =

— 3;

 

 

 

dx

[1 ] : =

— 2;

go to m l7‘

 

 

 

 

 

 

 

 

 

 

 

 

m il : if

de

[3]

=

0 then go to ml2;

 

 

 

 

 

 

 

 

 

 

 

if de [4]

=

0 then

 

 

 

[21 : =

— 1; go to ml7 end;

 

 

begin

dx

[11: =

1 \ dx

 

 

 

dx

[1 ] : =

2;

go

to ml7;

 

[1 ]: =

0;go to ml7 end

 

 

ml2 : if de [41 =

1

thenbegin dx

 

 

else begin dx

[1 ] :=

— 5;

dx [2] : =

5; go to

ml7

end;

ml3 : if de [21 =

0 then go to ml5;

 

 

 

 

 

 

 

 

 

 

 

if

de

[3] =

0

then

go

 

to

 

ml4;

 

 

 

 

 

 

 

 

 

 

if

de

[41 =

0 then

 

dx

 

 

 

 

 

0\ dx

 

 

 

 

 

 

 

 

begin dx [0] : =

1;

 

[11 : =

[21 : =

— 1;

go

to ml7

end;

 

 

 

 

dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dx

[0 ] : =

3;

[11 : =

2; go to ml7;

 

 

 

 

 

 

 

 

ml4 : if de [4] = 0 then

dx

 

 

 

 

 

 

 

dx [2]

 

 

 

 

 

begin

dx

[0]

: =

1;

[1 ] : = — 2;

 

: = — 1; go to

ml7 end;

 

1 \ dx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dx

[01: =

[1 ] : =

— 1; go to ml7;

 

 

 

 

 

 

ml5 : if

de [3] = 0 then

go

 

to

 

ml6;

 

 

 

 

 

 

 

 

 

 

if de [4] = 0 then

 

dx

 

[1 ] : == 2;

dx

 

[2] : =

— 1;

go

to

ml7

begin

dx

[0] : =

1;

 

 

end;

 

: =

2;

dx

[1 ] : =

3;

go

to

ml7;

 

 

 

 

 

 

 

dx

[0]

 

 

 

 

 

 

 

ml6 : if de [4] =

0 then go to fin;

 

 

 

 

 

 

 

 

 

 

 

 

dx

10 ] :=

dx

[1 ] :

=

5;

 

 

 

 

 

 

 

xd

[l] + dx [/];

 

ml7 : for l : =

0 step 1 until 2 do xdn U1 : =

 

dx 10 : = xdn

[1 ] — xdn

 

[0];

dx 21

: = xdn

 

[2] — xdn

ll ];

if

dx 10 > 0

then

go

to ml8;

 

 

 

 

 

 

 

 

 

 

 

 

248

 

g : =

1; dx

[1 ] : =

dx

[1 ] — sign (dx

[1 ]);

 

if

dx

[0 3>

0 then

dx

[0] : = dx [0] — sign (dx [0]);

 

go

to

ml7;

 

 

 

 

 

ml8

: if dx 21 > 0

then go to ml9;

[1 ]);

 

g : =

1; dx

[1 ] : =

dx

[1 ] — sign (dx

 

if

dx

[21< 0

then dx

[2 ] : — dx [2] — sign (dx [2]);

ml9

go

to

ml7;

 

 

2

do xd [/] : =

xdn [7);

: for l : 0 step 1 until

fin :

go

to

m4;

 

 

 

 

 

end;

 

 

 

 

 

 

Программа приближения функции рядом Уолша. Программа предназна­

чена для вычисления коэффициентов ряда Уолша для заданной функциональ­ ной зависимости и определения минимального числа членов ряда, необхо­ димого для приближения представления функции с заданной степенью точ­ ности eps.

В результате работы программы формируется массив ар. Число столбцов

этого массива равно трем, а количество строк определяется числом точек, в которых вычисляются значения функции. Первый столбец массива ар от­

водится для занесения индекса коэффициента ряда Уолша, который одно­ значно определяет аналитическое выражение функции Уолша, во второй столбец массива ар записываются коэффициенты ряда Уолша, а третий стол­

бец служит для занесения значения относительной погрешности, которая получается при аппроксимации функции числом членов ряда Уолша, рав­ ным количеству заполненных строк массива ар.

Всю программу можно разбить на две части. В первой части программы вычисляются все я коэффициентов ряда Уолша, а во второй части программы определяются те члены ряда, которые необходимы для аппроксимации функ-. ции с заданной погрешностью eps. В программе реализован способ построе­

ния ряда, описанный в четвертой главе. Коэффициенты ряда Уолша вычис­ ляются в программе по формуле (4-16).

В программе используются следующие обозначения переменных: walsh определяет значение функции Уолша, sigma — десятичный эквивалент двоич­ ного набора, s, I — индексы функций Уолша, q — наибольший по модулю коэффициент ряда, epsa — заданная абсолютная погрешность, емах — те­

кущая наибольшая погрешность.

begin real eps, epsa, emax, fmax, sum, q; integer m, n, k, s, i, j, l, p, sigma, walsh;

array

sv

[1 : 14];

 

 

 

read

(eps);

(svl,

sv);

 

 

 

read

tape

 

fmax : =

sv [7];

m : = sv

III;

n : = sv

[2];

begin

array f

[0

: n— 1 ],

ap [0 : n—1,

1 : 3 ] ;

integer

array

v [1 : m),

M 0 : m);

 

read tape (ft,

f);

 

 

 

v

[m] : =

1;

 

 

 

 

for k : = m—1 step— 1

until

1 do о [k \ : = v \k + 1 ] X 2;

epsa : = eps X fmax;

 

 

for s : = 0 step 1 until n—1 do

begin sum : = 0; t [0]

: =

s;

for k : = 1 step 1 until m do begin i : — k—1;

t [k] : = if t [i] ^ 0 then t [г] — v [k ]

9 Заказ № 1218

249

Соседние файлы в папке книги из ГПНТБ