≪

Деление комплексных чисел

Частное двух комплексных чисел Z = Xi + iyi и Z2 = Х2 + гу2 можно вычислить по формуле

Z1 _ ZjZ^ _ (xi +м/1)(д?2 -гу2) _ #1^2 + У1У2 + -У1Х2 - ХгУ2

Z2 Z2Zi Х22 + У22 Х22 + У22 Х22 + У22

  • а) Напишите программу на языке PASCAL-XSC, которая содержит декларацию операции Cdiv, реализующей деление двух комплексных чисел типа complex с помощью операций +, — , *, / для чисел типа real. В главной программе считываются два числа типа complex, вычисляется и выводится на печать их частное.
  • б) Подключите к вашей программе модуль C_ARI. Вычислите то же частное с помощью определенной в этом модуле операции / и сравните результаты.
  • в) Проверьте вашу программу на значениях z = Xi+iyi и z2 = Х2 + iy2, где

X! = 1254027132096, У1 = 886731088897,

Х2 = 886731088897, у2 = 627013566048.

При этом в мнимых частях результатов должны наблюдаться очевидные расхождения.

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

Решение

program ComplDiv (input, output);

{ Упражнение 13. Деление комплексных чисел }

use c_ari;

var zl, z2 : complex;

priority Cdiv = *;

operator Cdiv (zl, z2 : complex) result : complex;

var denom : real;

begin

denom := sqr(z2.re) + sqr(z2.im);

result.re:= (zl.re*z2.re + zl.im*z2.im)/denom;

result.im:= (z2.re*zl.im - zl.re*z2.im)/denom;

end;

priority NewCdiv = *;

operator NewCdiv (zl, z2 : complex) NewResult : complex; var denom : real;

begin

denom := #*(z2.re*z2.re + z2.im*z2.im);

NewResult.re:= #*(zl.re*z2.re + zl.im*z2.im)/denom;

NewResult.im:= #*(z2.re*zl.im - zl.re*z2.im)/denom; end;

begin

writein (’Exercise 13: Complex Division’);

writein;

write (’Numerator zl = ’); read (zl);

write (’Denominator z2 = ’); read (z2);

writein;

write

(’zl

Cdiv

z2 =

’);

writein

(zl

cdiv

z2) ;

write

(’zl

NewCdiv

z2 =

’);

writein

(zl

NewCdiv

z2) ;

write

(’zl

/

z2 =

’);

writein

(zl

/

z2);

Вывод времени выполнения

Exercise 13: Complex Division

Numerator zl = ( 1254027132096, 886731088897 )

Denominator z2 = ( 886731088897, 627013566048 )

zl Cdiv z2 = ( 1.414213562373095E+000, 0.000000000000000E+000 )

zl NewCdiv z2 = ( 1.414213562373095E+000, 8.478614131951457E-025 )

zl / z2 = ( 1.414213562373095E+000, 8.478614131951457E-025 )

Упражнение 14. Расчет электрической цепи

От одной до трех ламп с сопротивлением R = 240 Ом параллельно подключаются к источнику напряжения U = 220 В через линию длиной I — 100 м, сделанную из провода диаметром d — 1.5 мм и удельным сопротивлением р = 0.02857 Ом-мм2/м. Все величины измерены с погрешностью 0.5%.

Требуется написать программу на языке PASCAL-XSC, использующую модуль I_ARI и тип interval. Для случаев включения одной, двух и трех ламп (n = 1, 2, 3) необходимо вычислить интервалы, в которых заключены значения Ri0[ (общее сопротивление цепи), I[Oi (общий потребляемый ток),

Uw (падение напряжения на проводах) и Ubu (падение напряжения на лампах). Используйте следующие формулы:

Rtot = Rw И- R/и,

Rot — U/ Rtot,

Uw — Rw' Rot,

ubll = U-Uw.

Ваша программа должна:

  • 1) прочитать значения тг, R, I, d, р, U, вычислить, используя значение погрешности 0.5%, интервалы R, L, D, Rho и U, включающие данные значения, а также интервал PI, включающий значение тг, и напечатать значения этих интервалов;
  • 2) вычислить и напечатать включающий интервал Rw сопротивления линии

Rw = (8 • р • /)/(тг • с/2);

  • 3) вычислить и напечатать интервалы Rtot (общее сопротивление цепи), Rot (общий потребляемый ток), Uw (падение напряжения на проводах) и Ubu (падение напряжения на лампах) для значений п = 1, 2, 3;
  • 4) напечатать интервал Us, представляющий собой общий диапазон значений напряжения на лампах для различного числа включенных ламп.

Подсказка. Включающий интервал PI для значения 7Г можно вычислить с помощью соотношения

= 4 • arctg([l, 1]).

Используйте предопределенный тип interval и модуль I_ARI, содержащий необходимые интервальные операции.

Решение

program circuit (input, output);

{ Упражнение 14. Расчет электрической цепи }

use i_ari;

var error, U, L, D, Rho, R, Us, pi, Rw, Rtot, Itot, Uw, Ubu : interval; n : integer; procedure write (var f: text; int: interval; long: boolean);

{ Совмещение процедуры write для вывода интервалов с }

{ длинной мантиссой. Вывод интервалов по умолчанию } { производится в соответствии с шириной интервала. } begin

if long then

write (f,’[’,int.inf:20:0:-1 ,’,’,int.sup:20:0:+l ,’]’) { Вывод с большим количеством цифр }

else

write (f,int);

{ Стандартная процедура вывода из модуля I_ARI } end;

begin

writein (’Exercise 14:

Electric Circuit’)

writein;

write (’U = ’); read

(u);

write (’L = ’); read

(1);

write (’D = ’); read

(d);

write (’Rho = ’); read

(rho);

write (’R = ’); read

(r);

pi := 4 * arctan (intval(l));

error := intval ( (<0.995) , (>1.005) );

r := r * error;

1 := 1 * error;

d := d * error;

Rho:= Rho * error;

u := u * error;

writein;

writein (’Intervals:’);

writein (’PI = ’,pi : true);

writein (’R = ’,R : true);

writein (’L = ’ ,L : true);

writein (’D = ’,D : true);

writein (’Rho = ’,Rho: true);

writein (’U = ’,U : true);

writein;

Rw:= (8*Rho*L)/(pi*sqr(D));

writein (’Inclusion of the wire resistance:’);

writein (’Rw = ’,Rw : true);

for n:= 1 to 3 do

begin

writein;

Rtot:= Rw + r/n;

Itot:= U / Rtot;

Uw := Rw * Itot;

Ubu := U - Uw;

if n = 1 then

Us:= Ubu

else

Us: = Us +* Ubu;

write(’With ’,n:l,’ bulb’);

if n <> 1 then write (’s’);

writeln(’, the following inclusions are computed:’);

writeln(’- total resistance: Rtot = ’,Rtot : true);

writeln(’- total current: Itot = ’,Itot : true);

writeln(’- wire voltage: Uw = ’ ,Uw : true);

writeln(’- bulb voltage: Ubu = ’ ,Ubu : true);

write(’press return’); readln; writein;

end;

writein (’The bulb voltage Ubu has the total range interval’); writein (Us : true);

end.

Вывод времени выполнения

Exercise 14: Electric Circuit

U = 220

1 = 100

d =1.5

rho = 0.02857

R = 240

Intervals:

PI = [ 3.141592653589E+000, 3.141592653590E+000] R = [ 2.387999999999E+002, 2.412000000001E+002] L = [ 9.949999999999E+001, 1.005000000001E+002] D = [ 1.492499999999E+000, 1.507500000001E+000] Rho = [ 2.842714999999E-002, 2.871285000001E-002] U = [ 2.188999999999E+002, 2.211000000001E+002]

Inclusion of the wire resistance:

Rw = [ 3.169435182649E+000, 3.298783385817E+000]

With 1 bulb, the following inclusions are computed:

  • - total resistance: Rtot = [ 2.419694351826E+002, 2.444987833859E+002]
  • - total current: Itot = [ 8.953009784698E-001, 9.137517713058E-001]
  • - wire voltage: Uw = [ 2.837598420222E+000, 3.014269161944E+000]
  • - bulb voltage: Ubu = [ 2.158857308380E+002, 2.182624015798E+002]

press return

With 2 bulbs, the following inclusions are computed:

  • - total resistance: Rtot = [ 1.225694351826E+002, 1.238987833859E+002]
  • - total current: Itot = [ 1.766764725351E+000, 1.803875490416E+000]
  • - wire voltage: Uw = [ 5.599646279992E+000, 5.950594497863E+000]
  • - bulb voltage: Ubu = [ 2.129494055021E+002, 2.155003537201E+002]

press return

With 3 bulbs, the following inclusions are computed:

  • - total resistance: Rtot = [ 8.276943518264E+001, 8.369878338582E+001]
  • - total current: Itot = [ 2.615330726982E+000, 2.671275930688E+000]
  • - wire voltage: Uw = [ 8.289121220362E+000, 8.811960659084E+000]
  • - bulb voltage: Ubu = [ 2.100880393409E+002, 2.128108787797E+002]

press return

The bulb voltage Ubu has the total range interval [ 2.100880393409E+002, 2.182624015798E+002]

Упражнение 15. Мост для измерения переменного тока

Неизвестные значения емкости конденсатора C*i и сопротивления резистора Ri можно измерить с помощью показанной схемы. Если, изменяя емкость С2 и сопротивление R?, добиться минимума громкости звука (или даже тишины) в громкоговорителе К, то емкости и сопротивления будут удовлетворять соотношениям

С = Ri-Cz/Ri, Ri = R3 • R2 /Ri ?

По данным изготовителя,

значения сопротивлений 7?з и R4 находятся в

диапазонах

  • 9.9 Ом
  • 6.8 Ом

R-з

R4

  • 10.1 Ом,
  • 6.9 Ом.

Учитывая погрешности измерения, мы получим следующие оценки для С2 и R2:

  • 40.2 мкФ
  • 18.3 Ом

С2

R2

  • 41.5 мкФ,
  • 19.8 Ом.

Требуется написать программу на языке PASCAL-XSC, которая

  • • считывает границы значений R3, R4, С2 и
  • • вычисляет и печатает интервальные включения значений Ci и Ri;
  • • повторяет вычисление включений в предположении, что погрешность измерения значений С2 и R2 больше на 10%.

Подсказка. Увеличение погрешности измерений С2 и R2 на 10% интерпретируется как увеличение на 10% радиуса соответствующих интер

валов.

Решение

program measure_bridge (input, output);

{ Упражнение 15. Мост для измерения переменного тока } use i_ari;

var

cl, c2, rl, r2, r3, r4 : interval;

d : real;

procedure write (var f: text; int: interval; long: boolean);

{ Совмещение процедуры write для вывода интервалов с }

{ длинной мантиссой. Вывод интервалов по умолчанию }

{ производится в соответствии с шириной интервала. } begin

if long then

write (f , ’ [’,int.inf:20:0:-1 , ’,’,int.sup:20:0:+l ,’]’)

{ Вывод с большим количеством цифр. }

else

write (f,int);

{ Стандартная процедура вывода из модуля I_ARI. } end;

begin

writein (’Exercise 15: Alternating Current Measuring Bridge’);

writein;

write(’lower bound of R3: ’); read(r3.inf:-1);

write(’upper bound of R3: ’); read(r3.sup:+1);

write(’lower bound of R4: ’); read(r4.inf:-1);

write(’upper bound of R4: ’); read(r4.sup:+1);

write(’lower bound of C2: ’); read(c2.inf:-1);

write(’upper bound of C2: ’); read(c2.sup:+1);

write(’lower bound of R2: ’); read(r2.inf:-1);

write(’upper bound of R2: ’); read(r2.sup:+1);

{ Вычисление Cl и Rl }

cl:= r4 * c2 / r3;

rl:= r3 * r2 / r4;

writein;

writeln(’Cl = ’, cl : true);

writeln(’Rl = ’, rl : true);

{ Вычисление 107. радиуса, т. e. 1/20 диаметра. } d := diam(c2) /> 20;

{ Увеличение интервального радиуса на эту величину. } с2:= intval ( c2.inf -< d , c2.sup +> d );

{ Вычисление 107. радиуса, т. е. 1/20 диаметра. } d := diam(r2) /> 20;

{ Увеличение интервального радиуса на эту величину. } r2:= intval ( r2.inf -< d , r2.sup +> d );

{ Вычисление Cl и Rl } cl:= r4 * c2 / r3;

rl:= r3 * r2 / r4;

writein;

writeln(’Results, with the error for C2 and R2 107. higher:’);

writein;

writeln(JCl = ’ , cl : true);

writeln(’Rl = ’, rl : true); end.

Вывод времени выполнения

Exercise 15: Alternating Current Measuring Bridge lower bound of R3: 9.9 upper bound of R3: 10.1 lower bound of R4: 6.8 upper bound of R4: 6.9 lower bound of C2: 40.2 upper bound of C2: 41.5 lower bound of R2: 18.3 upper bound of R2: 19.8

Cl = [ 2.706534653465E+001, 2.892424242425E+001]

Rl = [ 2.625652173913E+001, 2.940882352942E+001]

Results, with the error for C2 and R2 107, higher:

Cl = [ 2.702158415841E+001, 2.896954545455E+001]

Rl = [ 2.614891304347E+001, 2.952022058824E+001]

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

Упражнение 16. Оптическая линза

Для линзы с фокусным расстоянием /=(20±1)см измерено расстояние до изображения В объекта G, равное b = (25 ± 1) см. Уравнение тонкой линзы для определения расстояния до объекта д имеет следующий вид:

  • 111
  • 7 — 7 + “•

f Ь д

Отсюда находим выражение для д:

1

д = ТТг

f ь

Обычно значение д = до ± Лд вычисляется с приближением до и максимальной величиной погрешности /д с помощью формулы

  • 1
  • 9° = ±_j_ fo ъо

и линеаризации

л А/ А6

Да =----4--h -г------.

(1- (>-1)2

v bo' 4 Jo ’

Пусть /о = 20 см, Ьо = 25 см и Д/ = Д6 = 1 см. Требуется написать программу на языке PASCAL-XSC, которая:

  • • считывает значения fo, bo, и Д5;
  • • вычисляет интервал д = до ± /д описанным выше методом;
  • • вычисляет интервал д на основании интервалов f и Ь, используя интервальную арифметику, по формуле
  • 1
  • 9 = ТТТ; f ь
  • • печатает /, b и два различных значения д с соответствующими комментариями.

Дает ли обычный метод правильный результат? Сравните полученный результат с включением для д, полученным с помощью интервальной арифметики.

Решение program opt_lens (input, output);

{ Упражнение 16. Оптическая линза } use i_ari;

var

gO, dg, fO, df, bO, db : real;

g, f, b : interval;

procedure write (var f: text; int: interval; long: boolean);

{ Совмещение процедуры write для вывода интервалов с }

{ длинной мантиссой. Вывод интервалов по умолчанию } { производится в соответствии с шириной интервала. } begin

if long then

write (fint.inf:20:0:-1 , ’,’,int.sup:20:0:+l ,’]’) { Вывод с большим количеством цифр. }

else write (f,int);

{ Стандартная процедура вывода из модуля I_ARI. } end;

begin

writein (’Exercise 16: Optical Lens’);

writein;

write(’fO = ’); read(fO);

write(’df = ’); read(df);

write(’bO = ’); read(bO);

write(’db = ’); read(db);

writein;

f: = intval (fO - df , fO + df);

b:= intval (bO - db , bO + db);

writein (’f = ’, f : true);

writein (’b = ’, b : true);

writein;

gO := 1 / (1/fO - 1/bO);

dg := df / sqr(l - fO/bO) + db / sqr(bO/fO - 1);

g := intval (gO - dg , gO + dg);

writein (’g = gO +/- dg = ’, g : true);

g:= l/(l/f - 1/b);

writein (’g = 1 / (1/f - 1/b) = ’, g : true); end.

Вывод времени выполнения

Exercise 16: Optical Lens

fO = 20

df = 1

bO = 25

db = 1

f = [ 1.900000000000E+001, 2.100000000000E+001]

b = [ 2.400000000000E+001, 2.600000000000E+001]

g = gO +/- dg = [ 5.899999999999E+001, 1.410000000000E+002]

g = 1 / (1/f - 1/b) = [ 7.057142857142E+001, 1.680000000001E+002]

Замечание 1. Метод, обычно используемый для оценки погрешности, дает неверный результат.

Замечание 2. Упражнения 14, 15 и 16 были подготовлены под влиянием статьи: Р. Thieler. Technical Calculations by Means of Interval Mathematics

[54].

Упражнение 17. Интервальное вычисление полинома

Требуется написать программу на языке PASCAL-XSC, использующую модуль I_AR1, для вычисления полинома

р(Х) = 1 + ЗХ - 10Х2

с применением интервальной арифметики. Сравните результаты для следующих представлений полинома [X принадлежит к типу interval):

  • 1) (1 — 2 * X) * (1 + 5 * X);
  • 2) 1 + 3*Х — 10* sqr(X);
  • 3) 1 + X * (3 — 10 * X) (схема Гориера);
  • 4) 1 + 3 * т(Х) - 10 * sqr(m(X)) + (3 - 20 * X) (X - т(Х)) (центрированная форма [49], где т(Х) есть средняя точка интервала X).

Как примеры значений X, задайте сначала минимальные интервалы (с разностью границ в одну единицу 14-го разряда), а затем интервалы с другими диаметрами. Проверьте также программу на интервалах в окрестности нулей данного полинома (х = 0.5 и х = —0.2) и в окрестности его экстремума (х = 0.15).

Подсказка. Для вычисления средней точки интервала с максимальной точностью напишите функцию, использующую # -выражение.

Решение

program int_poly (input, output);

{ Упражнение 17. Интервальное вычисление полинома }

use i_ari;

var х : interval;

function midpoint (x : interval) : real;

begin

midpoint:= #* (0.5 * x.inf +0.5 * x.sup); end;

begin

writein (’Exercise 17: Interval Evaluation of a Polynomial’);

writein;

repeat

write (’Enter X : ’); read(x); writein;

writein (’Method 1: p(X) = ’, writein (’Method 2: p(X) = ’, writein (’Method 3: p(X) = ’, writein (’Method 4: p(X) = ’,

(l-2*x)*(l+5*x));

l+3*x-10*sqr(x));

1+x*(3-10*x));

l+3*midpoint(x)

-10*sqr(midpoint(x))

+(3-20*x)*(x-midpoint(x)));

writein; writein; until x = 0;

end.

Вывод времени выполнения

Exercise 17: Interval Evaluation of a Polynomial

Enter X : [0.5,0.5]

Method 1: p(X) = [

Method 2: p(X) = [ Method 3: p(X) = [ Method 4: p(X) = [

  • 0.000000000000000E+000, 0.000000000000000E+000, 0.000000000000000E+000, 0.000000000000000E+000,
  • 0.000000000000000E+000]
  • 0.000000000000000E+000]
  • 0.000000000000000E+000]
  • 0.000000000000000E+000]

Enter X : [0.4999999999,0.5]

Method 1:

p(X) = [

0.0E+000,

7.1E-010]

Method 2:

p(X) = [

-3.1E-010,

1.IE-009]

Method 3:

p(X) = [

0.0E+000,

7.1E-010]

Method 4:

p(X) = [

0.0E+000,

7.1E-010]

Enter X : [-0.2000000000001,-0.1999999999999]

Method 1:

Method 2:

Method 3:

Method 4:

p(X) = [ p(X) = [ p(X) = [ p(X) = [

  • -7.1E-013,
  • -7.1E-013,
  • -7.1E-013,
  • -7.1E-013,
  • 7.1E-013]
  • 7.1E-013]
  • 7.1E-013]
  • 7.1E-013]

Enter X : [0.1499999999999,0.1500000000001]

Method 1: p(X) = [ Method 2: p(X) = [ Method 3: p(X) = [ Method 4: p(X) = [

  • 1.224999999999E+000,
  • 1.224999999999E+000,
  • 1.224999999999E+000,
  • 1.224999999999999E+000,
  • 1.225000000001E+000] 1.225000000001E+000] 1.225000000001E+000] 1.225000000000001E+000]

Enter X : [0.1,0.2]

Method 1:

p(X) = [

8.9E-001,

1.7E+000]

Method 2:

p(X) = [

8.9E-001,

1.6E+000]

Method 3:

p(X) = [

1.0E+000,

1.5E+000]

Method 4:

p(X) = [

1.1E+000,

1.3E+000]

Enter X : 0

Method 1: p(X) = [ Method 2: p(X) = [ Method 3: p(X) = [ Method 4: p(X) = [

  • 1.000000000000000E+000, 1.000000000000000E+000, 1.000000000000000E+000, 1.000000000000000E+000,
  • 1.000000000000000E+000]
  • 1.000000000000000E+000]
  • 1.000000000000000E+000]
  • 1.000000000000000E+000]

