Файл: Смолов, В. Б. Аналого-цифровые и цифро-аналоговые нелинейные вычислительные устройства.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.10.2024

Просмотров: 104

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Таблица 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