Методичка по программированию
.pdfC |
|
|
|
|
|
|
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 |