Упражнение 18. Вычисления с интервальными матрицами

Пусть заданы две интервальные матрицы А и В:

,_Ш [0,1] Л-1,2] [3,4]

[Г1] [-1.1] J’ к [2,2] [-6,-4] J'

Напишите программу, которая:

  • а) вычисляет А + В, А — В, А х В;
  • б) показывает (с помощью вычислений), что Ах (Ах х А) х А;
  • в) показывает (с помощью вычислений), что Ах (В + А) ^АхВ + АхА и Ах (В + А) с А х В + А х А.

Подсказка. Используйте операции из модуля MVI_ARI.

Решение

program intjmatr (input, output);

{ Упражнение 18. Вычисления с интервальными матрицами }

use i_ari, mvi_ari;

var

А, В, С : imatrix[1..2,1..2] ;

begin

writein (’Exercise 18: Calculations for Interval Matrices’); writein;

A[1,1]:= 1;

A[l,2] : = intval(0,l);

A[2,1]:= 1;

A[2,2]:= intval(-l,1);

B[l,l]: = intval(-l,2);

В[1,2]:= intval(3,4);

В[2,1]:= 2;

В[2,2]:= intval(-6,-4);

writein (’A =

’);

writein;

writein (A);

writein (’B =

’);

writein;

writein (B);

writein (’A +

В =

’); writein;

writein (A+B);

writein (’A -

в =

’); writein;

writein (A-B);

writein (’A *

в =

’); writein;

writein (A*B); writein (’A *

(A

* A) = ’); writein;

writein (А*(А*А));

writein (’(А * А) * А = ’); writein;

writein ((А*А)*А);

writein (’А * (В + А) = ’); writein;

writein (А*(В+А));

writein (’А * В + А* А = ’); writein;

writein (А*В+А*А);

end.

Вывод времени выполнения

Exercise 18: Calculations for Interval Matrices

[ 1.0E+00, 1.0E+00] [ 0.0E+00, 1.0E+00]

[ 1.0E+00, 1.0E+00] [-1.0E+00, 1.0E+00]

В =

[-1.0E+00, 2.0E+00] [ 3.0E+00, 4.0E+00] [ 2.0E+00, 2.0E+00] [-6.0E+00.-4.0E+00]

A + В = [ 0.0E+00, 3.0E+00] [ 3.0E+00, 5.0E+00] [ 3.0E+00, 3.0E+00] [-7.0E+00.-3.0E+00]

A - В = [-1.0E+00, 2.0E+00] [-4.0E+00,-2.0E+00] [-1.0E+00,-1.0E+00] [ 3.0E+00, 7.0E+00]

A * В = [-1.0E+00, 4.0E+00] [-3.0E+00, 4.0E+00] [-3.0E+00, 4.0E+00] [-3.0E+00, 1.0E+01]

A * (A * A) = [ 1.0E+00, 4.0E+00] [-2.0E+00, 4.0E+00] [-1.0E+00, 4.0E+00] [-3.0E+00, 4.0E+00]

(A * A) * A = [ 0.0E+00, 4.0E+00] [-2.0E+00, 4.0E+00] [-1.0E+00, 4.0E+00] [-2.0E+00, 4.0E+00]

A * (B + A) =

[ 0.0E+00, 6.0E+00] [-4.0E+00, 5.0E+00]

[-3.0E+00, 6.0E+00] [-4.0E+00, 1.2E+01]

A*B + A*A = [ 0.0E+00, 6.0E+00][-4.0E+00, 6.0E+00]

[-3.0E+00, 6.0E+00][-4.0E+00, 1.2E+01]

Упражнение 19. Дифференциальная арифметика

С помощью дифференциальной арифметики (см. [48]) вычислить значения функции и значения ее производной f'(x) на интервале — 4 С х С 2 для точек Хк = = — 4 + kh, к = 0,..., 48, где h = 0.125.

Дифференциальная арифметика — арифметика упорядоченных пар

U = (u,wx), где и,и' Е JR.

Первая компонента U содержит значение функции, вторая — значение ее производной. Для этих элементов вводятся следующие операции:

U + V = (и, и') + (v, v') = (и + v, и' + v'),

U— V = (и, и ) — (у, v') = (у — v,u'— г/),

U * V — (и, г?) * (щ г/) — (и * v, и * v' + и' * v),

U/V = (щ m')/(v, г>') = (u/v, (и1 — u/v * v'/v), v 7^ 0,

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

X — (х, 1) и С — (с, 0),

поскольку = 1 и = 0. Для реализации дифференциальной арифметики в программе на PASCAL-XSC необходимо объявить тип Derivative _Туре, являющийся записью из двух компонент типа real. Затем нужно определить функцию f с параметрами и результатом типа Derivative _Туре, а также операции дифференциальной арифметики +, —, *, /. Если

/(Х) = Х*((4,0) + Х)/((3,0)-Х),

то автоматическое дифференцирование обеспечивается тем, что

/(Х) = /((Ж,1)) = (Щ),/'(Ж)).

Иными словами, значение функции и ее производной вычисляются автоматически и одновременно. Напишите модуль на языке PASCAL-XSC, содержащий

  • а) декларацию типа Derivative_Type;
  • б) декларации операций +,—,*,/ в соответствии с приведенными правилами.

Напишите программу на языке PASCAL-XSC, включающую а) процедуру-функцию F, которая с помощью операций из модуля вычисляет значение функции и ее производной;

б) главную программу, вычисляющую и табулирующую значения f(x) и f'(x) в указанных точках.

Подсказка. Константы 4 и 3, принадлежащие к типу Derivative _Туре, представляются как (4,0) и (3,0) соответственно. Независимая переменная х представляется как (Ф, 1).

Решение

module diff_ari;

{ Упражнение 19. Модуль дифференциальной арифметики }

global type Derivative_Type = global record

f, df : real;

end;

global operator := (var a: Derivative_Type; r: real);

begin

a.f := r;

a.df := 0;

end;

global operator + (a,b: Derivative_Type) Result_add: Derivative_Type;

begin

Result_add.f := a.f + b.f;

Result_add.df := a.df + b.df;

end;

global operator - (a,b: Derivative_Type) Result_sub: Derivative_Type;

begin

Result_sub.f := a.f - b.f;

Result.sub.df := a.df - b.df;

end;

global operator * (a,b: Derivative_Type) Result_mul: Derivative_Type;

begin

Result_mul.f := a.f * b.f;

Result_mul.df := a.f * b.df + a.df * b.f;

end;

global operator / (a,b: Derivative_Type) Result_div: Derivative_Type;

begin

Result_div.f := a.f / b.f;

Result_div.df := (a.df - a.f * b.df / b.f) / b.f ;

end;

end. { конец модуля diff_ari }

program Automatic_Differentiation (input, output);

{ Упражнение 19. Дифференциальная арифметика }

use diff_ari;

function f (x: Derivative_Type) : Derivative_Type;

var

three, four : Derivative_Type;

begin

three := 3;

four := 4;

f:= x*((four+x)/(three-x));

end;

var

x, у : Derivative_Type;

h : real;

i : integer;

begin

writein (’Exercise 19: Differentiation Arithmetic’); writein;

x. df : = 1;

h := 0.125;

writeln(’ x ’ , ’ ’,

’ f(x)

’ f”(x) ’);

for i:= 0 to 48 do

begin

x.f := -4 + i * h;

у := f(x);

writein (x.f,’ ’,y.f,’ ’,y.df);

end;

end.

Вывод времени выполнения

Exercise 19: Differentiation Arithmetic

x

  • -4.000000000000000E+000
  • -3.875000000000000E+000
  • -3.750000000000000E+000
  • -3.625000000000000E+000
  • -3.500000000000000E+000
  • -3.375000000000000E+000
  • -3.250000000000000E+000
  • -3.125000000000000E+000
  • -3.000000000000000E+000
  • -2.875000000000000E+000
  • -2.750000000000000E+000

f(x)

  • 0.000000000000000E+000
  • -7.045454545454545E-002
  • -1.388888888888889E-001
  • -2.051886792452830E-001
  • -2.692307692307693E-001
  • -3.308823529411765E-001
  • -3.900000000000000E-001
  • -4.464285714285714E-001
  • -5.000000000000000E-001
  • -5.505319148936170E-001
  • -5.978260869565217E-001

f’(x)

  • -5.714285714285714E-001
  • -5.557024793388429E-001
  • -5.390946502057612E-001
  • -5.215379138483447E-001
  • -5.029585798816567E-001
  • -4.832756632064591E-001
  • -4.624000000000000E-001
  • -4.402332361516035E-001
  • -4.166666666666667E-001
  • -3.915799004074241E-001
  • -3.648393194706995E-001

-2.625000000000000Е+000 -2.500000000000000Е+000 -2.375000000000000Е+000 -2.250000000000000Е+000 -2.125000000000000Е+000 -2.ОООООООООООООООЕ+ООО -1.875000000000000Е+000 -1.750000000000000Е+000 -1.625000000000000Е+000 -1.500000000000000Е+000 -1.375000000000000Е+000 -1.250000000000000Е+000 -1.125000000000000Е+000 -1.ОООООООООООООООЕ+ООО -8.750000000000000Е-001 -7.500000000000000Е-001 -6.250000000000000Е-001 -5.000000000000000Е-001 -3.750000000000000Е-001 -2.500000000000000Е-001 -1.250000000000000Е-001

О.ОООООООООООООООЕ+ООО 1.250000000000000Е-001 2.500000000000000Е-001 3.750000000000000Е-001 5.000000000000000Е-001 6.250000000000000Е-001 7.500000000000000Е-001 8.750000000000000Е-001 1.ОООООООООООООООЕ+ООО 1.125000000000000Е+000 1.250000000000000Е+000 1.375000000000000Е+000 1.500000000000000Е+000 1.625000000000000Е+000 1.750000000000000Е+000 1.875000000000000Е+000 2.ОООООООООООООООЕ+ООО

-6.416666666666666Е-001 -6.818181818181818Е-001 -7.180232558139534Е-001 -7.500000000000000Е-001 -7.774390243902439Е-001 -8.ОООООООООООООООЕ-ОО1 -8.173076923076923Е-001 -8.289473684210525Е-001 -8.344594594594594Е-001 -8.333333333333334Е-001 -8.250000000000000Е-001 -8.088235294117647Е-001 -7.840909090909092Е-001 -7.500000000000000Е-001 -7.056451612903225Е-001 -6.500000000000000Е-001 -5.818965517241379Е-001 -5.000000000000000Е-001 -4.027777777777778Е-001 -2.884615384615384Е-001 -1.550000000000000Е-001

О.ОООООООООООООООЕ+ООО 1.793478260869565Е-001 3.863636363636364Е-001 6.250000000000000Е-001 9.000000000000000Е-001 1.217105263157895Е+000 1.583333333333333Е+000 2.007352941176471Е+000 2.500000000000000Е+000 3.075000000000000Е+000 3.750000000000000Е+000 4.548076923076922Е+000 5.500000000000000Е+000 6.647727272727272Е+000 8.049999999999999Е+000 9.791666666666666Е+000 1.200000000000000Е+001

-3.362962962962963Е-001 -3.057851239669422Е-001 -2.731206057328286Е-001 -2.380952380952381Е-001 -2.004759071980964Е-001 -1.599999999999999Е-001 -1.163708086785009Е-001 -6.925207756232682Е-002 -1.826150474799126Е-002 3.703703703703709Е-002 9.714285714285709Е-002 1.626297577854672Е-001 2.341597796143251Е-001 3.125000000000000Е-001 3.985431841831426Е-001 4.933333333333334Е-001 5.980975029726516Е-001 7.142857142857143Е-001 8.436213991769548Е-001 9.881656804733727Е-001 1.150400000000000Е+000 1.333333333333333E+000 1.540642722117202Е+000 1.776859504132231Е+000 2.047619047619048Е+000 2.360000000000000Е+000 2.722991689750693Е+000 3.148148148148148Е+000 3.650519031141868Е+000 4.250000000000000Е+000 4.973333333333333Е+000 5.857142857142857Е+000 6.952662721893491Е+000 8.333333333333332Е+000 1.010743801652893Е+001 1.244000000000000Е+001 1.559259259259259Е+001 2.000000000000000Е+001

Упражнение 20. Метод Ньютона с автоматическим

дифференцированием

Нуль функции /(х) может быть найден методом Ньютона с начальным приближением Xq

_ /Ы _ n 1 О

^п+1 — Хп ?, / >. ? 71 — 0,1, 2,...

/ ы

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

Требуется написать программу на языке PASCAL-XSC, реализующую метод Ньютона с применением дифференциальной арифметики. Для проверки используйте функцию

f(x) — ех — х — 5.

Программа должна считывать начальное приближение хо и производить пять итераций, печатая на каждом шаге значения Xi и f(xi).

Проверьте программу, задав начальные значения Xq = 2.0 и Xq = —5.0. Нули функции равны Xi = 1.9368470722 и х? = —4.99321618865.

Подсказка. Функцию еи, где U = (и, и') принадлежит типу Derivative_Туре, можно реализовать с помощью следующего соотношения:

eU =е(и,и') = (еи,и/

Решение

program newt_diff (input, output);

{ Упражнение 20. Метод Ньютона с автоматическим дифференцированием } use diff_ari;

function exp (x: Derivative_Type) : Derivative_Type;

begin

exp.f := exp(x.f);

exp.df:= x.df * exp(x.f);

end;

function f (x: Derivative_Type) : Derivative_Type;

var

five : Derivative_Type;

begin

five := 5;

f := exp(x) - x - five;

end;

var

x, у : Derivative_Type;

i : integer;

begin

writein (’Exercise 20: Newton’’s Method with’);

writein (’ Automatic Differentiation’);

writein;

write (’Enter starting value xO : ’); read (x.f);

x.df := 1;

for i:= 1 to 5 do

begin

у := f(x);

x.f := x.f - y.f/y.df;

writein (’x’,i:l,’ : ’,x.f);

end;

end.

Вывод времени выполнения

Exercise 20: Newton’s Method with

Automatic Differentiation

Enter starting value xO : 2.0

xl : 1.939105856497994E+000

x2 : 1.936850383714592E+000

x3 : 1.936847407225395E+000

x4 : 1.936847407220219E+000

x5 : 1.936847407220219E+000

Exercise 20: Newton’s Method with

Automatic Differentiation

Enter starting value xO : -5.0 xl : -4.993216345093695E+000 x2 : -4.993216188647903E+000 x3 : -4.993216188647903E+000 x4 : -4.993216188647903E+000 x5 : -4.993216188647903E+000

Упражнение 21. Измерение времени

Время суток в диапазоне от 00.00.00 до 23.59.59, с указанием часов, минут и секунд, можно представить как тип записи Clock с соответствующими компонентами. Напишите декларацию операции +, складывающей два значения времени типа Clock и вычитающей, если необходимо, 24 часа, чтобы результат также был представим как значение этого типа. Напишите программу с использованием этих деклараций, которая считывает до maxint значений времени и суммирует их, печатая сумму на каждом шаге. Программа заканчивает работу при вводе значения 0.00.00.

Значение времени вводится как строка формата hh.mm.ss и преобразуется в значение типа Clock с помощью функций языка PASCAL-XSC для работы со строками. При выводе суммарного времени производится обратная операция: значение типа Clock преобразуется в строку символов формата hh.mm.ss и выводится на печать.

Решение

program times (input, output);

{ Упражнение 21. Измерение времени }

type

Clock = record

hours : 0..23;

minutes : 0..59;

seconds : 0..59;

end;

var

a, b : string[8];

time, total : Clock;

i, p : integer;

operator + (a, b: Clock) sum : Clock;

var

help : 0..119;

begin

help := a.seconds + b.seconds;

sum.seconds: = help mod 60;

help := a.minutes + b.minutes + help div 60;

sum.minutes:= help mod 60;

help := a.hours + b.hours + help div 60;

sum.hours := help mod 24;

end;

begin

writein (’Exercise 21: Measurement of Time’);

writein;

total.hours := 0;

total.minutes := 0;

total.seconds := 0;

i: = 0;

repeat

i:= succ (i);

write (’Please enter difference of time: ’); readln;

read (а);

Р

time.hours

= pos (’ . ’ , a) ;

= ival(substring(a,1,p-l));

а

= substring(a,p+1,8);

Р

time.minutes

= pos (’ . ’ , a) ;

= ival(substring(a,1,p-l));

а

time.seconds total

b

= substring(a,p+1,8);

= ival(substring(a,1,8));

= total + time;

= image (total.hours,2) + ’.’ +

image (total.minutes,2) + ’.’ + image (total.seconds,2);

writein (’New

time : ’, b);

until (i=maxint) or (time.hours+time.minutes+time.seconds=0); end.

Упражнение 22. Метод итераций

Рассмотрим векторный метод итераций

(*) ж(А:+1) =с + Ах{к А; = 0,1,2,...

где с, G JRn, к = 0,1,2,... и A G JRn/ri. Предположим, что спектраль

ный радиус А меньше единицы, так что итерации сходятся.

Требуется написать программу на языке PASCAL-XSC, реализующую этот метод, и разработать модуль MatVec, содержащий необходимые типы, операции и процедуры. Модуль должен включать следующие части:

  • а) декларацию динамического типа vector как одномерного массива с компонентами типа real;
  • б) декларацию динамического типа matrix как двумерного массива с компонентами типа real;
  • в) операцию равенства = для сравнения двух векторов а = (а*) и b = = (bi) в соответствии с формулой

ср = bi для всех г;

г) операцию + для сложения двух векторов а = (aj и b = (bi) в соответствии с формулой

с = а + 6, где Ci = аг + bi для всех i;

д) операцию * для умножения матрицы А = (dij) на вектор х = (xi) в соответствии с формулой

у = А * х, где y-i = aijxj Аая всех i.

з

При этом необходимо использовать тип dot precision, чтобы обеспечить вычисление уг с единственным округлением;

  • е) совмещение процедуры read для ввода вектора;
  • ж) совмещение процедуры read для ввода матрицы;
  • з) совмещение процедуры write для вывода вектора.

Напишите программу Iteration, использующую модуль MatVec и содержащую следующие части:

1) процедуру Main с формальным параметром п, работающую с типами,

процедурами и операциями модуля MatVec. Процедура должна объявить переменные с, А и х^° необходимые для итераций, как векторы или матрицы с диапазоном индексов и прочитать их зна

чения. Далее Main должна осуществлять итерации (*) пока не выполнится одно из условий = х^ или к — 20. Наконец, она должна напечатать вектор-результат a/fe+1

2) главную программу, считывающую размерность п и вызывающую процедуру Main.

Решение

module MatVec;

{ Упражнение 22. Модуль с векторно-матричными операциями }

global type

vector = dynamic array [*] of real;

matrix = dynamic array [*,*] of real;

global operator = (a, b: vector) equ: boolean;

{ Предполагаются соответствующие диапазоны индексов у а и b. } var

i : integer;

begin

i:= Ibound(a) - 1;

repeat

i:= i + 1;

until (a[i] <> b[i]) or (i = ubound(a));

equ:= (a[i] = b[i] );

end;

global operator + (a,b: vector) vadd: vector[Ibound(a)..ubound(a)]; { Предполагаются соответствующие диапазоны индексов у а и b. } var

i : integer;

begin

for i:= Ibound(a) to ubound(a) do vadd[i] := a[i] + b[i] ;

end;

global operator * (A: matrix; x: vector)

mvmul: vector[Ibound(x)..ubound(x)];

{ Предполагаются соответствующие диапазоны индексов у А и х. } var

i, j : integer;

d : dotprecision;

begin

for i:= Ibound(A) to ubound(A) do

begin

d: = #(0);

for j: = lbound(A,2) to ubound(A,2) do d:= #(d + a[i,j] * x[j]);

mvmul[i] : = #*(d);

end;

end;

global procedure read (var f: text; var c: vector); var

i : integer;

begin

for i:= Ibound(c) to ubound(c) do read (f, c [i]);

end;

global procedure read (var f: text; var A: matrix); var

i, j : integer;

begin

for i:= Ibound(A) to ubound(A) do

for j := lbound(A,2) to ubound(A,2) do read(f, A[i,j]);

end;

global procedure write (var f: text; c: vector); var

i : integer;

begin

for i:= Ibound(c) to ubound(c) do writein (f, c[i]);

end;

end. { конец модуля MatVec }

program iterate (input, output);

{ Упражнение 22. Метод итераций }

use matvec;

var

n : integer;

procedure main (n: integer);

var

i, j, k : integer;

c, x_k, x_k_plus_l, у : vector[1..n];

A : matrix[1..n,1..n];

begin

writein (’Enter vector c’);

read (c);

writein (’Enter matrix A’);

read (A);

