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

Методичка по программированию

.pdf
Скачиваний:
20
Добавлен:
27.03.2015
Размер:
346.06 Кб
Скачать

C

 

 

 

 

 

 

Z =

ZL

 

 

 

15

T =

TL

!

Начало цикла по переменной Z

35

D = Z * T

!

Начало цикла по переменной T

C

 

 

 

 

 

 

IF( D .GT.

3.

)

GOTO 75

 

 

IF( D .GT. -2. )

GOTO 55

 

 

K = 1

 

 

 

Y = EXP( Z )

GOTO 95

55K = 2

Y = SIN( T )

 

GOTO 95

 

 

 

75

K =

3

 

 

 

 

Y =

SQRT( D )

 

 

95

WRITE(*,*)

 

 

 

 

WRITE(*,*)

’Z =’,Z, ’; T =’,T, ’;

D =’,D

 

WRITE(*,*)

K, ’-я ветвь;

Y =’,Y

C

 

 

 

 

 

 

T =

T + TS

 

 

 

 

IF( T .LE. TU )

GOTO 35 ! Конец цикла по T

C

 

 

 

 

 

 

Z = Z + ZS

 

 

 

 

IF( Z .LE. ZU )

GOTO 15 ! Конец цикла по Z

 

GOTO 5

 

 

 

 

 

END

 

 

 

 

21

INPUT

ZL, ZU, ZS, TL, TU, TS:

 

 

 

0. 3. 3. -3. 3. 3.

 

 

 

 

 

Z = 0.00000E+00;

T =

-3.00000;

D = 0.00000E+00

 

2-я ветвь;

 

Y =

-1.411200E-01

Z = 0.00000E+00;

T = 0.00000E+00;

D = 0.00000E+00

 

2-я ветвь;

 

Y =

0.000000E+00

Z = 0.00000E+00;

T =

3.00000;

D = 0.00000E+00

 

2-я ветвь;

 

Y =

1.411200E-01

Z =

3.00000;

T =

-3.00000;

D =

-9.00000

 

1-я ветвь;

 

Y =

 

20.085540

Z =

3.00000;

T = 0.00000E+00;

D = 0.00000E+00

 

2-я ветвь;

 

Y =

0.000000E+00

Z =

3.00000;

T =

3.00000;

D =

9.00000

 

3-я ветвь;

 

Y =

 

3.000000

/* ЗАДАНИЕ 3. Пример 3. Программа на языке C. */

#include <stdio.h> #include <math.h>