writein (’Enter vector xO’);

read (x_k_plus_l);

{ Итерация }

k:= -1;

repeat

x_k := x_k_plus_l;

k := k + 1;

x_k_plus_l:= c + A * x_k;

until (x_k_plus_l = x_k) or (k = 20);

writein (’Last iterate: ’);

write (x_k_plus_l);

end;

begin { главная программа }

writein (’Exercise 22: Iterative Method x_k+l := c + A x_k’); writein;

write (’Dimension of vectors and matrices? ’);

read (n);

main (n);

end.

Замечание. Модуль MatVec — прототип предопределенного модуля MV_ARI, использующего предопределенные типы rvector и rmatrix. Заметим, что наш модуль не проверяет соответствие диапазонов индексов.

Упражнение 23. След произведения матриц

След п х п матрицы А = (а^) размерности п х п определяется как

п

Trace (А) := ац = ац Н-----Н апп,

г=1

т. е. он равен сумме элементов главной диагонали. Требуется написать программу на языке PASCAL-XSC, которая запрашивает размерность п, считывает две п х n-матрицы А и В, вычисляет след произведения матриц С = А х В и печатает его значение.

Используйте модуль MV_ARI, содержащий процедуры и определения операций для динамических типов rvector и rmatrix. Напишите функцию Tracel, вычисляющую след произведения двух матриц с использованием обычных арифметических операций, функцию Trace2, использующую для тех же операций # -выражения с целью достижения максимальной точности, функцию ТгасеЗ, производящую суммирование обычным образом, но применяющую скалярное произведение для вычисления диагональных элементов, и функцию Тгасе4, содержащую # -выражение для суммирования диагональных элементов, полученных тем же способом, как и в функции ТгасеЗ. Сравните результаты, выдаваемые этими четырьмя вариантами функции для различных исходных данных. Проверьте вашу программу на матрицах

ю9

8

126 -

237

100

2

-12

1

ю5

10

-107

81

13

-3

30

10~7 )

ю8

85

8

6

12

3

103

156

3

14

ю10

13

2

-8332

-104

-10"8

Решение

program trace (input, output);

{ Упражнение 23. След произведения матриц }

use mv_ari;

var n: integer;

function tracel (a, b: rmatrix): real; var

i, j : integer;

s : real;

begin

s:= 0;

for i:= lbound(a,l) to ubound(a,l) do

for j:= lbound(a,2) to ubound(a,2) do s:= s + a[i,j] * b[j,i];

tracel:= s; end;

function trace2 (a, b: rmatrix): real; var

i, j : integer;

begin

trace2:= #* ( for i:= lbound(a,l) to ubound(a,l) sum

( for j: = lbound(a,2) to ubound(a,2) sum ( a[i, j]*b[j ,i] ) ) );

end;

function trace3 (a, b: rmatrix): real; var

i : integer;

s : real;

begin

s := 0;

for i:= lbound(a,l) to ubound(a,l) do s:= s + a[i] * rvector(b[*,i]);

trace3:= s;

end;

function trace4 (a, b: rmatrix): real; var

i : integer;

begin

trace4:= #* ( for i:= lb(a,l) to ub(a,l) sum ( a[i] * rvector (b[*,i]) ) ); end;

procedure main (n: integer);

var

a, b : rmatrix[1..n,1..n];

tri, tr2, tr3, tr4 : real;

begin

writein(’Enter matrix A:’);

read (A);

writeln(’Enter matrix B:’) ;

read (B);

trl:= tracel (A,B);

tr2:= trace2 (A,B);

tr3:= trace3 (A,B);

tr4: = trace4 (A,B);

writeln(’Trace of A*B computed conventionally : ’,trl);

writeln(’and with corresponding #-expression : ’,tr2);

writeln(’Trace of A*B computed with scalar product : ’,tr3); writeln(’and with corresponding #-expression : ’,tr4);

end;

begin { программа trace }

writein (’Exercise 23: Trace of a Product Matrix’); writein;

write(’Enter dimension of the matrices: ’);

read (n);

main(n);

end. { конец программы trace}

Вывод времени выполнения

Exercise 23: Trace of a Product Matrix

Enter dimension of the matrices: 4

Enter matrix A:

1е9

8

126

-237

100

2

-12

1

1е5

10

-1е7

81

13

-3

30

1е-7

Enter

matrix

В:

1е8

85

8

6

12

3

1еЗ

156

3

14

1е10

13

2 •

-8332

-1е4

-1е-8

Trace of A*B computed conventionally and with corresponding #-expression Trace of A*B computed with scalar product and with corresponding #-expression

  • -1.600000000000000E+001
  • 5.999999999999999E+000
  • -9.999999999999999E-016
  • 5.999999999999999E+000

Упражнение 24. Калькулятор для полиномов

Требуется написать программу на языке PASCAL-XSC, представляющую собой калькулятор для сложения и умножения полиномов с real-

коэффициентами. Степень п полиномов не превышает 5. Для двух полиномов р и q степени п, заданных в виде

п п

р(х) = и =

2=0 2=0

сумма s вычисляется по формуле

п

з(я) = р(ж) + q(x) = + bi)xl,

2=0

а произведение г — по формуле

п п

г(х) = р(х) • q(x) = aibjXl+P

2=0 j=0

Необходимо написать модуль, содержащий:

  • а) определение динамического типа Polynomial как массива с real-элементами;
  • б) процедуру для ввода коэффициентов полинома;
  • в) операцию + для двух операндов типа Polynomial, возвращающую полином той же степени, что и исходные полиномы;
  • г) операцию * для двух операндов типа Polynomial, возвращающую полином соответствующей степени, вычисленный с максимальной точностью;
  • д) процедуру для вывода полиномов.

Программа для тестирования этого модуля должна содержать процедуру Main с аргументом п (^5), которая объявляет три полинома (р, q, s) степени п и полином (г) степени 2п и считывает р и q. В зависимости от запроса пользователя процедура должна вычислить и напечатать сумму полиномов s или их произведение г. В теле главной программы нужно лишь запросить у пользователя степень полиномов и вызвать процедуру Main.

Решение

module poly;

{ Упражнение 24. Калькулятор для полиномов }

global type Polynomial = dynamic array [*] of real;

global procedure read (var f: text; var a: Polynomial);

var i: integer;

begin for i:= 0 to ub(a) do read (f, a[i]);

end;

global operator + (a, b: Polynomial) Result_Add: Polynomial[0..ub(a)] ;

var i: integer;

begin

for i:= 0 to ub(a) do

Result_Add[i] := a[i] + b[i];

end;

global operator * (a, b: Polynomial) Result_Mul: Polynomial[0..2*ub(a)]; var i, j, n: integer;

begin

n:= ub(a);

for i:= 0 to n do

Result_Mul[i]:= #* (for j:= 0 to i sum (a[j] * b[i-j]));

for i:= n+1 to 2*n do

Result_Mul[i]:= #* (for j:= i-n to n sum (a[j] * b[i-j]));

end;

global procedure write (var f: text; a: Polynomial);

var i: integer;

begin

write (f, a[0], ’ ’);

for i:= 1 to ub(a) do

begin

writeln(f, ’ + ’);

write(’ a[i], ’ x~’ ,i:l);

end;

writeln(f);

end;

end. { конец модуля poly }

program test_poly (input, output);

use poly;

var n, option : integer;

procedure Main (n : integer; var option : integer);

var

p, q, s : Polynomial[0..n];

r : Polynomial[0..2*n] ;

begin

writein(’Enter the coefficients of p (0 to n):’);

read (p);

writein;

writein(’Enter the coefficients of q (0 to n):’);

read (q);

writein;

repeat

writeln(’Please select:’);

writeln(’ p + q ==> O’);

writeln(’ р * q ==> 1’);

writein(’ New polynomials p,q ==> 2’);

writeln(’ Terminate program ==> 9’);

writein;

write (’Selection ==> ’); read(option);

writein;

if option = 0 then

begin

s:= p+q;

write(’p = ’); writein(p);

write(’q = ’); writeln(q);

write(’p+q = ’); writeln(s);

end

else if option = 1 then

begin

r: = p*q;

write(’p = ’); writein(p);

write(’q = ’); writeln(q);

write(’p*q = ’); writeln(r);

end;

until (option <> 0) and (option <> 1);

writein;

end;

begin { программа test_poly }

writeln(’Exercise 24: Calculator for Polynomials’);

writein;

repeat

repeat

write(’Degree n of the polynomials (>= 0 and <= 5) : ’); read (n);

until (0<=n) and (n<=5);

writein;

Main (n, option);

until (option = 9);

end. { конец программы test_poly }

Вывод времени выполнения

Exercise 24: Calculator for Polynomials

Degree n of the polynomials (>= 0 and <= 5) : 4

Enter the coefficients of p (0 to n): 99 11 22 33 44

Enter the coefficients of q:

0 12 3 4

Please select:

p+q ==> 0

p * q ==> 1

New polynomials p,q ==> 2

Terminate program ==> 9

Selection ==> 0

р = 9.900000000000000Е+001 +

1.100000000000000Е+001 х"1 + 2.200000000000000Е+001 х~2 + 3.300000000000000Е+001 х“3 + 4.400000000000000Е+001 х~4

q = 0.ОООООООООООООООЕ+ООО +

  • 1.ОООООООООООООООЕ+ООО х“1 +
  • 2.ОООООООООООООООЕ+ООО х~2 +
  • 3.000000000000000Е+000 х~3 +
  • 4.ОООООООООООООООЕ+ООО х~4

p+q = 9.900000000000000Е+001 +

  • 1.200000000000000Е+001 х~1 +
  • 2.400000000000000Е+001 х~2 +
  • 3.600000000000000Е+001 х~3 +
  • 4.800000000000000Е+001 х~4

Please select:

p + q ==> О

р * q ==> 1

New polynomials p,q ==> 2

Terminate program ==> 9

Selection ==> 1

p = 9.900000000000000E+001 +

1.100000000000000E+001 x“l + 2.200000000000000E+001 x“2 + 3.300000000000000E+001 x~3 + 4.400000000000000E+001 x~4

q = 0.000000000000000E+000 +

  • 1.000000000000000E+000 x~l +
  • 2.000000000000000E+000 x~2 +
  • 3.000000000000000E+000 x~3 +
  • 4.000000000000000E+000 x~4

p*q = 0.000000000000000E+000 +

9.900000000000000E+001 x"l + 2.090000000000000E+002 x~2 + 3.410000000000000E+002 x~3 + 5.060000000000000E+002 x~4 + 2.200000000000000E+002 x“5 + 2.750000000000000E+002 x~6 + 2.640000000000000E+002 x~7 + 1.760000000000000E+002 x'8

Please select:

p+q ==> 0

p * q ==> 1

New polynomials p,q ==> 2

Terminate program ==> 9

Selection ==> 9

Упражнение 25. Интервальный метод Ньютона

Интервальное включение Хп нуля функции f(x) с непрерывной и не равной нулю на интервале [а, Ь] производной может быть улучшено при условии f(a) -f(F) <0 с помощью интервального метода Ньютона ([2], [3], [39]):

( п) /'(%„) )

где т(Х) — средняя точка интервала X.

Требуется написать программу на языке PASCAL-XSC, использующую модуль I_ARI, которая вычисляет интервальное включение нуля функции

/(ж) = у/х + (ж + 1) cos х

с помощью описанного выше метода. Программа должна содержать:

  • • функцию F, вычисляющую f(X) с использованием интервальной арифметики;
  • • функцию DF, вычисляющую производную /х(ж) с использованием интервальной арифметики;
  • • функцию midpoint, вычисляющую среднюю точку т интервала X = = [Ж1,Ж2] с максимальной точностью, применяя #-выражение;
  • • главную программу, считывающую начальный интервал X = [а, Ь], проверяющую два условия f(a) ? f(b) <0 и 0 DF(X) и вычисляющую итерации по методу Ньютона. При каждой итерации новый интервал выводится на печать. Процесс завершается, когда Xn+i = Хп (о конечной сходимости см. [39]).

Подсказка. Используйте [2.0,3.0] в качестве начального интервала. Обратите внимание, что для вычисления /(т(Х)) с помощью интервальной функции F среднюю точку интервала, возвращаемую функцией midpoint, необходимо преобразовать в интервал.

Решение

program i_newton (input, output);

{ Упражнение 25. Интервальный метод Ньютона } use i_ari;

var х, у : interval;

function F (x : interval) : interval;

begin

F:= sqrt(x) + (x+1) * cos(x);

end;

function DF (х : interval) : interval;

begin

DF:= 0.5/sqrt(x) + cos(x) - (x + 1) * sin(x); end;

function midpoint (x : interval) : real;

begin

midpoint:= #* (0.5 * x.inf + 0.5 * x.sup); end;

function criterion_satisfied (x : interval) : boolean; var

a, b: interval;

begin

a:= intval(inf(x));

b:= intval(sup(x));

criterion_satisfied:= (sup(F(a)*F(b)) < 0) and (not (0 in DF(x))); end;

begin

writeln(’Exercise 25: Interval Newton Method’); writein;

write (’Starting interval: ’); read (y); writein;

writein (’Iteration’); writein;

if criterion.satisfied (y) then

repeat

writein (y);

x:= y;

y:= ( midpoint(x) - F ( intval(midpoint(x)) ) / DF(x) ) ** x;

until у = x

else

writein (’Criterion not satisfied!’);

end.

Вывод времени выполнения

Exercise 25: Interval Newton Method

Starting interval: [2,3]

Iteration

[ 2.0E+000,

[ 2.0E+000,

[ 2.05E+000,

[ 2.05903E+000,

[ 2.059045253413E+000,

[ 2.059045253415143E+000,

3.0E+000] 2.3E+000] 2.07E+000] 2.05906E+000] 2.059045253417E+000] 2.059045253415145E+000]

Упражнение 26. Метод Рунге-Кутты

Метод Рунге-Кутты [53] используется для приближенного решения задачи Коши где

и

< У! (a?) >

< y'^x) >

Y =

Уп(х) J

k yM /

/ Л(ж,7/1,...,Уп)

ВД = :

fn(x, yi Уп) /

Введем коэффициенты К,:

Кх = h*F(x,Y),

K2 = h*F(x + |,У + ^-),

K3 = h*F(x + ^,Y+^'),

Kt = htF(x + h,Y + К3).

Приближение для решения Y в точке х + h дается формулой

Y(x + А) = У (я) + (Ki + 2F2 + 2F3 + F4)/6.

Требуется написать программу на языке PASCAL-XSC, использующую / 1

модуль MV_ARI. Начиная с У (0) — I 0 I, значения У вычисляются в 1 /

точках Xj = i * h, i = 1,..., 10, где h = 0.125. В качестве примера следует использовать функцию

/ У1 - У2

F(x, У) = ех • У3

Щ - Y2)/ex

Вывод должен быть представлен в форме таблицы. Определите векторную функцию F(rr, У). Вычисляйте значения К±, К%, К%, и У(а?г) в цикле с помощью предопределенных операций модуля MV_ARI.

Решение

program Runge_Kutta (input, output);

{ Упражнение 26. Метод Рунге-Кутты } use mv_ari;

const

n = 3;

var

h, х : real;

Y : rvector[1..n];

i : integer;

function F (x : real; Y : rvector) : rvector[1..n];

var i: integer;

begin

F[l] := Y[l] - Y[2] ;

F[2]:= exp(x) * Y[3] ;

F[3] := (Y[1J - Y[2J) / exp(x);

end;

function 0ne_Step (x, h : real; var Y : rvector) : rvector[1..n];

{ Функция реализует один шаг метода Рунге-Кутты } var

kl, k2, k3, к4 : rvector[1..n];

begin

kl := h * F (x , Y);

k2 := h * F (x + h/2, Y + kl/2);

k3 := h * F (x + h/2, Y + k2/2);

k4 := h * F (x + h , Y + k3);

One.Step := Y + (kl + 2 * k2 + 2 * k3 + k4) /6;

end;

begin

writein(’Exercise 26: Runge-Kutta Method’);

writein;

x: = 0; Y[l]:= 1; Y[2] := 0; Y[3] := 1; h:= 0.125;

writein (’ x Y’);

write (’--------------------------------------’ ) ;

writein (’-------------------------------------’) ;

writein (xi:7:4,’ ’,Y[1],’ ’,Y[2],’ ’,Y[3]);

for i:=l to 10 do

begin

x := i*h;

Y := 0ne_Step (x, h, Y);

writein (x:7:4,’ ’,Y[1],’ ’,Y[2],’ ’,Y[3]); end;

end.

Вывод времени выполнения

Exercise 26: Runge-Kutta Method

  • 0.0000
  • 0.1250
  • 0.2500
  • 0.3750
  • 0.5000
  • 0.6250
  • 0.7500
  • 0.8750
  • 1.000000000000000E+000
  • 1.123177059359435E+000
  • 1.239209386091870E+000
  • 1.341958893792722E+000
  • 1.424014481447932E+000
  • 1.476592898728182E+000
  • 1.489460043511421E+000
  • 1.450881281820536E+000
  • 0.000000000000000E+000
  • 1.589550140041404E-001
  • 3.550710525572459E-001
  • 5.919581434349622E-001
  • 8.728079152996371E-001
  • 1.200161743578859E+000
  • 1.575636069976619E+000
  • 1.999602458523678E+000
  • 1.000000000000000E+000
  • 1.102222238011605E+000
  • 1.187244664965584E+000
  • 1.253740540716452E+000
  • 1.300672225680391E+000
  • 1.327307372755333E+000
  • 1.333230355256656E+000
  • 1.318348752540877E+000
  • 1.0000 1.347610792483193Е+000 2.470820861695647Е+000 1.282894792112784Е+000
  • 1.1250 1.164931397828429Е+000 2.986025793442226Е+000 1.227421725713755Е+000
  • 1.2500 8.867578092820163Е-001 3.539466687473293Е+000 1.152795195942419Е+000

Замечание. На примере последних двух упражнений видно, что принцип совмещения операций в PASCAL-XSC существенно упрощает отображение численных алгоритмов в текст программы. Как правило, математические формулы оказывается возможным использовать непосредственно как операторы в программе.

Упражнение 27. Рациональная арифметика

Требуется написать модуль на языке PASCAL-XSC, реализующий рациональную арифметику [27]. Рациональное число p = n/d должно быть представлено как запись с компонентами типа integer: numerator (числитель) и denominator (знаменатель, который должен быть больше нуля). Модуль должен содержать следующие глобальные декларации:

  • а) тип Rational;
  • б) операции +, *, /, возвращающие результат типа Rational, причем

числитель и знаменатель должны быть взаимно простыми;

в) процедуры для ввода и вывода рациональных чисел в форме

integer/integer.

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

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

(а + 5) * (b - с)/(с + d),

где а = 3/4, 6 = 2/7, с — 4/5 и с/= 7/9.

Подсказка. Функция, сокращающая дробь, должна использовать операцию целочисленного деления (div) числителя и знаменателя на наибольший общий делитель. Для нахождения наибольшего общего делителя можно применить следующий алгоритм:

а, b > 0, zq := а, tiq := b, i := О,

Пусть / 1 при i = 0.1, 2,...

[ di+i := rii mod di J

пока не выполнится условие <Д+1 — 0.

Тогда Пг+i (или di) — наибольший общий делитель а и Ь.

Обратите внимание, что наибольший общий делитель нуля и не равного нулю х всегда равен х.

Решение

module rational;

{ Упражнение 27. Рациональная арифметика }

global type

positive = 1..maxint;

rational = record

numerator : integer;

denominator : positive;

end;

function gcd (a, b : integer) : positive;

var

n, d, r : integer;

begin

if a = 0 then gcd:= b

else if b = 0 then

gcd:= a

else

begin

d:= a;

r:= b;

repeat

n:= d;

d: = r;

r:= n mod d;

until r = 0;

gcd:= abs(d);

end;

end;

function reduce (a: rational) : rational;

var

g : positive;

begin

g:= gcd (abs(a.numerator),a.denominator);

if (g = 0) or (g = 1) then reduce := a

else

begin

reduce.numerator := a.numerator div g;

reduce.denominators a.denominator div g;

end;

end;

global operator + (a,b : rational) respl : rational;

var

s: rational;

begin

s.numerator := a.numerator*b.denominator + b.numerator*a.denominator; s. denominator: = a. denominator^. denominator;

respl:= reduce (s);

end;

global operator - (a,b : rational) resmi : rational;

var s: rational;

begin

s.numerator := a.numerator*b.denominator - b.numerator*a.denominator; s . denominator: = a. denominator^. denominator;

resmi:= reduce (s);

end;

global operator * (a,b : rational) resmu : rational;

var s: rational;

begin

s.numerator := a.numerator*b.numerator;

s.denominator:= a.denominator*b.denominator;

resmu:= reduce (s);

end;

global operator / (a,b : rational) resdi : rational; var help : integer;

s : rational;

begin

s.numerator:= a.numerator*b.denominator;

help := a.denominator*^numerator;

if help > 0 then

s. denominators help

else if help < 0 then begin

s.numerator := -s.numerator;

s.denominator:= -help; end

else { искусственный вызов ошибки делением на ноль } helps help div help;

resdis reduce (s) ;

end;

global procedure read (var f: text; var r: rational); var

s, sn, sd: string;

i, 1 : integer;

begin

if eoln (f) then readln (f);

read (f,s);

is pos (’/’,s);

Is length (s);

sns substring (s,l,i-l);

sds substring (s,i+l,l-i);

r.numerators ival (sn);

Is ival (sd);

if 1 > 0 then r.denominator:= 1

else if 1 < 0 then begin

r.numerator s - r.numerator;

r.denominator s - 1;

end

else { искусственный вызов ошибки делением на ноль } 1:= 1 div 1;

г:= reduce (г);

end;

global procedure write (var f: text; a: rational);

begin

write (f, a.numerator:1, ’/’, a.denominator:1);

end;

end. { конец модуля rational }

program test_ratio (input, output);

{ Упражнение 27. Рациональная арифметика (тестовая программа) } use rational;

var

a,b,c,d : rational;

begin

writeln(’Exercise 27: Rational Arithmetic - Test Program’); writein;

write (’a = writein (a);

’); read (a);

write (’b =

’); read (b);

writein (b);

write (’c =

’); read (c);

writein (c) ;

write (’d =

’); read (d);

writein (d);

writein;

writein (’a+b = ’, a+b);

writein (’b-c = ’, b-c);

writein (’c+d = ’, c+d);

writein (’(a+b)*(b-c)/(c+d) = ’, (a+b)*(b-c)/(c+d)); end.

Вывод времени выполнения

Exercise 27: Rational Arithmetic

a = 3/4

b = 2/7

c = 4/5

d = 7/9

a+b = 29/28

b-c = -18/35

c+d = 71/45

(a+b)*(b-c)/(c+d) = -2349/6958

Упражнение 28. Вычисление полиномов

Требуется написать программу на языке PASCAL-XSC для вычисления значения полинома

p(t) — dntn + • • • + dpi + +) с максимальной точностью, используя модуль LSS из библиотеки численных методов языка PASCAL-XSC, предназначенный для верифицированного решения системы линейных уравнений. Схему Горнера

p(t) = (... (ап • i + an_i) • t + ап_2) • • •) • t + nJ • t + aQ для вычисления значения полинома можно реализовать через решение системы линейных уравнений

  • 2-‘о — dn
  • — txg + dn—i
  • 2-71—1 — tXn—2 + Я1

= txn — i 4- <2-0,

введя п +1 переменных xq, a?i,..., xn-i, хп. Значение полинома р в точке t равно хп, т. е. xn—p(t).

Таким образом, необходимо решить систему линейных уравнений

/ 1 0

Хо

Х1

( dn

dn—1

di

ао /

  • -t 1
  • -t 1

о -t 1 у или

Ах = Ь, где

{1 при i = j 'I

  • -t при i = j + 1 > , i, j = 0,..., n
  • 0 в остальных случаях J

b = (bi bi = dn-i, i = 0,...,n.

Программа на языке PASCAL-XSC должна содержать: а) определение динамического типа polynomial (с компонентами типа real);

  • б) процедуру read для ввода коэффициентов полинома;
  • в) функцию Horner для вычисления значения полинома по схеме Горнера;
  • г) процедуру set_A_b, порождающую матрицу А и вектор b на основе полинома р и числа t типа real;
  • д) процедуру main с формальным параметром п, которая:
    • - объявляет переменную р типа polynomial, вектор b типа rvector, интервальный вектор X типа ivector и квадратную матрицу А типа rmatrix с диапазоном индексов 0,..., п;
    • - считывает коэффициенты полинома ао,...,ап при помощи процедуры read из пункта (б);
    • - вычисляет матрицу А и вектор b при помощи процедуры из пункта (г);

вычисляет включение X решения системы Ах = b с максимальной точностью при помощи процедуры Iss;

  • - и наконец, если процедура Iss завершилась успешно, печатает нижнюю и верхнюю границы интервального включения Хп значения полинома хп = p(t) и, для сравнения, значение, полученное по схеме Горнера (пункт (в));
  • е) главную программу, запрашивающую у пользователя степень полинома и вызывающую процедуру main.

Подсказка. Необходимо использовать модуль LSS из библиотеки численных методов языка PASCAL-XSC. Этот модуль содержит процедуру Iss, вычисляющую верифицированный включающий вектор X для решения х уравнения Ах = Ъ, исходя из матрицы А и правой части Ь. Процедура Iss объявлена следующим образом:

procedure Iss ( var A: rmatrix; var b: rvector;

var X: ivector; var encode: integer );

где

encode = 0 : успешное завершение;

encode = 1 : система слишком плохо обусловлена;

encode = 2 : возможно, матрица вырожденная.

Проверьте вашу программу на следующих примерах:

Пример 1:

Степень полинома Коэффициенты

3

а0 = 1536796802 щ = -1086679440 а2 = -768398401 аз = 543339720

Точка вычисления

t = 1.4142135

Пример 2:

Степень полинома Коэффициенты

3

а0 = 191971912515 ai = -135744641136 а2 = -95985956257 а3 = 67872320568

Точка вычисления

t = 1.41421353154

Решение

program Polynomial-Evaluation (input, output);

{ Упражнение 28. Вычисление полиномов }

use i_ari, mv_ari, Iss;

type polynomial = dynamic array [*] of real;

procedure read (var f: text; var p: polynomial);

var

i: integer;

begin

for i:= 0 to ub(p) do

begin

write (’Coeff. ’,i:2,’: ’);

read (f, p [i]);

end;

end;

function Horner (p : polynomial; t: real) : real; var

h: real;

i: integer;

begin

h:= 0;

for i:= ub(p) downto 0 do

h: = p[i] + t * h;

horner:= h;

end;

procedure set_A_b (p : polynomial; t : real;

var A: rmatrix; var b: rvector);

var

i, j, ub_p: integer;

begin

А:= null (А);

А[0,0]:= 1;

for i:= 1 to ub(A) do

begin

A[i,i-1]: = -t; { sub diagonal := -t }

A[i,i] := 1; { diagonal := 1 }

end;

ub_p:= ub(p);

for i:= 0 to ub(b) do b[i] := p[ub_p-i];

end;

procedure main (n: integer);

var

p: polynomial[0..n];

b: rvector[0..n];

X: ivector[0..n];

A: rmatrix[0..n,0..n];

t: real;

error: integer;

begin

writein (’Enter a polynomial’);

read (p);

write (’Enter the point of evaluation t = ’); read(t);

writein;

set_A_b (p,t,A,b);

Iss (A,b,X,error);

if error=0 then

begin

writein (’Horner scheme : ’, horner (p,t));

writein (’Inclusion : ’, X[n]);

end

else

writein (’Error ’,error:1,’ ocurred’);

end;

var n: integer;

begin

writeln(’Exercise 28: Evaluation of Polynomials’);

writein;

write (’Degree of polynomial: ’); read (n);

main (n);

end.

Вывод времени выполнения

Пример 1

Degree of polynomial: 3

Enter polynomial

Coeff. 0 = 1536796802

Coeff. 1 = -1086679440

Coeff. 2 = -768398401

Coeff. 3 = 543339720

Enter the point of evaluation t = 1.4142135

Horner scheme : 5.960464477539062E-006

Inclusion : [ 5.978758733249328E-006, 5.978758733249330E-006]

Пример 2

Degree of polynomial: 3

Enter polynomial

Coeff. 0 = 191971912515

Coeff. 1 = -135744641136

Coeff. 2 = -95985956257

Coeff. 3 = 67872320568

Enter the point of evaluation t = 1.41421353154

Horner scheme : 1.000183105468750E+000

Inclusion : [ 1.000182503810985E+000, 1.000182503810986E+000]

Замечание. Данное упражнение демонстрирует, как подпрограмму для верифицированного решения системы линейных уравнений можно использовать для вычисления полинома с максимальной точностью. В то же время видно, что широко применяемая схема Горнера может давать неточные результаты.

Процедура Iss используется здесь для простоты. Читатель в качестве более сложного упражнения может разработать более эффективный алгоритм, использующий особенности структуры матрицы А (см. [9]).

Приложение А

Синтаксические диаграммы

В дополнение к синтаксическому описанию языка PASCAL-XSC (гл. 2), данному в упрощенной форме Бэкуса-Наура, здесь мы приводим его полное описание. Для этой цели используется особая разновидность синтаксических диаграмм, применявшаяся также в [7], [8] и [17]. Следующие правила определяют построение диаграмм:

  • • каждая диаграмма помечается числом, за которым следует специальный идентификатор (последовательность прописных букв), который называется синтаксической переменной. Синтаксические переменные используются для отсылки к представленным элементам языка;
  • • диаграммы состоят из синтаксических переменных, терминальных символов (выделенных полужирным шрифтом и записанных строчными буквами зарезервированных слов, заключенных в кружки отдельных символов или заключенных в овалы последовательностей символов), а также сплошных или пунктирных линий;
  • • в диаграммах синтаксические переменные могут иметь семантический префикс. Например, переменная ИДЕНТИФИКАТОР (ИД) может употребляться с префиксом КОМП, обозначая особую разновидность идентификатора, а именно идентификатор компоненты. Тем не менее, определение переменной КОМП ИД следует искать на диаграмме ИДЕНТИФИКАТОР.

Кроме того, такие семантические атрибуты могут быть выделены курсивом и располагаться рядом с переменной или снизу от нее. Если приведено несколько атрибутов, запятая между ними понимается как «или». Используются следующие сокращения.

БО

Бинарная операция

В

Вещественный тип (тип real)

ВВ

Тип rvector (вещественные векторы)

ВИ

Тип interval (вещественные интервалы)

ВМ

Тип rmatrix (вещественные матрицы)

ДМ

Динамический массив

дот

Выражение типа dotprecision

ЗАП

Запись

ИВ

Тип ivector (интервальные векторы)

ид

Идентификатор

ИМ

Тип imatrix (интервальные матрицы)

к

Тип complex (комплексные числа)

кв

Тип cvector (комплексные векторы)

КИ

Тип cinterval (комплексные интервалы)

кив

Тип civector (комплексные интервальные векторы)

КИМ

Тип cimatrix (комплексные интервальные матрицы)

км

Тип cmatrix (комплексные матрицы)

комп

Компонента (записи)

конст

Константа

л

Логический тип (тип boolean)

м

Массив

мн

Множество

ПЕР

Переменная

пт

Перечислимый тип

РЕЗ

Результат

с

Символьный тип (тип char)

СП

Список полей

СТР

Строковый тип (тип string)

ТФ

Текстовый файл

У

Указатель

УО

Унарная операция

ф

ФСТ

ФУН

ц

Файл

Файл в структурных типах

Функция

Целочисленный тип (тип integer)

Для облегчения работы с диаграммами список всех синтаксических переменных (идентификаторов) приведен в алфавитном порядке в приложении Б, разд. 1.

Синтаксические диаграммы используются в соответствии со следующими правилами:

  • • прохождение диаграммы начинается с верхнего левого угла и заканчивается в правом нижнем;
  • • сплошные линии проходятся слева направо или сверху вниз, пунктирные — справа налево или снизу вверх;
  • • если при прохождении диаграммы встречается синтаксическая переменная, необходимо пройти диаграмму, на которой определяется эта переменная, после чего вернуться к исходной диаграмме.

Р1 ЕДИНИЦА КОМПИЛЯЦИИ

предложение use

Р2 ДЕКЛАРАЦИИ И ТЕЛО ПРОГРАММЫ (ДТП)

  • -------ОБЛАСТЬ ДЕКЛАРАЦИЙ
  • ------begin--1- ОПЕРАТОР----end

РЗ ДЕКЛАРАЦИИ И ТЕЛО МОДУЛЯ (ДТМ)

Р4 ДЕКЛАРАЦИЯ МОДУЛЯ

Р6 ОПРЕДЕЛЕНИЕ КОНСТАНТЫ

Р7 КОНСТАНТА (КОНСТ)

У (указатель)

Р8 ОПРЕДЕЛЕНИЕ ТИПА

Список предопределенных идентификаторов

типов языка PASCAL-XSC:

integer

Ц

dotprecision

дот

real

в

rvector

BB

boolean

Л

rmatrix

BM

char

c

cvector

KB

text

ТФ

cmatrix

KM

string

CTP

ivector

ИВ

complex

к

imatrix

им

interval

ВИ

civector

кив

cinterval

ки

cimatrix

КИМ

Р9 ОПРЕДЕЛЕНИЕ ТИПА В МОДУЛЕ

РЮ

ТИП

---------ид-

типа

---ид---

константы ПТ

-ид-

типа

Л, С, ПТ

{ string }

---КОНСТ Ц максимтхьная длина

— packed

array

ТИП Ц нижняя граница 1

of

char---

— packed —

array

— ТИП — Ц, А, С, ПТ

of----ТИП--

компонент

— record

СПИСОК ПОЛЕЙ

end---

-----set

of

  • — ТИП — Ц, А, С, ПТ
  • -----file-----------of
  • -ТИП-не ФСТ

ПТ

У

ц

диапазон

Л, С, ПТ

СТР

СТР (статическая), также М

М, также ФСТ, если компоненты — типа ФСТ

ЗАП, также ФСТ, если СП содержит тип ФСТ

МН

Ф, также ФСТ

Р11 СПИСОК ПОЛЕЙ (СП)

Р12 ДЕКЛАРАЦИЯ ПЕРЕМЕННОЙ

Р14 ЗАГОЛОВОК ПРОЦЕДУРЫ/ФУНКЦИИ (ЗП/Ф)

г procedure----ИД----СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ---------

процедуры

- function----ИД----СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ--О— ТР

функции

Р15 ОПРЕДЕЛЕНИЕ ПРИОРИТЕТА

priority

Р16 ЗАГОЛОВОК ОПЕРАЦИИ

— operator

Р17 СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ УНАРНОЙ ОПЕРАЦИИ (СФП УО)

var----

— ИД — переменной

СТ

Р18 СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ БИНАРНОЙ ОПЕРАЦИИ (СФП БО)

var -]

— ид —

переменной

— ИД — переменной

СТ---

--ИД —

переменной

СТ

var -|

— ИД — переменной

СТ

Р19 СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ ОПЕРАЦИИ ПРИСВАИВАНИЯ (СФП ОП)

var----ИД---

переменной

СТ

var -1

— ИД-

переменной

СТ

Р20 ТИП РЕЗУЛЬТАТА (ТР)

-----ИД ТИПА-----

При использовании в Р14 внутри Р22 допустим также ИД динамического типа

.........Q.........

выр---Q---выр

Ц Ц

  • ---ИД ДИН. ТИПА-------Q)
  • ( string )?

Р21 ТЕЛО

ОБЛАСТЬ ДЕКЛАРАЦИЙ

begin--— ОПЕР-----end---

forward

external

СТРОКОВАЯ КОНСТАНТА

Р23 СПЕЦИФИКАЦИЯ ТИПА (СТ)

— ИД ТИПА —

ИД ДИН. ТИПА

—( String )—

Р24 ОПЕРАТОР (ОПЕР)

метка

ПЕРЕМЕННАЯ

- РЕЗУЛЬТАТ

ВЫР

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

- begin -I— ОПЕР

end

составной оператор

  • - with - ПЕРЕМЕННАЯ
  • - while

L- РЕЗУЛЬТАТ

ЗАП

ВЫР —

do

ОПЕР

оператор with

do

ОПЕР

- repeat -I— ОПЕР----until

ВЫР Л

операторы 'цикла

— for----ИД---

переменной

ВНР

ВНР — do - ОПЕР -

— if

ВЫР Л

then — ОПЕР

— else — ОПЕР

условный оператор

case - ВЫР - of ВЫБОР

ОПЕР

Ц, Л, С, ПТ

end

оператор case

goto

ПОСЛЕДОВАТЕЛЬНОСТЬ ЦИФР - оператор метка

---ИД ПРОЦЕДУРЫ---СПИСОК ФАКТИЧЕСКИХ ПАРАМЕТРОВ

goto вызов процедуры

ОПЕРАТОР ВВОДА-ВЫВОДА

ВЫЗОВ СТАНДАРТНОЙ ПРОЦЕДУРЫ

Р25 РЕЗУЛЬТАТ

Предопределенные идентификаторы компонент PASCAL—XSC: re, im, inf, sup

Р26 ВЫЗОВ СТАНДАРТНОЙ ПРОЦЕДУРЫ

Р27 ОПЕРАТОР ВВОДА-ВЫВОДА (ОВВ)

Р28 ВЫРАЖЕНИЕ (ВЫР)

Р29 ВЫСОКОТОЧНОЕ ВЫРАЖЕНИЕ

ТОЧНОЕ ВЫРАЖЕНИЕ

РЗО ТОЧНОЕ ВЫРАЖЕНИЕ (ТВ)

Все слагаемые должны иметь одну и ту же структуру (скаляр, вектор или матрица) и одинаковую размерность.

Явные высокоточные выражения недопустимы в Ц ВЫР оператора for.

Р31 СОМНОЖИТЕЛЬ

ОПЕРАНД

Р32 ОПЕРАНД

КОНСТАНТА Ц,В

----ПЕРЕМЕННАЯ----

стандартного арифм. типа

-----ИД ФУНКЦИИ------ Допустимы только функции compl, re, im, conj, intval, inf, sup, id, transp и herm из арифметических модулей и функции преобразования типа rvector, cvector, ivector, civector, matrix, cmatrix, imatrix, cimatrix (см. разд. 2.4.4).

Р34 УНАРНАЯ ОПЕРАЦИЯ (УО) приоритет 3

ИД УО

-®-

В стандартном Паскале — приоритет 1

— not —

Р36 ПЕРЕМЕННАЯ (ПЕР)

Предопределенные идентификаторы компонент языка PASCAL—XSC: re, im, inf, sup

Р37

Р37 ВЫЗОВ СТАНДАРТНОЙ ФУНКЦИИ (продолжение)

ВЫР В

— ВЫР —

ц, в, дот

ВЫР В

ПЕРЕМЕННАЯ — Ф, ГФ