int main( void ) {

int k;

double z, zl, zu, zs, t, tl, tu, ts, d, y;

22

l: printf( "input

zl, zu, zs, tl, tu, ts : " );

scanf( "\f %lg

%lg

%lg %lg

%lg %lg",

 

&zl, &zu, &zs, &tl, &tu, &ts );

z =

zl;

 

 

 

do {

/* Начало цикла по переменной z */

t

= tl;

 

 

 

do { /* Начало цикла по переменной t */

 

d = z * t;

 

 

 

 

if( d <= 3. ) {

 

 

 

if( d <= -2. ) { k = 1;

y = exp( z ); }

 

else { k = 2;

y = sin( t ); }

 

}

 

 

 

 

else { k = 3;

y = sqrt( d ); }

 

printf( "\n" );

 

 

 

printf("z = %g;

t = %g;

d = %g\n", z,t,d);

 

printf("

%d-я ветвь;

y = %.16g\n",k,y);

 

t += ts;

 

 

 

} while( t <= tu );

/* Конец

цикла по

t */

z += zs;

 

 

 

} while( z <= zu );

/* Конец

цикла по

z */

goto l;

 

 

 

}

 

 

 

23

input zl, zu, zs, tl, tu, ts : 0. 3. 3. -3. 3. 3.

z = 0;

t = -3;

d = -0

2-я

ветвь;

y = -0.1411200080598672

z = 0;

t = 0;

d = 0

2-я

ветвь;

y = 0

z = 0;

t = 3;

d = 0

2-я

ветвь;

y = 0.1411200080598672

z = 3;

t = -3;

d = -9

1-я

ветвь;

y = 20.08553692318767

z = 3;

t = 0;

d = 0

2-я

ветвь;

y = 0

z = 3;

t = 3;

d = 9

3-я

ветвь;

y = 3

24

ЗАДАНИЕ 4

Используя различные способы организации циклических алгоритмических структур, составить программу для ЭВМ, позволяющую вычислять в задаваемом диапазоне изменения независимой переменной (начальное значение, шаг изменения, конечное значение) функций exp(); lg(); sin() в соответствии с вариантами задания.

В качестве образца рекомендуется взять стандартные библиотечные процедуры используемой языковой среды.

Второй способ заключается в использовании укороченных степенных рядов со специально подобранными (оптимизированными) значениями коэффициентов, обеспечивающими в заданном диапазоне применения примерно одинаковые ( 0:0001 ) значения абсолютной и относительной точностей:

7

ex X ek xk ; jxj 1

k=0

ek = ( 0:99999; 1:0; 0:5; 0:16666; 0:04163; 0:00833;

 

0:00144; 0:0002 );

 

 

k = 0; : : : ; 7

 

4

 

 

 

x 1

 

 

2k 1

 

 

x < p

 

 

lg x

 

l

 

 

 

 

; 1

 

10

 

 

 

 

 

 

 

k=1

 

k

x + 1

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

lk = ( 0:86855; 0:29115; 0:15361; 0:21139 ) ; k = 1; : : : ; 4

5

; jxj =2

sin x sk x2k 1

kX

 

=1

 

25

 

sk = ( 1:0; 0:166666; 0:00833; 0:00019; 0:000002 ) ; k = 1; : : : ; 5

Третий способ предполагает использование табличного разложения рассматриваемых функций в степенной ряд:

 

1

xk

 

x

x2

 

x3

 

 

 

 

 

 

ex =

 

 

= 1 +

 

+

 

+

 

 

 

+ : : : ; jxj < 1

 

k!

1!

2!

3!

 

 

kX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

lg x =

 

2

 

1

 

 

 

(x 1)2k 1

 

 

 

 

 

=

 

 

 

 

ln 10

kX

 

1)(x + 1)2k 1

 

 

 

 

 

 

 

 

 

 

 

=1 (2k

 

 

 

 

 

 

=

 

2

 

 

x 1

 

+

(x 1)3

+

(x 1)5

+ : : : ; x > 0

ln 10

 

 

 

 

 

 

 

 

"x + 1 3(x + 1)3

 

 

5(x + 1)5

#

 

1

 

 

 

 

x2k 1

 

 

x3

x5

x7

 

sin x =

 

( 1)k 1

 

 

 

= x

 

+

 

 

 

+: : : ; jxj < 1

 

(2k

 

1)!

3!

5!

7!

 

kX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

26

Варианты задания

 

1:exp(1 + 2x 3x2)

2:lgj2x + arctg xj

3:sin(7sin x 0:2)

4:exp(0:1 + 3cos x2) 5:lgj2:51x + lg x2j

6:sin(1 x + tg x)

7:exp(0:4 + x + x3)

8:lgj0:24 + 3sin xj

9:sin(1 + x + 2ex)

10:exp(3x arctg x) 11:lgj1 + 3x tg xj 12:sin(1 2x + x3)

13:exp(2 + x lnjxj) 14:lgj1 + 8x 2exj 15:sin(2:4x lg x2)

16:exp(1 x + 3tg x) 17:lgj0:2 5cos xj 18:sin(1 x + 2x2)

19:exp(0:12 + 6sin x) 20:lgj2 + 2x + 2x2j 21:sin(0:33 + lnjxj)

22:exp(0:56x + lg x2) 23:lgj3:2x + 0:2x3j 24:sin(x + arctg x)

25:exp(1 + 5x + 2ex) 26:lgj1 + lnjxj + xj 27:sin(0:7x + 2x4)

28:exp(2:2x + 0:3x5) 29:lgj3 6x 5x2j 30:sin(7cos x3 1)

27

Пример 4. Для аргумента a = x2 +px 2 требуется составить программу для ЭВМ, позволяющую вычислить тремя способами таблицы функций exp(a); lgjaj; sin(a) в заданном диапазоне изменения независимой переменной x от начального значения xl с шагом изменения xs до конечного значения xu .

Использование стандартных библиотечных процедур exp(); lg(); sin() очевидно. Укороченные степенные ряды со специально подобранными значениями коэффициентов легко получаются через использование счетной циклической алгоритмической структуры. Трудности могут возникнуть лишь при использовании табличных разложений функций в степенные ряды, поскольку вычисление очередных k х членов zk при достаточно большом k может вызвать переполнение разрядной сетки ЭВМ. Это преодолевается использованием рекуррентных формул для вычисления последующих членов ряда через предыдущие:

 

 

 

 

 

 

 

 

 

 

xk+1

xk

x

 

 

 

 

 

 

x

 

 

exp() :

 

zk+1 =

 

 

 

 

=

 

 

 

 

 

 

 

= zk

 

 

;

 

 

(k + 1)!

k!

k + 1

k + 1

 

 

lg() :

 

z

 

 

=

 

2

 

 

 

 

(x 1)2k+1

=

 

 

 

 

 

k+1

 

 

ln 10 (2k + 1)(x + 1)2k+1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=

 

2

 

 

 

(x 1)2k 1

 

 

 

 

2k 1

 

x 1

 

 

2

=

ln 10

 

 

 

 

 

 

 

 

 

 

 

(2k 1)(x + 1)2k 1 2k + 1

x + 1

 

 

 

 

 

 

 

 

 

= z

 

 

 

 

2k 1

 

 

x 1

 

2

;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

 

2k + 1

x + 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

28

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sin() : zk+1 = ( 1)k

 

x2k+1

 

 

=

 

(2k + 1)!

= ( 1)k 1

x2k 1

 

x2

 

 

 

 

 

=

(2k

 

1)!

2k(2k + 1)

 

 

 

 

 

 

 

 

= zk( 1)k 1

x2

 

:

2k(2k + 1)

Невозможно суммирование бесконечно большого количества членов ряда. Поэтому вычисление с заданными абсолютной или относительной степенями точности подразумевает критерии остановки процесса суммирования jzkj < и jzk=skj < соответственно для достижения требуемых значений абсолютной и относительной погрешностей вычисления суммы ряда sk на k м шаге. Рассмотренный способ вычисления через табличное разложение функции в степенной ряд рекомендуется реализовать через использование циклической алгоритмической структуры общего вида.

CЗАДАНИЕ 4. Пример 4. Прогр. на языке FORTRAN.

PROGRAM T4

C

PARAMETER( QMIN = 1.E-38 )

R E A L E(0:7), L(4), S(5)

D A T A E / 0.99999, 1., 0.5, 0.16666,

*0.04163, 8.33E-3, 1.44E-3, 2.E-4 /,

*L / 0.86855, 0.29115, 0.15361, 0.21139 /,

*S / 1.,-0.166666,8.33E-3,-1.9E-4,2.E-6 /

C

5WRITE(*,*)’INPUT XL, XU, XS, DLT:’

READ(*,*)

XL, XU, XS, DLT

29

C

 

 

 

N =

(XU-XL)/XS + 0.5

!

Кол-во XS в [XL,XU]

DO

88 I = 0, N

! Начало цикла по X

X = XL + XS*FLOAT( I )

 

WRITE(*,*)

 

 

WRITE(*,*) ’ X =’, X

 

 

C

 

 

 

A = X**2+SQRT(X)-2.

! Аргумент

J = 0

! вычисляемых функций

C

 

 

 

7J = J + 1 ! Перебор вычисляемых функций A2 = 0.0 ! Абсолютные и относительные

R2

= 0.0

!

погрешности

A3

=

0.0

!

для укороченных рядов

R3

=

0.0

!

и табличных разложений

C

GOTO( 11, 22, 33, 88 ) J

C

11 Y1 = EXP( A ) ! Стандартная функция

WRITE(*,*) ’EXP(’, A, ’ ) =’, Y1

C

 

 

 

 

Z =

1.0

 

 

Y2

=

E(0)

! Укороченный ряд

DO

 

K =

1 , 7

 

 

Z

= Z * A

 

Y2

= Y2 + E(K) * Z

END DO

 

C

 

 

K =

1

 

Z =

1.0

Y3 =

Z

! Табличное разложение

 

 

30