ВЫР Ц

  • -( 1ос )—© ПЕРЕМЕННАЯ--©
  • —( Ibound )—
  • —(abound

ПЕРЕМЕННАЯ М

ВЫР СТР

—( rval )—(7)"

ВЫР СТР

  • -f length 'I—(Т)-------ВЫР-------
  • -(maxlength)—©--ПЕРЕМЕННАЯ

формат

Р37 ВЫЗОВ СТАНДАРТНОЙ ФУНКЦИИ (продолжение; предполагается использование арифметических модулей)

---ВНР---

Ц, В, ВИ, вв, ив, вм, им

Ц, В, ВИ, вв, ив, вм, им

—fcompl

  • —( intval )--QQ
  • ---ВНР--- к, ки, кв, кив, КМ, КИМ
  • ---ВНР--- ц, в, к, вв, кв, вм, км
  • ---ВЫР--- ц, в, к, вв, кв, вм, км
  • -( null )--(7)
  • ----ВЫР----

ВИ, ки, ив, кив, ИМ, КИМ

  • -----ВЫР----- ц, вв, кв, ив, кив, ВМ, КМ, ИМ, КИМ
  • -----ВЫР-----

Ц, ВМ, КМ, ИМ, КИМ

ВЫР ц

-----ВЫР------

Ц, ВМ, КМ, ИМ, КИМ

Ц, ВМ, КМ, ИМ, КИМ

  • 7 blow )--(jQ
  • ----ВЫР----

ВМ, КМ, ИМ, КИМ

----ВЫР----

ВИ, ки, ив, кив, ИМ, КИМ

ВЫР в

Р38 ИДЕНТИФИКАТОР (ИД)

БУКВА

ЦИФРА

БУКВА

Р39 ПОСЛЕДОВАТЕЛЬНОСТЬ ЦИФР (ПЦ)

ЦИФРА

Р40 ПОСЛЕДОВАТЕЛЬНОСТЬ ШЕСТНАДЦАТЕРИЧНЫХ ЦИФР (ПШЦ)

ШЕСТНАДЦАТЕРИЧНАЯ ЦИФРА

Р41 СИМВОЛ

  • -------------------БУКВА ?
  • ----------ЦИФРА

набор дополнительных символов зависит от реализации

Р42

БУКВА

1 0 I

Р43

ЦИФРА

  • 1—®—
  • --Q--
  • 1-----®-----1---------

Р44

ШЕСТНАДЦАТЕРИЧНАЯ ЦИФРА

1 0 I

---ЦИФРА

Приложение Б

Справочный раздел

1. Синтаксические диаграммы

Номер Идентификатор диаграммы (синтаксическая переменная) Стр.

РЗЗ БИНАРНАЯ ОПЕРАЦИЯ (БО) .................... 272

Р42 БУКВА ............................... 278

Р13 ВЫБОР ............................... 263

Р26 ВЫЗОВ СТАНДАРТНОЙ ПРОЦЕДУРЫ ............... 268

Р37 ВЫЗОВ СТАНДАРТНОЙ ФУНКЦИИ ................ 268

Р28 ВЫРАЖЕНИЕ (ВЫР) ........................ 270

Р29 ВЫСОКОТОЧНОЕ ВЫРАЖЕНИЕ .................. 271

РЗ ДЕКЛАРАЦИИ И ТЕЛО МОДУЛЯ (ДТМ) .............. 258

Р2 ДЕКЛАРАЦИИ И ТЕЛО ПРОГРАММЫ (ДТП)............ 258

Р4 ДЕКЛАРАЦИЯ МОДУЛЯ....................... 258

Р12 ДЕКЛАРАЦИЯ ПЕРЕМЕННОЙ.................... 263

Р1 ЕДИНИЦА КОМПИЛЯЦИИ ..................... 257

Р16 ЗАГОЛОВОК ОПЕРАЦИИ ...................... 264

Р14 ЗАГОЛОВОК ПРОЦЕДУРЫ/ФУНКЦИИ (ЗП/Ф) ........... 264

Р38 ИДЕНТИФИКАТОР (ИД) ...................... 277

Р7 КОНСТАНТА (КОНСТ) ....................... 260

Р5 ОБЛАСТЬ ДЕКЛАРАЦИЙ ...................... 259

Р32 ОПЕРАНД .............................. 272

Р24 ОПЕРАТОР (ОПЕР) ......................... 267

Р27 ОПЕРАТОР ВВОДА-ВЫВОДА (ОВВ) ................. 269

Р6 ОПРЕДЕЛЕНИЕ КОНСТАНТЫ.................... 259

Р15 ОПРЕДЕЛЕНИЕ ПРИОРИТЕТА ................... 264

Р8 ОПРЕДЕЛЕНИЕ ТИПА ....................... 261

Р9 ОПРЕДЕЛЕНИЕ ТИПА В МОДУЛЕ ................. 261

Р36 ПЕРЕМЕННАЯ (ПЕР) ........................ 274

Р39 ПОСЛЕДОВАТЕЛЬНОСТЬ ЦИФР (ПЦ) ............... 278

Номер Идентификатор диаграммы (синтаксическая переменная)

Стр.

Р40 ПОСЛЕДОВАТЕЛЬНОСТЬ

ШЕСТНАДЦАТЕРИЧНЫХ ЦИФР (ПШЦ) .............. 278

Р25 РЕЗУЛЬТАТ ............................. 267

Р41 СИМВОЛ .............................. 278

Р31 СОМНОЖИТЕЛЬ .......................... 272

Р23 СПЕЦИФИКАЦИЯ ТИПА (СТ) ................... 266

Р11 СПИСОК ПОЛЕЙ (СП) ....................... 262

Р35 СПИСОК ФАКТИЧЕСКИХ ПАРАМЕТРОВ ............. 274

Р22 СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ .............. 266

Р18 СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ

БИНАРНОЙ ОПЕРАЦИИ (СФП БО) ................ 265

Р19 СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ

ОПЕРАЦИИ ПРИСВАИВАНИЯ (СФП ОП) ............. 265

Р17 СПИСОК ФОРМАЛЬНЫХ ПАРАМЕТРОВ

УНАРНОЙ ОПЕРАЦИИ (СФП УО) ................. 265

Р21 ТЕЛО ................................ 266

Р10 ТИП................................. 261

Р20 ТИП РЕЗУЛЬТАТА (ТР) ....................... 266

РЗО ТОЧНОЕ ВЫРАЖЕНИЕ (ТВ) .................... 271

Р34 УНАРНАЯ ОПЕРАЦИЯ (УО)..................... 273

Р43 ЦИФРА ............................... 279

Р44 ШЕСТНАДЦАТЕРИЧНАЯ ЦИФРА .................. 279

2. Зарезервированные слова

and array

begin

case const

div do downto dynamic

else end external

file for forward function

global goto

if in

label

mod module

nil not

of operator or packed priority procedure program record repeat set sum

then to type

until use

var

while with

3. Предопределенные идентификаторы

Здесь приведен ядра языка, так вом).

полный список предопределенных идентификаторов как и арифметических модулей (последние выделены курси-

Константы

false

maxint

true

Типы

boolean char cimatrix cinterval civector cmatrix complex cvector dotprecision imatrix integer interval ivector real rmatrix rvector string text

Переменные

input output

Идентификаторы

компонент

im inf

re

sup

Функции

abs arccos arccot arcosh arcoth arcsin arctan arctan2 arg arsinh artanh blow

chr comp compl conj cos cosh cot coth diam

eof eoln exp exp2 exp 10 expo

herm

id im image inf intval ival

lb Ibound length In loc log2 log 10

mant maxlength mid

null odd ord

pos

pred

re

round rval

sign

sin sinh sgr sgrt substring succ sup

tan

tanh transp trunc

ub ubound

vnull

Процедуры

dispose

get

mark

new

page put

read readln release reset rewrite

write writein

4. Операции

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

4.1 Основные операции

Левый операнд

Правый операнд

integer

boolean

char

string

set

унарные

+>—

not

integer

+> “>*)/?

div, mod,

V

in

boolean

or, and,

in

char

+

V

+

V

in

in

string

+

V

+

V in

set

A || + II - ’

A J

V V

II - *

перечислимый

тип

in

4.2 Арифметические операции

Левый операнд

Правый операнд

integer real complex

interval cinterval

rvector cvector

ivector civector

rmatrix cmatrix

imatrix cimatrix

унарные ’

+, -

+, -

+, -

+, -

+, -

+, -

integer real complex

o,o<,o>,'

+*

+ ) “)*> / , + *

*,*<,*>

*

*,*<,*>

*

interval cinterval

—Л +*

+ > ~ 5 *> /> + *, **

*

*

*

*

rvector cvector

Л Л *

V v *

/

„ A) 0, 0 <, 0 >,

+*

4) +>— 1

+ *

ivector civector

?,/

*,/

4) +>—) *J

+*

4)

+ j — J *5

+ *, **

rmatrix cmatrix

A A

* '

V v *

*,/

*,*<,*>

*

o,o<,o>/ +*

4) +,-,*/ +*

imatrix cimatrix

?,/

*,/

*

*

4) +>— > *>

+*

4)

+*, **

х) Операции в этой строке относятся к унарным (т.е. у них нет левого операнда).

  • 2) °е{+,-*,/}•
  • 3) о G {+,—,*}, где * обозначает скалярное или матричное произведение.
  • 4) * обозначает скалярное или матричное произведение.

+ * : интервальная оболочка (минимальный интервал, включающий оба операнда).

** : пересечение интервалов.

4.3 Операции отношения для арифметических типов

Левый операнд

Правый операнд

integer real complex

interval cinterval

rvector cvector

ivector civector

rmatrix cmatrix

imatrix cimatrix

integer real complex

V Л II JI J1 A

V Л V

in

interval cinterval

—, <>

V Л II 5' J1 J1 Л V

V A V A

rvector cvector

A V A if ii II V A

in

ivector civector

= , <>

V Л II 5’ JI J1 A V

V A V Aj-

rmatrix cmatrix

Л V A

v II II

II V л

in

imatrix cimatrix

=, <>

V Л II 5’ JI J1 A V

V A V A^

х) Символы <= и < обозначают отношения подмножества слева,

>= и > — отношения подмножества справа.

: проверка на непересечение.

in : проверка принадлежности точки интервалу

или включения интервала интервалом.

4.4 Операции присваивания

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

Тип левой части

Тип правой части

Совмещение определено в модуле

complex

integer real

C_ARI

interval

integer real

I_ARI

cinterval

integer real complex interval

CI_ARI

rvector

integer real

MV_ARI

cvector

integer real complex rvector

MVC_ARI

ivector

integer real interval rvector

MVI_ARI

civector

integer real complex interval cinterval rvector cvector ivector

MVCI_ARI

rmatrix

integer real

MV_ARI

cmatrix

integer real complex rmatrix

MVC_ARI

imatrix

integer real interval rmatrix

MVI_ARI

Тип левой части

Тип правой части

Совмещение определено в модуле

cimatrix

integer real complex interval cinterval rmatrix cmatrix imatrix

MVCI-ARI

5. Предопределенные функции

Этот раздел содержит отсортированный по алфавиту список предопределенных функций с их декларациями (интерфейсом) и кратким описанием назначения. Для функций, которые определяются или совмещаются в арифметических модулях, приводится имя соответствующего модуля. Общие математические функции собраны в дополнительной таблице в конце раздела. Информацию об областях определения и множествах значений функций для конкретной версии компилятора можно найти в соответствующем руководстве пользователя.

См. таблицу

на

стр. 300

arccos

См. таблицу

arccot

См. таблицу

на

на

стр. 300

стр. 300

См. таблицу

на

стр. 300

См. таблицу

на

стр. 300

arcsin

См. таблицу

на

стр. 300

См. таблицу на стр. 300

arctan2 J

См. таблицу на стр. 300

arg Л

function arg (с: complex) : real;

Назначение: возвращает аргумент (угловую компоненту) комплексного числа с, представленного в тригонометрической форме.

Определена/переопределена в C_ARI.

function arg (с: cinterval) : interval;

Назначение: возвращает интервал-аргумент (угловую компоненту) комплексного интервала с, представленного в тригонометрической форме.

Определена/переопределена в CI_ARI.

arsinh

См. таблицу на стр. 300

artanh J

См. таблицу на стр. 300

blow )

function blow (х: Typel; eps: real) : Typel;

Typel: interval, cinterval, ivector, civector, imatrix, cimatrix.

Назначение: возвращает эпсилон-расширение интервального аргумента х (для каждой компоненты в случае составных типов). Для х типа interval функция blow вычисляется так:

у := (1 + eps) * х — eps * х;

blow := intval ( pred(inf(y)) , succ(sup(y)) );

Определена/переопределена в I_ARI, CI_ARI, MVI_ARI, MVCI_ARI.

chr

function chr (i: integer) : char;

Назначение: возвращает символ с порядковым номером 1. Если такого значения не существует, фиксируется ошибка.

comp

function comp (m: real; e: integer) : real;

Назначение: объединяет мантиссу m и порядок е в число с плавающей точкой т • Ъе. Если значения Ь, е или т выходят за границы, определенные реализацией, фиксируется ошибка.

conj

function conj (с: Typel) : Typel;

Typel: complex, cinterval, cvector, civector, cmatrix, cimatrix.

Назначение: возвращает сопряженное число (в случае векторных и матричных аргументов — для каждой компоненты).

Определена/переопределена в C_ARI, CI_ARI, MVC_ARI, MVCI-ARI.

cos )

См. таблицу на стр. 300 cosh )

См. таблицу на стр. 300

cot J

См. таблицу на стр. 300 coth J

См. таблицу на стр. 300 diam )

function diam (x: Typel) : ResType;

Typel: interval, cinterval, ivector, civector, imatrix, cimatrix.

ResType: real, rvector, rmatrix в зависимости от структуры

типа Typel.

Назначение: возвращает диаметр интервала х (в случае составных типов — для каждой компоненты).

Определена/переопределена в I_ARI, CI_ARI, MVI_ARI, MVCI_ARI.

function eof (var f: Typel) : boolean;

Typel: text, file of ...

Назначение: возвращает false, если текущая компонента файловой переменной f определена, в обратном случае — true. Если не определена сама файловая переменная f, фиксируется ошибка.

function eof : boolean;

Назначение: соответствует eof(input).

eoln )

function eoln (var f: text) : boolean;

Назначение: возвращает true, если текущая компонента файловой переменной f содержит символ конца строки, в обратном случае — false. Если не определена сама файловая переменная f, фиксируется ошибка.

function eoln : boolean;

Назначение: соответствует eoln(input).

ёхр Л

См. таблицу на стр. 300

ехр2

См. таблицу на стр. 300

ехр10J

См. таблицу на стр. 300

expo J

function expo (х: real) : integer;

Назначение: возвращает порядок числа х, соответствующий нормализованной мантиссе при данном основании.

herm

function herm (x: Typel) : Typel;

Typel: cmatrix, cimatrix.

Назначение: возвращает эрмитову матрицу.

Определена/переопределена в MVC_ARIr MVCI_ARI.

function id (x: Typel) : rmatrix[lb(x)..ub(x),lb(x,2)..ub(x,2)];

Typel: rmatrix, cmatrix, imatrix, cimatrix.

Назначение: возвращает единичную матрицу той же размерности, что и матрица х.

Определена/переопределена в MV_ARI, MVC_ARI, MVI_ARI, MVCI_ARI.

function id (x, y: Typel) : rmatrix[lb(x)..ub(x),lb(y,2)..ub(y,2)];

Typel: rmatrix, cmatrix, imatrix, cimatrix.

Назначение: возвращает единичную матрицу той же размерности, что и произведение матриц х • у.

Определена/переопределена в MV_ARI, MVC_ARI, MVI_ARI, MVCI_ARI.

function id (n: integer) : rmatrix[l..n,l..n];

Назначение: возвращает единичную квадратную матрицу размерности пхп (предполагается, что п^1).

Определена/переопределена в MV_ARI.

function id (nl, n2: integer) : rmatrix[l..nl,l..n2];

Назначение: возвращает единичную прямоугольную матрицу размерности nl хп2 (предполагается, что п1,п2^1).

Определена/переопределена в MV_ARI.

image J

function image (i: integer) : string;

Назначение: переводит целое значение i в строку с длиной, определяемой форматом вывода по умолчанию для значений типа integer (возможно, дополнив пробелами спереди).

function image (i: integer; width: integer) : string;

Назначение: переводит значение i типа integer в строку с длиной width (возможно, дополнив пробелами спереди).

function image (г: real) : string;

Назначение: переводит значение г типа real в строку с длиной, определяемой форматом вывода по умолчанию для значений типа real (возможно, дополнив пробелами спереди).

function image (г: real; width: integer) : string;

Назначение: переводит значение г типа real в строку с длиной width (возможно, дополнив пробелами спереди).

function image (г: real; width, fracs: integer) : string;

Назначение: переводит значение г типа real в строку с длиной width (возможно, дополнив пробелами спереди) и с fracs цифрами после десятичной точки.

function image (г: real; width, fracs, round: integer) : string;

Назначение: переводит значение г типа real в строку с длиной width (возможно, дополнив пробелами спереди) и с fracs цифрами после десятичной точки, округленное в соответствии с round (< 0 — вниз, =0 — к ближайшему, >0 — вверх).

ival )

function ival (s: string) : integer;

Назначение: переводит первую часть строки s, представляющую числовое значение в соответствии с правилами внешнего представления констант типа integer, в значение типа integer. Пробелы спереди и все символы после значения отбрасываются. Если s не удовлетворяет синтаксису внешнего представления констант типа integer, фиксируется ошибка.

function ival (s: string; var rest: string) : integer;

Назначение: переводит первую часть строки s, представляющую числовое значение в соответствии с правилами внешнего представления констант типа integer, в значение типа integer. Пробелы спереди отбрасываются, а все символы после значения возвращаются в строке rest. Если s не удовлетворяет синтаксису внешнего представления констант типа integer, фиксируется ошибка.

( lb )

function lb (var a: Typel; i: integer) : ResType;

Typel: произвольный тип массива.

ResType: тип индексов типа Typel.

Назначение: сокращенная форма записи функции Ibound. Возвращает нижнюю границу i-ro индекса массива а. Если i превосходит число размерностей, фиксируется ошибка.

function lb (var a: Typel) : ResType;

Typel: произвольный тип массива.

ResType: тип индексов типа Typel.

Назначение: сокращенная форма записи функции Ibound. Возвращает нижнюю границу первого индекса массива а.

Ibound

function Ibound (var a: Typel; i: integer) : ResType;

Typel: произвольный тип массива.

ResType: тип индексов типа Typel.

Назначение: возвращает нижнюю границу i-ro индекса массива а. Если i превосходит число размерностей, фиксируется ошибка.

function Ibound (var a: Typel) : ResType;

Typel: произвольный тип массива.

ResType: тип индексов типа Typel.

Назначение: возвращает нижнюю границу первого индекса массива а.

length

function length (s: string) : integer;

Назначение: возвращает текущую длину строкового выражения s.

( )

См. таблицу на стр. 300

loc

function loc (var х: Typel) : integer;

Typel:

произвольный тип.

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

1од2

См. таблицу на стр. 300

( 1одю )

См. таблицу на стр. 300

mant

function mant (х: real) : real;

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

Q maxlength

function maxlength (var s: string) : integer;

Назначение: возвращает максимальную длину строковой переменной s.

mid )

function mid (х: Typel) : ResType;

Typel: interval, cinterval, ivector, civector, imatrix, cimatrix.

ResType: тип нижней границы (inf) или верхней границы

(sup) типа Typel.

Назначение: возвращает среднюю точку х (в случае составных типов — для каждой компоненты).

Определена/переопределена в I_ARI, CI_ARI, MVI_ARI, MVCI_ARI.

null J

function null (x: Typel) : rvector[lb(x)..ub(x)];

Typel: rvector, cvector, ivector, civector.

Назначение: возвращает нулевой вектор той же размерности, что и х.

Определена/переопределена в MV_ARI, MVC_ARI, MVI_ARI, MVCI_ARI.

function null (x: Type2) : rmatrix[lb(x)..ub(x),lb(xI2)..ub(x,2)];

Type2: rmatrix, cmatrix, imatrix, cimatrix.

Назначение: возвращает нулевую матрицу той же размерности, что и х.

Определена/переопределена в MV_ARI, MVC_ARI, MVI_ARI, MVCI_ARI.

function null (x, y: Type2) : rmatrix[lb(x)..ub(x),lb(y,2)..ub(y,2)];

Type2: rmatrix, cmatrix, imatrix, cimatrix.

Назначение: возвращает нулевую матрицу той же размерности, что и произведение матриц х • у.

Определена/переопределена в MV_ARI, MVC_ARI, MVI_ARI, MVCI_ARI.

function null (n: integer) : rmatrix[l..n,l..n];

Назначение: возвращает нулевую квадратную матрицу размерности пхп (предполагается, что п^1).

Определена/переопределена в MV_ARI,

function null (nl, n2: integer) : rmatrix [l..nl,l..n2];

Назначение: возвращает нулевую прямоугольную матрицу размерности пхп (предполагается, что nl, п2 1).

Определена/переопределена в MV_ARI.

odd

function odd (i: integer) : boolean;

Назначение: возвращает true, если i — нечетное число, в обратном случае — false.

ord function ord (x: Typel) : integer;

Typel: integer, boolean, char, перечислимый тип, тип указа

теля.

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

function pos (si, s2: string) : integer;

Назначение: возвращает позицию первого вхождения строки si в строку s2.

pred J

function pred (x: Typel) : Typel;

Typel: integer, real, boolean, char, перечислимый тип.

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

round

function round (х: Typel) : integer;

Typel: integer, real.

Назначение: округление к ближайшему целому числу. Результат удовлетворяет соотношению:

round(x) = sign(x) * trunc(abs(x) + 0.5).

Если такого целого значения нет, фиксируется ошибка.

function rval (s: string) : real;

Назначение: переводит первую часть строки s, представляющую числовое значение в соответствии с правилами для констант типа real, в значение этого типа. Пробелы спереди и все символы после значения отбрасываются. Если s не удовлетворяет синтаксису внешнего представления констант типа real, фиксируется ошибка.

function rval (s: string; var rest: string) : real;

Назначение: переводит первую часть строки s, представляющую числовое значение в соответствии с правилами для констант типа real, в значение этого типа. Пробелы спереди отбрасываются, а все символы после значения возвращаются в строке rest. Если s не удовлетворяет синтаксису внешнего представления констант типа real, фиксируется ошибка.

function rval (s: string; round: integer) : real;

Назначение: переводит первую часть строки s, представляющую числовое значение в соответствии с правилами для констант типа real, в значение этого типа, округленное в зависимости от значения round (< 0 — вниз, = 0 — к ближайшему, >0 — вверх). Пробелы спереди и все символы после значения отбрасываются. Если s не удовлетворяет синтаксису внешнего представления констант типа real, фиксируется ошибка.

function rval (s: string; round: integer; var rest: string) : real;

Назначение: переводит первую часть строки s, представляющую числовое значение в соответствии с правилами для констант типа real, в значение этого типа, округленное в зависимости от значения round (< 0 — вниз, =0 — к ближайшему, >0 — вверх). Пробелы спереди отбрасываются, а все символы после значения возвращаются в строке rest. Если s не удовлетворяет синтаксису внешнего представления констант типа real, фиксируется ошибка.

function sign (х: Typel) : integer;

Typel: integer, real, dotprecision.

Назначение: возвращает знак x ( — 1 для x < 0, 1 для x > 0, 0 для x = 0).

См. таблицу на стр. 300

См. таблицу на стр. 300

С sqr )

См. таблицу на стр. 300

sqrt

См. таблицу на стр. 300 substring function substring (s: string; pos, number: integer) : string;

Назначение: возвращает фрагмент строки s, содержащий number символов, начиная с позиции pos. Если pos больше текущей длины строки s, возвращается пустая строка. Если s содержит меньше, чем pos + number символов, возвращаемая строка соответственно усекается. Если pos < 1, значение pos устанавливается равным 1.

succ )

function succ (х: Typel) : Typel;

Typel: integer, real, boolean, char, перечислимый тип.

Назначение: возвращает элемент, следующий за х. Если такого элемента нет, фиксируется ошибка.

tan J

См. таблицу на стр. 300

tanh

См. таблицу на стр. 300

transp ) function transp (х: Typel) : Typel;

Typel: rmatrix, cmatrix, imatrix, cimatrix.

Назначение: возвращает матрицу, транспонированную по отношению к х.

Определена/переопределена в MV_ARI, MVC_ARI, MVI_ARI, MVCI_ARI.

trunc function trunc (x: Typel) : integer;

Typel: integer, real.

Назначение: округление к значению типа integer путем отбрасывания дробной части. Если такого значения типа integer нет, фиксируется ошибка.

ub

function ub (var a: Typel; i: integer) : ResType;

Typel: произвольный тип массива.

ResType: тип индексов типа Typel.

Назначение: сокращенная форма записи функции abound. Возвращает верхнюю границу i-ro индекса массива а. Если i превосходит число размерностей, фиксируется ошибка.

function ub (var a: Typel) : ResType;

Typel: произвольный тип массива.

ResType: тип индексов типа Typel.

Назначение: сокращенная форма записи функции abound. Возвращает верхнюю границу первого индекса массива а.

ubound ) function ubound (var a: Typel; i: integer) : ResType;

Typel: произвольный тип массива.

ResType: тип индексов типа Typel.

Назначение: возвращает верхнюю границу i-ro индекса массива а. Если i превосходит число размерностей, фиксируется ошибка.

function ubound (var a: Typel) : ResType;

Typel: произвольный тип массива.

ResType: тип индексов типа Typel.

Назначение: возвращает верхнюю границу первого индекса массива а.

vnull

function vnull (n: integer) : rvector[l..n];

Назначение: возвращает нулевой вектор с п компонентами (предполагается, что п^1).

Определена/переопределена в MV_ARI.

Предопределенные математические функции

Функция

Идентификатор

1

Абсолютное значение

abs

2

Арккосинус

arccos

3

Арккотангенс

arccot

4

Гиперболический арккосинус

arcosh

5

Гиперболический арккотангенс

arcoth

6

Арксинус

arcsin

7

Арктангенс

arctan

8

Гиперболический арксинус

arsinh

9

Гиперболический арктангенс

artanh

10

Косинус

cos

11

Котангенс

cot

12

Гиперболический косинус

cosh

13

Гиперболический котангенс

coth

14

Экспонента

exp

15

Показательная функция по основанию 2

exp2

16

Показательная функция по основанию 10

exp 10

17

Натуральный логарифм

In

18

Логарифм по основанию 2

log2

19

Логарифм по основанию 10

log 10

20

Синус

sin

21

Гиперболический синус

sinh

22

Квадрат

sqr

23

Квадратный корень

sqrt

24

Тангенс

tan

25

Гиперболический тангенс

tanh

Аргумент каждой из этих функций может принадлежать типам integer, real, complex, interval и cinterval, т. e. эти функции определены не только для типов integer и real. Они определены также и для типов complex, interval и cinterval — соответствующие определения содержатся в арифметических модулях C_ARIr I_ARI и CI_ARI.

Интерфейсы и декларации этих функций подробно не описываются, поскольку все они определены с одним формальным параметром. Как правило, тип результата совпадает с типом аргумента, но с аргументами типа integer это выполняется только для функций abs и sqr. Все остальные функции для аргументов типа integer возвращают значения типа real.

В дополнение к описанным функциям, существует функция

arctan2(xl, х2)

с двумя аргументами xl, х2 типа real или interval. Она возвращает значение

arctan(xl/x2).

6. Функции преобразования

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

compl j

function compl (xl: Typel; x2: Type2) : ТуреЗ;

Typel: real, interval, rvector, ivector, rmatrix, imatrix.

Type2: real, interval, rvector, ivector, rmatrix, imatrix с той

же структурой (скаляр, вектор, матрица), что и у Typel.

ТуреЗ: соответствующий комплексный тип (complex,

cinterval, cvector, civector, cmatrix, cimatrix).

Назначение: композиция аргументов xl и x2 (вещественная и

мнимая части) в значение соответствующего ком

плексного типа (для векторов и матриц операция выполняется поэлементно).

Определена/переопределена в C_ARI, CI_ARI, MVC_ARI, MVCI_ARI.

function compl (x: Typel) : Type2;

Typel: real, interval, rvector, ivector, rmatrix, imatrix.

Type2: соответствующий комплексный тип (complex,

cinterval, cvector, civector, cmatrix, cimatrix).

Назначение: композиция аргумента x (вещественная часть) и мнимой части, равной нулю, в значение соответствующего комплексного типа (для векторов и матриц операция выполняется поэлементно).

Определена/переопределена в C_ARI, CI_ARI, MVC_ARI, MVCI_ARI.

irn

function im (c: Typel) : Type2;

Typel:

complex, cinterval, cvector, civector, cmatrix, cimatrix.

Type2:

соответствующий вещественный тип (real, interval, rvector, ivector, rmatrix, imatrix).

Назначение:

возвращает мнимую часть аргумента (для векторов и матриц операция выполняется поэлементно).

Определена/переопределена в C_ARI, CI_ARIr MVC_ARI, MVCI_ARI.

inf

function inf (i: Typel) : Type2;

Typel: interval, cinterval, ivector, civector, imatrix, cimatrix.

Type2: соответствующий вещественный или комплексный

тип (real, complex, rvector, cvector, rmatrix, cmatrix).

Назначение: возвращает нижнюю границу интервального аргумента (для векторов и матриц операция выполняется поэлементно).

Определена/переопределена в I_ARI, CI_ARI, MVI_ARI, MVCI_ARI.

intval J

function intval (xl: Typel; x2: Type2) : ТуреЗ;

Typel: real, complex, rvector, cvector, rmatrix, cmatrix.

Type2: real, complex, rvector, cvector, rmatrix, cmatrix c

той же структурой (скаляр, вектор, матрица), что и у Typel.

ТуреЗ: соответствующий интервальный тип (interval,

cinterval, ivector, civector, imatrix, cimatrix).

Назначение: композиция аргументов xl и x2 (нижней и верхней границы) в значение соответствующего интервального типа (для векторов и матриц операция выполняется поэлементно). Если xl > х2, фиксируется ошибка.

Определена/переопределена в I_ARI, CI_ARI, MVI_ARI, MVCI-ARI.

function intval (х: Typel) : Туре2;

Typel: real, complex, rvector, cvector, rmatrix, cmatrix.

Type2: соответствующий интервальный тип (interval,

cinterval, ivector, civector, imatrix, cimatrix).

Назначение: преобразование аргумента x в интервальное значение с нижней и верхней границами, равными х (для векторов и матриц операция выполняется поэлементно).

Определена/переопределена в I_ARI, CI_ARI, MVI_ARI, MVCI_ARI.

function re (c: Typel) : Type2;

Typel: complex, cinterval, cvector, civector, cmatrix, cimatrix.

Type2: соответствующий вещественный или интервальный

тип (real, interval, rvector, ivector, rmatrix, imatrix).

Назначение: возвращает вещественную часть аргумента (для векторов и матриц операция выполняется поэлементно).

Определена/переопределена в C_ARI, CI_ARI, MVC_ARI, MVCI-ARI.

function sup

Typel:

Туре2:

(i: Typel) : Type2;

interval, cinterval, ivector, civector, imatrix, cimatrix. соответствующий вещественный или комплексный тип (real, complex, rvector, cvector, rmatrix, cmatrix).

Назначение: возвращает верхнюю границу интервального аргумента (для векторов и матриц операция выполняется поэлементно).

Определена/переопределена в I_ARI, CI_ARI, MVI_ARI, MVCI_ARI.

7. Предопределенные процедуры

Этот раздел содержит отсортированный по алфавиту список предопределенных процедур (включая процедуры ввода-вывода) с их декларациями (интерфейсом) и кратким описанием назначения. Для функций, которые определяются или совмещаются в арифметических модулях, приводится имя соответствующего модуля.

dispose procedure dispose (var p: Typel);

Typel: произвольный тип указателя.

Назначение: освобождает участок памяти, занятый объектом по адресу р. Если р = nil, фиксируется ошибка. Процедуру dispose нельзя использовать вместе с процедурой release.

procedure dispose (var p: Typel; cl,c2,.. .,cn: Type2);

Typel: произвольный тип указателя.

Type2: integer, boolean, char, перечислимый тип.

Назначение: освобождает участок памяти, занятый объектом по адресу р. Константы cl,..., сп делают доступными специальные варианты (для записей с вариантами). Если р = nil, фиксируется ошибка. Процедуру dispose нельзя использовать в паре с процедурой release.

get )

procedure get (var f: Typel);

Typel: text, file of ...

Назначение: следующая после текущей компонента файловой переменной f становится текущей. Значение текущей компоненты присваивается буферной переменной ff. Если файл f не определен или находится не в режиме чтения, фиксируется ошибка.

mark

procedure mark (var р: Typel);

Typel: произвольный тип указателя.

Назначение: запоминает текущее состояние «кучи» для использования впоследствии процедурой release.

new procedure new (var p: Typel);

Typel: произвольный тип указателя.

Назначение: создает новый объект по адресу р.

procedure new (var p: Typel; cl,c2,.. .,cn: Type2);

Typel: произвольный тип указателя.

Type2: integer, boolean, char, перечислимый тип.

Назначение: создает новый объект по адресу р. Константы cl,..., сп делают доступными специальные варианты (для записей с вариантами).

page )

procedure page (var f: text);

Назначение: начинает новую страницу в выходном файле f. Если файл f не определен или находится не в режиме записи, фиксируется ошибка.

procedure page;

Назначение: соответствует page(output').

procedure put (var f: Typel);

Typel: text, file of ...

Назначение: значение буферной переменной присваивается

текущей компоненте файла f. Следующая после

текущей компонента становится новой текущей.

Если файл f не определен или находится не в режиме записи, фиксируется ошибка.

read 2)

procedure read (var f: Typel; var x: Type2);

Typel: text, file of ...

Type2: integer, char, string, real, complex, interval, cinterval,

rvector, cvector, ivector, civector, rmatrix, cmatrix, imatrix, cimatrix.

Назначение: ввод одной или нескольких переменных типа Туре2 из файла f (в зависимости от типа Туре2 допускаются спецификации формата, разделенные двоеточиями). Если файл f не определен или находится не в режиме чтения, фиксируется ошибка.

Определена/переопределена в C_ARI, I_ARI, CI_ARI, MV_ARI, MVC_ARI, MVI_ARI, MVCI_ARI.

procedure read (var x: Type2);

Type2: integer, char, string, real, complex, interval, cinterval,

rvector, cvector, ivector, civector, rmatrix, cmatrix, imatrix, cimatrix.

Назначение: соответствует read (input, x).

readin J)

procedure readin (var f: text);

Назначение: заканчивает ввод строки, вводя символ конца строки. Если файл f не определен или находится не в режиме чтения, фиксируется ошибка.

procedure readin;

Назначение: соответствует readln(input').

procedure readin (var f: text; var x: Type2);

Type2: integer, char, string, real, complex, interval, cinterval,

rvector, cvector, ivector, civector, rmatrix, cmatrix, imatrix, cimatrix.

Назначение: соответствует read(f, x), после чего следует readln(F). procedure readin (var x: Type2);

Type2: integer, char, string, real, complex, interval, cinterval,

rvector, cvector, ivector, civector, rmatrix, cmatrix, imatrix, cimatrix.

Назначение: соответствует read(x), после чего следует readin.

release J

procedure release (var p: Typel);

Typel: произвольный тип указателя.

Назначение: возобновляет старое состояние «кучи», запомненное процедурой mark. Все переменные, созданные с момента вызова mark, уничтожаются, освобождая память. Указатель р должен иметь то же значение, что и указатель, использованный при последнем вызове процедуры mark. Процедуру mark нельзя использовать в паре с dispose.

reset J

procedure reset (var f: Typel);

Typel: text, file of ...

Назначение: файл f инициализируется для чтения (ввода).

procedure reset (var f: Typel; s: string);

Typel: text, file of ...

Назначение: файл f инициализируется для чтения (ввода), при этом ему ставится в соответствие физический (внешний) файл с именем s.

rewrite )

procedure rewrite (var f: Typel);

Typel: text, file of ...

Назначение: файл f инициализируется для записи (вывода).

procedure rewrite (var f: Typel; s: string);

Typel: text, file of ...

Назначение: файл f инициализируется для записи (вывода), при этом файлу f ставится в соответствие физический (внешний) файл с именем s.

setlength J)

procedure setlength (var s: Typel; i: Type2);

Typel: string[m] или string.

Type2: O..m или 0..M.

Назначение: текущая длина строковой переменной s устанавливается равной i, причем 0 i т или 0 С i М соответственно, где М — зависящая от реализации максимальная длина строковой переменной. Если i превышает максимальную длину, фиксируется ошибка.

write у

procedure write (var f: Typel; x: Type2);

Typel: text, file of ...

Type2: integer, boolean, char, string, real, complex, interval,

cinterval, rvector, cvector, ivector, civector, rmatrix, cmatrix, imatrix, cimatrix.

Назначение: вывод значений одного или нескольких выражений типа Туре2 в файл f (в зависимости от типа Туре2 допускаются спецификации формата, разделенные двоеточиями). Если файл f не определен или находится не в режиме записи, фиксируется ошибка.

Определена/переопределена в C_ARI, I_ARI, CI_ARI, MV_ARI, MVC_ARI, MVI_ARI, MVCI_ARI.

procedure write (х: Туре2);

Туре2: integer, boolean, char, string, real, complex, interval,

cinterval, rvector, cvector, ivector, civector, rmatrix, cmatrix, imatrix, cimatrix.

Назначение: соответствует write(output, x).

writein J

procedure writein (var f: text);

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

procedure writein;

Назначение: соответствует writelnfputput).

procedure writein (var f: text; x: Type2);

Type2: integer, boolean, char, string, real, complex, interval,

cinterval, rvector, cvector, ivector, civector, rmatrix, cmatrix, imatrix, cimatrix.

Назначение: соответствует write(f, x), за которым следует writeln(T).

procedure writein (x: Type2);

Type2: integer, boolean, char, string, real, complex, interval,

cinterval, rvector, cvector, ivector, civector, rmatrix, cmatrix, imatrix, cimatrix.

Назначение: соответствует write(x), за которым следует writein.

  • 8. #-выражения
  • 8.1 Вещественные и комплексные #-выражения

Синтаксис: # -символ ( точное-выражение )

# -Символ

Тип результата

Слагаемые, допустимые в точном выражении

#

dotprecision

  • • переменные, константы и вызовы специальных функций типов integer, real или dotprecision
  • • произведения типов integer или real
  • • скалярные произведения тина real
  • * V Л
  • * * *

real

  • • переменные, константы и вызовы специальных функций типов integer, real или dotprecision
  • • произведения типов integer или real
  • • скалярные произведения типа real

complex

  • • переменные, константы и вызовы специальных функций типов integer, real, complex или dotprecision
  • • произведения типов integer, real или complex
  • • скалярные произведения типов real или complex

rvector

  • • переменные и вызовы специальных функций типа rvector
  • • произведения типа rvector (например, rmatrix * rvector, real * rvector и т. д.)

cvector

  • • переменные и вызовы специальных функций типов rvector или cvector
  • • произведения типов rvector или cvector (например, crnatrix * rvector, real * cvector и т. д.)

rmatrix

  • • переменные и вызовы специальных функций типа rmatrix
  • • произведения тина rmatrix

cmatrix

  • • переменные и вызовы специальных функций типов rmatrix или cmatrix
  • • произведения типов rmatrix или cmatrix

Под «вызовами специальных функций» подразумеваются вызовы функций compl, re, im, conj, intval, inf, sup, id, transp, herm, а также функций преобразования типа rvector, cvector, ivector и civector.

8.2 Вещественные и комплексные интервальные #-выражения

Синтаксис: # # ( точное-выражение )

#-Символ

Тип результата

Слагаемые, допустимые в точном выражении

# #

interval

  • • переменные, константы и вызовы специальных функций типов integer, real, interval или dotprecision
  • • произведения типов integer, real или interval
  • • скалярные произведения типов real или interval

cinterval

  • • переменные, константы и вызовы специальных функций типов integer, real, complex, interval, cinterval или dotprecision
  • • произведения типов integer, real, complex, interval или cinterval
  • • скалярные произведения типов real, complex, interval или cinterval

ivector

  • • переменные и вызовы специальных функций типов rvector или ivector
  • • произведения типов rvector или ivector

civector

  • • переменные и вызовы специальных функций типов rvector, cvector, ivector или civector
  • • произведения типов rvector, cvector, ivector или civector

imatrix

  • • переменные и вызовы специальных функций типов rmatrix или imatrix
  • • произведения типов rmatrix или imatrix

cimatrix

  • • переменные и вызовы специальных функций типов rmatrix, cmatrix, imatrix, или cimatrix
  • • произведения типов rmatrix, cmatrix, imatrix, или cimatrix

Под «вызовами специальных функций» подразумеваются вызовы функций compl, re, ini, conj, intval, inf, sup, id, transp, herm, а также функций преобразования rvector, cvector, ivector и civector.

Дополнение

Новые возможности для работы с динамическими массивами

Д. В. Ширяев

В последних реализациях PASCAL-XSC расширены синтаксис и семантика языковых конструкций, имеющих отношение к работе с динамическими массивами. В числе прочего

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

Несмотря на перечисленные нововведения, сохранена совместимость с прежним описанием языка.

Синтаксис объявления динамических массивов выглядит теперь следующим образом:

| dynamic array [СписокРазмерностей] of ТипЭлементов

СписокРазмерностей — это или список, состоящий, как и раньше, из знаков *, или список диапазонных типов, производных от типа integer. СписокРазмерностей всегда состоит хотя бы из одного элемента. Если должно быть специфицировано более одного элемента, то все они разделяются запятыми. Диапазонные типы в списке размерностей специфицируются либо своими идентификаторами, либо явными указаниями диапазонов:

I ЦелочисленноеВыражение .. ЦелочисленноеВыражение

Таким образом, теперь имеются две возможности для объявления динамических массивов. Первая — объявление согласно старому правилу: type vector = dynamic array [*] of real;

вторая — указание базового диапазона изменения индексов:

type vec = dynamic array [1 .. 10] of real;

{ or }

type vec = vector [1 .. 10] ;

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

1. Объявление переменных

Синтаксис объявления переменных расширяется следующим образом:

Ivar СписокИдентификаторов : ИдентификаторДинамического-Типа [СписокРазмерностей];

Как обычно, переменные могут быть объявлены с использованием предопределенного или определенного пользователем типа:

Ivar СписокИдентификаторов : ИдентификаторДинамического-

Типа

Эти правила предоставляют несколько вариантов объявления переменных:

• с явным указанием диапазонов изменения индексов: var v : vector [1 .. 10] ;

{ or }

var v : dynamic array [1 .. 10] of real;

  • — так объявленные динамические массивы автоматически размещаются при входе в подпрограмму, в которой они объявлены, и уничтожаются при выходе из нее, то есть ведут себя так же, как динамические массивы в предыдущих версиях языка. Кроме того, объявленные этим способом массивы могут быть переразмещены во время исполнения подпрограммы, в которой они были объявлены;
  • • без явного указания диапазона изменения индексов:

var v : vector;

{ or }

var v : dynamic array [*] of real;

— в этом случае переменная v должна быть явно размещена пользователем. Тем не менее, она будет автоматически уничтожена при выходе из подпрограммы, в которой была объявлена. Объявленные таким способом массивы также могут быть переразмещены пользова

телем;

• с использованием базовых диапазонов изменения индексов:

var v : vec;

{ or }

var v : vec [1 .. 20];

  • — в обоих случаях будет произведено автоматическое размещение и уничтожение массива. Однако размещение происходит по-разному. При неуказании границ изменения индекса будет использован его базовый диапазон, в противном случае базовый диапазон замещается специфицированным. Такой массив также может быть переразмещен пользователем.
  • 2. Управление памятью

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

Первая подпрограмма — это процедура allocate, явно размещающая динамический массив с указанными диапазонами изменения индексов:

? allocate (ДинамическаяПеременная, СписокРазмерностей... {не пустой} );

Длина списка размерностей должна быть равна длине, указанной при объявлении массива. Массив размещается с указанными границами; если он уже ранее был размещен, то выделенная ему память освобождается.

Следующая процедура предоставляет возможность явного освобождения отведенной под массив памяти:

| free (ДинамическаяПеременная);

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

Попытка доступа к неразмещенному массиву может иметь нежелательные последствия, поэтому для определения того, размещен массив или нет, введена функция

| allocated (ДинамическаяПеременная)

с результатом типа boolean. Функция allocated возвращает true, если аргумент был размещен, и false в противном случае.

3. Примеры

Пример 1. Размещение одномерного динамического массива, содержащего компоненты некоторого вектора, его обработка, удвоение длины и передача на последующую обработку.

type vector = dynamic array [*] of real;

procedure double_vector (n : integer);

var local : vector;

begin

allocate (local, 1 .. n);

{ обработка }

free (local); {можно опустить}

allocate (local, 1 .. 2 * n);

{ еще обработка }

end;

Первый вызов allocate размещает массив local с индексами в диапазоне от 1 до п. Выполнив несколько операторов, мы освобождаем память из-под массива local вызовом процедуры free. В данном случае освобождать память необязательно, поскольку последующий вызов allocate сделал бы это автоматически.

Пример 2. Ввод одномерного массива чисел типа real из текстового файла.

N чисел типа real должны быть прочитаны из текстового файла в одномерный массив. В начале файла находится количество чисел, а затем идут сами числа. Возможность переразмещать массивы сильно облегчает решение этой задачи:

procedure read (var f : text; var v : vector);

var i, n : integer;

begin

if allocated (v) then free(v);

read (f, n);

allocate (v, 1 .. n);

for i := lb(v) to ub(v) do read (f, v[i]) end;

Оператор if приведен для демонстрации использования процедуры allocated и не является здесь обязательным.

4. Присваивание динамических массивов

Семантика присваивания совместимых динамических массивов

А := В;

не меняется за следующими исключениями:

• если не размещен массив В, то на этапе выполнения программы фиксируется ошибка;

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

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

5. Динамические массивы как компоненты других типов

Динамические массивы теперь могут быть компонентами составных типов — статических массивов и записей. Достигнуто это не за счет изменения синтаксиса языка, а лишь за счет расширения семантики в описаниях типов. Объявление составного типа с динамической компонентой следует общим правилам объявления динамических массивов. В частности, могут быть указаны диапазоны изменения индексов.

Пример:

type rec = record

a, b : real;

v : dynamic array [*] of real

end;

{ or }

type rec = record

a, b : real;

v : dynamic array [1 .. 5] of real end;

Размещение и освобождение динамических компонент также следует общим правилам для динамических массивов.

Особого внимания требуют программы, использующие указатели на динамические массивы. Рассмотрим пример.

type dyn = dynamic array [*] of integer;

dyn2 = dynamic array [1 .. 10] of integer;

var pl = “dyn;

p2 = “dyn2;

begin

new (p2); {автоматическое размещение p2“}

new (pl); {размещение только дескриптора}

allocate (pl“, 1 .. 10); {явное размещение pl“} {последующие операторы}

end

Переменная р2 указывает на динамический массив с базовыми границами от 1 до 10. Следовательно, при вызове new происходит автоматическое размещение динамического массива, на который указывает р2. При вызове же new(pl) этого не происходит, поскольку pl указывает на динамический массив без базового диапазона границ. В этом случае выполнение new приводит к созданию лишь дескриптора массива. Размещение в памяти должно быть осуществлено явным образом — при помощи процедуры allocate.

Литература

[1] Adams, Е., Kulisch, U. (Eds) Scientific Computing with Automatic Result Verification. Academic Press, New York, 1993.

[2] Alefeld, G., Herzberger, J. Einfiihrung in die Intervallrechnung. Bibliographisches Institut, Mannheim, 1974.

[3] Alefeld, G., Herzberger, J. Introduction to Interval Computations. Academic Press, New York, 1983.

[4] American National Standards Institute / Institute of Electrical and Electronic Engineers: A Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std. 754-1985, New York, 1985.

[5] Bauch, H., Jahn, K.-U., Oelschlagel, D., Susse, H., Wiebigke, V. Intervall-mathematik. Teubner, Leipzig, 1987.

[6] Bleher, J. H., Rump, S. M., Kulisch, U., Metzger, M., Ullrich, Ch., Walter, W. FORTRAN-SC: A Study of a FORTRAN Extension for Engineering/Scientific Computation with Access to ACRITH. Computing 39, 1987, pp. 93-110.

[7] Bohlender, G., Rail, L„ Ullrich, Ch., Wolff von Gudenberg, J. PASCAL-SC: A Computer Language for Scientific Computation. Academic Press, New York, 1987.

[8] Bohlender, G„ Rail, L„ Ullrich, Ch., Wolff von Gudenberg, J. PASCAL-SC— Wirkungsvoll programmieren, kontrolliert rechnen. Bibliographisches Institut, Mannheim, 1986.

[9] Bohm, H. Auswertung arithmetischer Ausdriicke mit maximaler Genauigkeit. In: Kulisch, U., Ullrich, Ch. (Eds) Wissenschaftliches Rechnen und Programmiersprachen. Berichte des German Chapter of the ACM, Band 10, Teubner, Stuttgart, 1982, pp. 175-184.

[10] British Standards Institution. Specification for Computer Programming Language PASCAL. BS 6192:1982, UDC 681.3.06, PASCAL:519.682, London, 1982.

[11] Hammer, R., Hocks, M., Kulisch, U., Ratz, D. Numerical Toolbox for Verified Computing I—Basic Numerical Problems. Springer-Verlag, Heidelberg, 1993.

[12] Hammer, R., Hocks, M., Kulisch, U., Ratz, D. C++ Toolbox for Verified Computing I—Basic Numerical Problems. Springer-Verlag, Heidelberg, 1995.

[13] IBM High-Accuracy Arithmetic Subroutine Library (ACRITH). General Information Manual, GC 33-6163-02, 3rd Edition, 1986.

[14] IBM High-Accuracy Arithmetic Subroutine Library (ACRITH). Program Description and User's Guide, SC 33-6164-02, 3rd Edition, 1986.

[15] IBM High Accuracy Arithmetic—Extended Scientific Computation (ACRITH-XSC), Reference. SC 33-6462-00, IBM Corp., 1990.

[16] Jensen, K., Wirth, N. PASCAL User Manual and Report. ISO PASCAL Standard, 3rd ed., Springer, Berlin, 1985.

[17] Kaucher, E., Klatte, R., Ullrich, Ch. Programmiersprachen im Griff—Band 2: PASCAL. Bibliographisches Institut, Mannheim, 1981.

[18] Kaucher, Е., Klatte, R., Ullrich, Ch., Wolff von Gudenberg, J. Programmiersprachen im Griff—Band 4: ADA. Bibliographisches Institut, Mannheim, 1983.

[19] Kaucher, E., Kulisch, U., Ullrich, Ch. (Eds) Computer Arithmetic—Scientific Computation and Programming Languages. Teubner, Stuttgart, 1987.

[20] Kaucher, E., Miranker, W. L. Self-Validating Numerics for Function Space Problems. Academic Press, New York, 1984.

[21] Kaucher, E., Rump, S. M. E-Methods for Fixed Point Equation f(x) = x. Computing 28, 1982, pp. 31-42.

[22] Kieling, I., Lowes, M., Paulik, A. Genaue Rechnerarithmetik—Intervallrechnung und Programmieren mit PASCAL-SC. Teubner, Stuttgart, 1988.

[23] Kirchner, R., Kulisch, U. Accurate Arithmetic for Vector Processors. Journal of Parallel and Distributed Computing 5, 1988, pp. 250-270.

[24] Klatte, R„ Kulisch, U., Neaga, M„ Ratz, D„ Ullrich, Ch. PASCAL-XSC— Sprachbeschreibung mit Beispielen. Springer-Verlag, Heidelberg, 1991.

[25] Klatte, R„ Kulisch, U„ Neaga, M„ Ratz, D., Ullrich, Ch. PASCAL-XSC—Language Reference with Examples., Springer-Verlag, New York, 1992.

[26] Klatte, R., Ullrich, Ch. Programmiersprachen im Griff—Band 9: MODULA-2. Biblio-graphisches Institut, Mannheim, 1988.

[27] Knuth, D. E. The Art of Computer Programming. Vol. 2: Seminumerical Algorithms. Addison Wesley, Reading, Massachusetts., 1981.

[28] Kramer, W., Kulisch, U., Lohner, R. Numerical Toolbox for Verified Computing II— Advanced Numerical Problems. Springer-Verlag, Heidelberg, 1995.

[29] Kulisch, U. Grundlagen des Numerischen Rechnens—Mathematische Begriindung der Rechnerarithmetik. Reihe Informatik, Band 19, Bibliographisches Institut, Mannheim, 1976.

[30] Kulisch, U. (Ed.) PASCAL-SC: A PASCAL Extension for Scientific Computation, Information Manual and Floppy Disks, Version ATARI ST. Teubner, Stuttgart, 1987.

[31] Kulisch, U. (Ed.) PASCAL-SC: A PASCAL Extension for Scientific Computation, Information Manual and Floppy Disks, Version IBM PC/AT (DOS). Teubner, Stuttgart, 1987.

[32] Kulisch, U. (Ed.) Wissenschaftliches Rechnen mit Ergebnisverifikation—Eine Ein-fiihrung. Akademie Verlag, Ost-Berlin, Vieweg, Wiesbaden, 1989.

[33] Kulisch, U., Miranker, W. L. Computer Arithmetic in Theory and Practice. Academic Press, New York, 1981.

[34] Kulisch, U., Miranker, W. L. The Arithmetic of the Digital Computer: A New Approach. SIAM Review 28 (1), 1986, pp. 1-140.

[35] Kulisch, U., Miranker, W. L. (Eds) A New Approach to Scientific Computation. Academic Press, New York, 1983.

[36] Kulisch, U., Stetter, H. J. (Eds) Scientific Computation with Automatic Result Verification. Computing Suppl. 6, Springer-Verlag, Vienna, 1988.

[37] Kulisch, U., Ullrich, Ch. (Eds) Wissenschaftliches Rechnen und Programmiersprachen. Berichte des German Chapter of the ACM, Band 10, Teubner, Stuttgart, 1982.

[38] Mayer, G. Grundbegriffe der Intervallrechnung. In: Kulisch, U. (Ed.) Wissenschaftliches Rechnen mit Ergebnisverifikation—Eine Einfiihrung, Akademie Verlag, Ost-Berlin, Vieweg, Wiesbaden, 1989, pp. 101-118.

[39] Moore, R. E. Interval Analysis. Prentice Hall, Engelwood Cliffs, New Jersey, 1966.

[40] Moore, R. E. Methods and Applications of Interval Analysis. SIAM, Philadelphia, Pensylvania, 1979.

[41] Moore, R. E. (Ed.) Reliability in Computing: The Role of Interval Methods in Scientific Computations. Academic Press, New York, 1988.

[42] Neaga, M. PASCAL-SC—Eine PASCAL-Erweiterung fur wissenschaftliches Rechnen. In: Kulisch, U. (Ed.) Wissenschaftliches Rechnen mit Ergebnisverifikation—Eine Einfiihrung, Akademie Verlag, Ost-Berlin, Vieweg, Wiesbaden, 1989, pp. 69-84.

[43] Neumaier, A. Interval Methods for Systems of Equations. Cambridge University Press, Cambridge, 1990.

[44] Nickel, K. (Ed.) Interval Mathematics. Proceedings of the International Symposium, Karlsruhe 1975, Springer-Verlag, Vienna, 1975.

[45] Nickel, K. (Ed.) Interval Mathematics 1980. Proceedings of the International

Symposium, Freiburg 1980, Academic Press, New York, 1980.

[46] Nickel, K. (Ed.) Interval Mathematics 1985. Proceedings of the International

Symposium, Freiburg 1985, Springer-Verlag, Vienna, 1986.

[47] Numerik Software GmbH. PASCAL-XSC: A PASCAL Extension for Scientific Computation. User's Guide., Numerik Software GmbH, P.O.Box 2232, D-76492 Baden-Baden, 1991.

[48] Rail, L. B. Automatic Differentiation, Techniques and Applications. Lecture Notes in Computer Science 120, Springer, Berlin, 1981.

[49] Ratschek, H., Rokne, J. Computer Methods for the Range of Functions. Ellis Horwood Limited, Chichester, 1984.

[50] Rump, S. M. Lbsung linearer und nichtlinearer Gleichungssysteme mit maximaler Genauigkeit. In: Kulisch, U., Ullrich, Ch. (Eds) Wissenschaftliches Rechnen und Programmiersprachen. Berichte des German Chapter of the ACM, Band 10, Teubner, Stuttgart, 1982, pp. 147-174.

[51] Rump, S. M. Wie zuverldssig sind die Ergebnisse unserer Rechenanlagen. In: Jahrbuch Uberblicke Mathematik, Bibliographisches Institut, Mannheim, 1983.

[52] Rump, S. M. Solving Algebraic Problems with High Accuracy. In: Kulisch, U., Miranker, W. L. (Eds) A New Approach to Scientific Computation, Academic Press, New York, 1983, pp. 51-120.

[53] Stoer, J., Bulirsch, R. Introduction to Numerical Analysis. Springer-Verlag, New York, 1980.

[54] Thieler, P. Technical Calculations by Means of Interval Mathematics. In: Nickel, K. (Ed.) Interval Mathematics 1985, Lecture Notes in Computer Science, Springer Verlag, Berlin, 1986, pp. 197-208.

[55] Ullrich, Ch. (Ed.) Computer Arithmetic and Self-Validating Numerical Methods. Academic Press, San Diego, 1990.

[56] Ullrich, Ch. (Ed.) Contributions to Computer Arithmetic and Self-Validating Numerical Methods. J. C. Baltzer AG, Scientific Publishing Co., IMACS, Basel, 1990.

[57] van Wijngaarden, A., Mailloux, B. J., Peck, J. E. L., Kester, С. H. A. Report on the Algorithmic Language ALGOL-68. Numerische Mathematik 14, 1969, pp. 79-218.

[58] Wilkinson, J. H. Rounding Errors in Algebraic Processes. Prentice Hall, Englewood Cliffs, New Jersey, 1963.

[59] Zurmuhl, R., Falk, S. Matrizen und ihre Anwendungen. Teil 2: Numerische Methoden. Springer-Verlag, Heidelberg, 1984.

Алфавитный указатель

abs (функция), 90, 91, 173, 177, 183, 314

and (операция), 74

arccos (функция), 80, 159, 163, 169, 314

arccot (функция), 80, 159, 163, 169, 314

arcosh (функция), 80, 159, 163, 169, 314

arcoth (функция), 80, 159, 163, 169, 314

arcsin (функция), 80, 159, 163, 169, 314

arctan2 (функция), 80, 159, 163, 169, 315

arctan (функция), 77, 159, 163, 169, 314

arg (функция), 159, 169, 302

array (зарезервированное слово), 53

arsinh (функция), 80, 159, 163, 169, 314

artanh (функция), 80, 159, 163, 169, 314

begin (зарезервированное слово), 108

blow (функция), 164, 169, 184, 191, 302

boolean (тип), 50

char (тип), 50

chr (функция), 82, 302

cimatrix (тип), 66, 185

cintcrval (тип), 66, 165

ci vector (тип), 66, 185

crnatrix (тип), 66, 175

complex (тип), 65, 157

compl (функция), 158, 168, 177, 178, 189, 315

comp (функция), 80, 303

conj (функция), 159, 169, 179, 191, 303

const (зарезервированное слово), 48 cosh (функция), 80, 159, 163, 169, 314 cos (функция), 77, 159, 163, 169, 314 coth (функция), 80, 159, 163, 169, 314 cot (функция), 80, 159, 163, 169, 314 cvector (тип), 66, 175

diam (функция), 164, 169, 184, 191, 303

dispose (процедура), 68, 318

div (операция), 75

dotprecision (тип), 43, 52, 90

downto (зарезервированное слово), 85, 111

do (зарезервированное слово), 109, 111 dynamic (зарезервированное слово), 57

else (зарезервированное слово), 108 end (зарезервированное слово), 59, 108

eof (функция), 63, 81, 304

eoln (функция), 64, 81, 304

ехрЮ (функция), 80, 158, 163, 169, 314

ехр2 (функция), 80, 158, 163, 169, 314

expo (функция), 76, 80, 304

ехр (функция), 77, 159, 163, 169, 314 external-декларация, 127

false (логическая константа), 50

file (зарезервированное слово), 62 forward-декларация, 127

function (зарезервированное слово), 119

get (процедура), 63, 318

global-декларация, 136

herm (функция), 179, 191, 305

id (функция), 174, 179, 184, 191, 305

if-statement, 108

image (функция), 140, 305

imatrix (тип), 66, 180

im (функция), 158, 168, 177, 178, 189, 316

inf (функция), 162, 168, 182, 183, 189, 316

input (файловая переменная), 101

integer (тип), 49

interval (тип), 65, 160

intval (функция), 162, 168, 182, 183, 189, 316

in (операция), 61, 74, 75, 161, 166

ival (функция), 76, 141, 306

ivector (тип), 66, 180

label (зарезервированное слово), 107

Ibound (функция), 56, 76, 81 — 83, 307

lb (функция), 76, 81—83, 307

length (функция), 140, 307

In (функция), 77, 159, 163, 169, 314

loc (функция), 76, 308

loglO (функция), 80, 158, 163, 169,

314

log2 (функция), 80, 158, 163, 169, 314

mant (функция), 80, 308

mark (процедура), 69, 318

maxint (константа), 49

maxlength (функция), 141, 308

mid (функция), 163, 169, 184, 191, 308

module (зарезервированное слово),

136

mod (операция), 75

new (процедура), 67, 318

nil (зарезервированное слово), 67

not (операция), 74

null (функция), 174, 179, 184, 191,

309

odd (функция), 81, 309

of (зарезервированное слово), 53

operator (зарезервированное слово), 123, 134

ord (функция), 76, 310

or (операция), 74

output (файловая переменная), 101

packed (зарезервированное слово), 58 page (процедура), 319

pos (функция), 141, 310

pred (функция), 76, 79, 81—83, 310 priority (зарезервированное слово),

124

procedure (зарезервированное слово), 114

program (зарезервированное слово), 112

put (процедура), 63, 319

readin (процедура), 103, 320

read (процедура), 102, 131, 159, 164, 170, 175, 179, 185, 192, 319

real (тип), 49, 51

real выражения, 77

record (зарезервированное слово), 59 release (процедура), 69, 320 reset (процедура), 63, 102, 320 rewrite (процедура), 102, 321

ге (функция), 158, 168, 177, 178, 189, 317

rmatrix (тип), 66, 171

round (функция), 76, 310

rval (функция), 80, 141, 310

rvector (тип), 66, 171

setlength (процедура), 142, 321

sign (функция), 76, 82, 311

sinh (функция), 80, 159, 163, 169, 314 sin (функция), 77, 159, 163, 169, 314 sqrt (функция), 77, 159, 163, 169, 314 sqr (функция), 76, 77, 159, 163, 169,

314

string (тип), 58, 139

substring (функция), 140, 312

succ (функция), 76, 79, 81 -83, 312 sum-запись, 85

sup (функция), 162, 168, 182, 183, 189, 317

tanh (функция), 66, 145, 149, 155, 314

tan (функция), 80, 159, 163, 169, 314 text (тип), 64

then (зарезервированное слово), 108 to (зарезервированное слово), 85, 111 transp (функция), 174, 179, 184, 191, 312

true (логическая константа), 50 trunc (функция), 76, 313

type (зарезервированное слово), 48

ubound (функция), 56, 76, 81—83, 313

ub (функция), 76, 81—83, 313

Ulp, 78

until (зарезервированное слово), ПО

var (зарезервированное слово), 48,

115

vnull (функция), 174, 313

writein (процедура), 104, 322 write (процедура), 103, 131, 159, 164, 170, 175, 179, 185, 192, 321

Антисимметричность, 32, 34 Аргумент тригонометрического представления комплексного числа, 158

Арифметика, 42 вещественная векторно-матричная, 171 дифференциальная (упражнение), 240 интервальная, 160 интервальная

векторно-матричная, 180 комплексная, 156 комплексная

векторно-матричная, 175 комплексная интервальная, 165 комплексная интервальная

векторно-матричная, 185 рациональная (упражнение), 261 стандартные типы, 64 Арифметические модули, 151 Арифметические операции, 153, 298

Базовый тип, 61 Безымянный тип, 49, 55, 70

Библиотека численных методов, 199 Бинарные операции, 74, 123 Биномиальный коэффициент, 207 Буферные переменные, 62

Варианты записи, 60

Ввод

вещественных векторов, 175

вещественных матриц, 175 интервалов, 164

интервальных векторов, 185

интервальных матриц, 185 комплексных векторов, 179 комплексных интервалов, 170

комплексных интервальных векторов, 192

комплексных интервальных матриц, 192

комплексных матриц, 179 комплексных чисел, 159 символов, 143 строк, 145

Ввода-вывода операторы, 117

Векторно-матричное произведение, точное, 93

Векторное произведение, 212

Верификация, 193

Вещественная часть комплексного числа, 65

Включающие алгоритмы, 43 Включение, 198

Влияние погрешностей округления (упражнение), 204

Вывод

вещественных векторов, 175

вещественных матриц, 175 интервалов, 164

интервальных векторов, 185

интервальных матриц, 185 комплексных векторов, 179 комплексных интервалов, 170

комплексных интервальных векторов, 192

комплексных интервальных матриц, 192

комплексных матриц, 179 комплексных чисел, 159

Вызов по значению, 70, 107, 115, 116, 130, 135

Вызов по ссылке, 70, 107, 115, 116, 130 модифицированный, 107, 116, 119, 125, 127 Вызов функции, 119 Выполнение программы, ИЗ Выражения, 72 высокоточные, 43, 84, 90, 323 вычисление, 73 динамические массивы, 88 для арифметических типов, 87 для структурированных типов, 87 записи, 89 логические, 81 массивы, 88 множества, 89 перечислимого типа, 83 понятие, 72 построение, 152 символьные, 82 стандартные, 73 строки, 89 строкового типа, 139 типа integer, 75 типа real, 77 точные, 84, 92 указатели, 87, 90

Высокоточные выражения, 43, 84 вещественные, 99 для арифметических типов, 91 для векторов, 93 для матриц, 94 интервальные, 100, 101 комплексные, 92, 99 комплексные интервальные, 92, 100, 101 обобщенные, 90 общий обзор, 99 операнды, 96 типа complex, 323 типа interval, 91, 324 типа real, 84, 91, 323 Вычисление выражений, 73 Вычисление полиномов (упражнение), 265

Вычисления с интервальными матрицами (упражнение), 238

Вычитание без ошибок округления, 85

Главная программа, ИЗ Глобальные объекты, 136 Границы индексов, 56 доступ, 56

Декларация external-, 127 forward-, 127 global-, 136

Деление комплексных чисел (упражнение), 226

Диаметр интервала, 163 Диапазонный тип, 51 Динамические массивы, 41, 56, 117 148 выражения, 88 декларация, 57 использование, 148 определение типа, 57

Динамические строки символов, 58 Длина строки, 143

Единичная матрица, 174, 179, 184, 191

Записи выражения, 89 компоненты, 59 с вариантами, 60 тип, 59

Запись в файл, 63 Зарезервированные слова, 45, 295 and, 74 array, 53 begin, 108 case, 60, 108 const, 48 div, 75 downto, 85, 111 do, 109, 111 dynamic, 57 else, 108 end, 59, 108

external, 127

Импликация логическая, 81

file, 62

Импорт объектов, 137

forward, 127

Индекса тип, 53

for, 85, 110

Интервалы, 65

function, 119

диаметр, 163

global, 136

комплексные, 66

goto, 107

оболочка, 161

if, 108

средняя точка, 163, 236

in, 61, 74, 75, 161, 166

Интервальное вычисление полинома

label, 107

(упражнение), 235

module, 136

Интервальный метод Ньютона

mod, 75

(упражнение), 257

nil, 67

Исторические сведения, 29

not, 74

Итерационные методы с

of, 53

автоматической

operator, 123, 134

верификацией результатов,

or, 74

packed, 58

193

priority, 124

Калькулятор для полиномов

procedure, 114

(упражнение), 252

program, 112

Квалификация, 88

record, 59

Комплексные интервалы, 66

repeat, 110

Комплексные функции (упражнение)

set, 61

208

sum, 85

Комплексные числа, 51

then, 108

вещественная часть, 51

to, 85, 111

мнимая часть, 51

type, 48

представление в полярной

until, 110

системе координат, 209

use, 136

сопряженные, 144

var, 48, 115

Компонентные переменные, 40

while, 109

Компоненты тип, 39

with, 111

Компьютерная арифметика, 17

Затенение

Конечное значение, 111

идентификаторов, 129

Конечное условие, 110

операций, 124

Константы

false, 50

Идентификаторы, 46

maxint, 49

затенение, 129

nil, 67, 90

как операции, 124

true, 50

предопределенные, 46, 47, 296

именованные, 47

результата, 123, 134

литеральные, 47

Иерархия

логические, 50

арифметических модулей, 192

округление, 78

модулей, 138

округляемые, 51

типов, 153

определение, 47

Измерение времени (упражнение),

преобразование, 50, 51

245

Именованные константы, 47

шестнадцатеричные, 51

Литеральные константы, 47

Литература, 331

Логическая импликация, 81

Логическая эквивалентность, 81

Логические выражения, 81

Локальные объекты, 115

Максимальная точность, 32, 34, 80, 151

Мантисса, 78

Массивы, 53

выражения, 88

выражения, динамические, 88 динамические, 41, 56, 117, 148 тип, 53

Математически точные операции, 85, 91

Матрицы Бутройда-Деккера (упражнение), 207

Метки, 107

Метод Ньютона, 243

Метод Ньютона с автоматическим дифференцированием (упражнение), 243

Метод Рунге-Кутты, 172, 182

Метод Рунге-Кутты (упражнение), 258

Метод итераций (упражнение), 258

Мнимая часть комплексного числа, 65

Множества

выражения, 89

конструкторы, 89

объединение, 74, 90

пересечение, 74, 90

разность, 74, 90 тип, 61

Модифицированный вызов по ссылке, 107, 116, 119, 125, 127

Модули, ИЗ, 136

арифметические, 151 библиотека для решения

численных задач, 198

декларация, 136

иерархия, 138

область деклараций, 139

область определений, 139 обработка, 114 операторная часть, 139 реализация, 139 C_ARI, 156 C1_ARI, 165 I_ARI, 160 MV_ARI, 171 MVC_ARI, 175 MVCI_ARI, 185 MVI_ARI, 180

Модульность, 40

Монотонность, 32, 34

Мост для измерения переменного тока (упражнение), 231

Начальные значения, 111 Начальные условия, 109 Невязка, 174, 184

Нелокальные объекты, 115 Нормализованные числа с плавающей точкой, 78

Нулевая матрица, 174, 179, 184, 191 Нулевой вектор, 174, 179, 184, 191

Область деклараций

в стандартном Паскале, 113 в PASCAL-XSC, 114 Обобщенные высокоточные выражения, 90 Оболочка, 198

интервальная, 161 Обработка текстов, 139 Объекты

глобальные, 136 импорт, 137 локальные, 115 нелокальные, 115 экспорт, 136, 137

Округление, 42 вверх, 78 вниз, 78 до интервала, 91, 92 направленное, 92 режим, 105

Округляемые константы, 51 Операнды

в высокоточных выражениях, 96 Оператор выбора, 108

с альтернативой else, 109 для строк, 142

Операторная часть

модуля, 139

программы, 113 Операторы, 101 case, 108 goto, 107 if, 108 with, 111 безусловного перехода, 107 помеченные, 107 присваивания, 101, 134 простые, 101 процедуры, 106, 116 пустой, 106 составные, 107 структурированные, 101 условные, 108 цикла, 109

Операторы ввода, 101, 102, 117 read, 102, 159, 164, 170, 175, 179, 185, 192 readln, 103 reset, 102

Операторы вывода, 101, 103, 117 page, 104 rewrite, 102 writein, 104 write, 103, 159, 164, 170, 175, 179, 185, 192

Операторы цикла, 109

for, ПО

repeat, ПО while, 109

Операции, 123, 297

and, 74

div, 75

in, 61, 161, 166

mod, 75

not, 74

or, 74

арифметические, 74, 75, 153, 157, 166, 171, 176, 180, 185, 298

бинарные, 74, 123 вызов, 125 декларация, 123 затенение, 124 логические, 74 математически точные, 85, 91 модуля C1_ARI, 166 модуля C_ARI, 157 м о дуля I _AR 1, 161

модуля MVCI_ARI, 185

модуля MVC_ARI, 176

модуля MVI_ARI, 180

модуля MV_ARI, 171

не имеющие результата, 134 основные, 297

отношения, 74, 75, 154, 155, 157, 161, 166, 172, 177, 181, 188, 299

предопределенные, 126 присваивания, 134, 156, 158, 162,

168, 173, 178, 183, 190, 300 рекурсивные, 126

совмещение, 124, 128, 134 тело, 123

указатель, 297

универсализация описания, 38 унарные, 60, 61, 109 над множествами, 74

Операции с файлом, 62

reset, 62

Определение типа, 48

Оптическая линза (упражнение), 233

Отношение принадлежит, 161

Отношение содержится внутри, 166, 181, 188

Отношение содержится в, 161, 166, 181, 188

Основание степени, 78

Основные символы, 45

Открытие файлов, 102

Параллелепипед, площадь поверхности, 211

Параллельность и пересечение прямых (упражнение), 214

Параметры

список, 115

фактические, 106, 116 формальные, 106, 115, 116

Переменные, 48

input, 101

output, 101

декларация, 48, 49 компонентные, 54

Пересечение интервалов, 161

указатель, 301

Перечислимый тип, 50

Представление комплексных чисел в

Площадь поверхности

полярной системе

параллелепипеда

координат (упражнение),

(упражнение), 211

223

Подмассивы, 55

Преобразование констант, 50

Подмножество слева, 161

Приоритет

Подмножество справа, 161

декларация, 124

Подпрограммы, 114

символ, 124

Поле, ширина, 104

уровни, 74, 75

Поле селектора, 60

Присваивание значения результату

Полиномы

функции, 120

вычисление с максимальной

Проверка пустоты пересечения, 161

точностью (упражнение),

Программы

265

выполнение, 113, 114

интервальное вычисление

главная, ИЗ

(упражнение), 235

заголовок, 112

произведение, 253

область деклараций, 114

сумма, 253

операторная часть, 113

Полуморфизм, 32, 33

параметры, 112

Порядок, 78

структура, 112

Предложение use, 47, 137

Проекция, 32, 34

Предопределенные идентификаторы,

Произведение

46, 47, 296

двойной длины, 85

Предопределенные операции, 126,

точное, 85

297

матриц, точное, 95

Предопределенные процедуры, 117,

Произвольный тип результата, 38,

317

119

Предопределенные функции,

Простые операторы, 101

130-132, 301

Простые типы, 49

boolean, 81

Процедуры, 114, 317

char, 82

dispose, 68, 318

cimatrix, 190

get, 63, 318

cinterval, 168

mark, 69, 318

civector, 190

new, 67, 318

cmatrix, 178

page, 104, 319

complex, 158

put, 63, 319

cvector, 178

readln, 103, 320

imatrix, 183

read, 102, 131, 159, 164, 170, 175,

integer, 75, 76

179, 185, 192, 319

interval, 162

release, 69, 320

i vector, 183

reset, 63, 102, 104, 320

real, 77, 79

rewrite, 102, 104, 321

rmatrix, 174

setlength, 142, 321

r vector, 174

writein, 104, 322

string, 139

write, 103, 131, 159, 164, 170,

перечислимого типа, 83

175, 179, 185, 192, 321

точность, 156

вызов, 116

декларация, 114

для решения типичных задач, 198

предопределенные, 118 рекурсивные, 116 совмещение, 128 указатель, 317

Прямоугольное представление комплексного интервала, 165

Пустой оператор, 106

Пустой цикл, 111

Разделительный символ, 113 Расписание движения поезда (упражнение), 218

Расчет электрической цепи (упражнение), 227

Рациональная арифметика (упражнение), 261

Результат функции, 120 принадлежащий к динамическому типу, 120

Рекурсивные операции, 126 Рекурсивные процедуры, 116 Рекурсивные функции, 119 Решение системы линейных уравнений, 193

Ряд Тейлора, 202

Семантические атрибуты в синтаксических диаграммах, 270

Символы, высокоточных выражений, 84 конца строки, 64, 102, 143, 145 основные, 45 подчеркивания (_), 46 специальные, 45

Символьные выражения, 82 Симметрия, 216

Симметрия матриц (упражнение), 216 Синтаксис, 43

полное описание, 269

представление в руководстве по языку, 43

Синтаксические диаграммы, 269 использование, 271 указатель, 294

Синтаксические переменные, 44, 269 Система линейных уравнений, 193 Скалярное произведение, оптимальное, 35 точное, 91

Скалярное произведение (упражнение), 205

Скобки, 73

След произведения матриц (упражнение), 250

Сложение без ошибок округления, 85

Совместимость, 69

по присваиванию, 69, 70, 116, 130, 134, 135

расширение, 70 строк, 72 типов, 69, 116 типов массивов, 70

Совмещение, 39, 128 вызов, 130 нескольких подпрограмм, 130 операции присваивания, 134, 300 операций, 124, 128, 134 правила, 129 процедур, 128

процедур read, write, 104, 131 функций, 128

Сокращения семантических атрибутов, 270

Сопряженное число, 158

Составные операторы, 107

Специальные символы, 45

Списки, 44

Списки товаров (упражнение), 220

Список полей, 59

Сравнение величин типа dotprecision, 82

Средняя точка интервала, 163, 236 Ссылки, 67

Стандартные выражения, 73

Стандартные типы, 47, 49

Стандартные файлы input, 101 output, 101

Строки

выражения, 89 использование, 42

Строки символов, 58 динамические, 58 Структурированные операторы, 101 Структурированные типы, 53 Структурная эквивалентность, 71 Суммирование степенного ряда (упражнение), 202

Схема работы с динамическими массивами, 148

Схема совместимости массивов, 115

Текстовые файлы, 64 Терминальные символы, 269 Тест на представимость (упражнение), 201 Типы boolean, 50 char, 50 cimatrix, 66, 185 cinterval, 66, 185 civector, 66, 185 cmatrix, 66, 175 complex, 65, 157 cvector, 66, 175 dotprecision, 43, 52, 90 imatrix, 66, 180 integer, 49 interval, 65, 160 ivector, 66, 180 real, 49, 51 rmatrix, 66, 171 rvector, 66, 171 string, 139 string (динамический), 58 string (статический), 58 text, 64 арифметические, 64 безымянный, 49, 55, 70 диапазонные, 51 записи, 59 иерархия, 153 индексов, 53 компонент, 53, 62 множества, 61 перечислимые, 50 простые, 49 результата, произвольные, 38, 119

стандартные, 47, 49

структурированные, 53 указателя, 67 файла, 62 Точное

векторно-матричное произведение, 93 представление, 201 произведение матриц, 95 скалярное произведение, 91 Точность

максимальная, 32, 34, 80, 151

предопределенных функций, 156 Точные выражения, 84, 92 Транспонирование матриц, симметричные матрицы (упражнение), 216 Транспонированные матрицы, 174, 179, 184, 191

Тригонометрическое представление комплексного числа, 158

Указатели

выражений, 87, 90

высокоточных выражений, 323 зарезервированных слов, 295 операций, 297 предопределенных идентификаторов, 296

предопределенных процедур, 317 предопределенных функций, 301 синтаксических диаграмм, 294 тип, 67

функций преобразования, 315 Указуемые переменные, 67 Указуемый тип, 67 Улучшенная компьютерная арифметика, 31

Унарные операции, 74, 75 Управляющее выражение, 104, 105 Упражнения и решения, 200

Влияние погрешностей округления, 204

Вычисление полиномов, 265

Вычисления с интервальными матрицами, 238

Деление комплексных чисел, 226

Дифференциальная арифметика, 240

Измерение времени, 245

Интервальное вычисление полинома, 235

Интервальный метод Ньютона, 257

Калькулятор для полиномов, 252 Комплексные функции, 208 Матрицы Бутройда-Деккера, 207 Метод Ньютона с автоматическим дифференцированием, 243 Метод Рунге-Кутты, 258 Метод итераций, 246 Мост для измерения переменного тока, 231 Оптическая линза, 233 Параллельность и пересечение прямых, 214

Площадь поверхности параллелепипеда, 211 Представление комплексных чисел в полярной системе координат, 223

Расписание движения поезда, 218

Расчет электрической цепи, 227 Рациональная арифметика, 261 Скалярное произведение, 205 След произведения матриц, 250 Списки товаров, 220 Суммирование степенного ряда, 202

Тест на представимость, 201 Транспонирование матриц, симметричные матрицы, 216

Условные операторы, 108

Файлы, 62, 101 открытие, 102 Фактические параметры, 106, 116 Формальные параметры, 106, 115 Формат параметр, 105, 132 спецификации, 104, 131 Функции, 114, 118, 301 abs, 76, 77, 159, 163, 169, 314 arccos, 80, 159, 163, 169, 314 arccot, 80, 159, 163, 169, 314 arcosh, 80, 159, 163, 169, 314 arcoth, 80, 159, 163, 169, 314 arcsin, 80, 159, 163, 169, 314 arctan2, 80, 159, 163, 169, 315 arctan, 77, 159, 163, 169, 314 arg, 159, 169, 302 arsinh, 80, 159, 163, 169, 314 artanli, 80, 159, 163, 169, 314 blow, 164, 169, 184, 191, 302 cat, 159 chr, 82, 302 compl, 158, 168, 177, 178, 189, 315

comp, 80, 303

conj, 159, 169, 179, 191, 303 cosh, 80, 159, 163, 169, 314

cos, 77, 159, 163, 169, 314 coth, 80, 159, 163, 169, 314

cot, 80, 163, 169, 314 diam, 164, 169, 184, 191, 303 eof, 63, 81, 304

eoln, 64, 81, 304 explO, 80, 158, 163, 169, 314 exp2, 80, 158, 163, 169, 314 expo, 76, 80, 304 exp, 77, 159, 163, 169, 314 herm, 179, 191, 305 id, 174, 179, 184, 191, 305 image, 140, 305 im, 158, 168, 177, 178, 189, 316 inf, 162, 168, 182, 183, 189, 316 intval, 162, 168, 182, 183, 189, 316

ival, 76, 141, 306 Ibound, 56, 76, 81-83, 307 lb, 76, 81-83, 307 length, 140, 307

In, 77, 159, 163, 169, 314 loc, 76, 308 loglO, 80, 158, 163, 169, 314 log2, 80, 158, 163, 169, 314 mant, 80, 308 maxlength, 141, 308 mid, 163, 169, 184, 191, 308 null, 174, 179, 184, 191, 309 odd, 81, 309 ord, 76, 310 pos, 141, 310 pred, 76, 79, 81-83, 310

re, 158, 168, 177, 178, 189, 317 round, 76, 310 rval, 80, 141, 310 sign, 76, 82, 311 sinh, 80, 159, 163, 169, 314 sin, 77, 159, 163, 169, 314 sqrt, 77, 159, 163, 169, 314 sqr, 76, 77, 159, 163, 169, 314 substring, 140, 312 succ, 76, 79, 81-83, 312 sup, 162, 168, 182, 183, 189, 317 tanh, 80, 159, 163, 169, 314 tan, 80, 159, 163, 169, 314 transp, 174, 179, 184, 191, 312 trunc, 76, 313 ubound, 56, 76, 81—83, 313 ub, 76, 81-83, 313 vnull, 174, 313 вызов, 119

как формальные параметры, 120 предопределенные, 120—122 преобразования, 157, 162, 167, 177, 178, 182, 183, 188, 189, 315

преобразования типа, 88 рекурсивные, 119 с произвольным типом результата, 119 совмещение, 128 тип, 119 указатель, 301

Функции преобразования, 315 cimatrix, 189 cinterval, 167 civector, 188 cmatrix, 178 complex, 157 c vector, 177 imatrix, 183 interval, 162 i vector, 182 указатель, 315

Целочисленные выражения, 75 Цикл, пустой, 111

система, 78

Числа комплексные, 65

Чтение из файла, 63

Шестнадцатеричные константы, 51

Шрифтовые выделения, 29

Эквивалентность логическая, 81

Экспорт объектов, 136, 137

Элементы языка, 44

Эпсилон-расширение, 163

Эрмитова матрица, 179, 191

Числа с плавающей точкой, нормализованные, 78 операции, 77, 78

 
Посмотреть оригинал