Министерство образования и науки РФ
Новосибирский государственный технический университет
Кафедра прикладной математики
Лабораторная работа №2
по дисциплине:
«Программирование вычислений»
Факультет: ПМИ
Группа: ПМ-64
Студент: Бузмакова О, Зубакова М.
Преподаватели: Рояк М.Э., Рояк С.Х.
Новосибирск
2009
1. Условие задачи
Написать программу на языке Фортран, вычисляющую таблицу значений заданной функции двух переменных.
2. Математические формулы
а) - формула для перевода вычисляемых углов из градусов в радианы
б) Исследование функции sec(x+y).
Функция sec(t) имеет точки разрыва:
Если аргумент принимает такое значение, то программа выводит «inf».
3. Текст программы
!!vvod dannyx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SUBROUTINE vvod1()
common/vvod/x_max,x_min,y_max,y_min,xi,yi
common /pi/ pi
common /eps/ eps
character *64 fname
pi=3.14159265358979323846
eps=1E-3
read (*,19) fname
19 format (A)
open(1,FILE=fname,status='old')
read(1,*) x_max,x_min,xi,y_max,y_min,yi
if((xi.lt.0.0) .or. (yi.lt.0.0) .or. (y_min.gt.y_max) .or.
*(x_min.gt.x_max)) then
print*,'necorrectnie dannie'
pause
stop
else
12 format(A6,E11.4,' ',A6,E11.4,' ',A3,E11.4)
write(*,12) 'x_min=',x_min,'x_max=',x_max,'xi=',xi
write(*,12) 'y_min=',y_min,'y_max=',y_max,'yi=',yi !vyvod dannyh na ekran
close(1)
endif
end
!!sravnenie veshestvennix chisel!!!!!!!!!!!!!!!!!!!!
integer function ishag(x,fix)
character *11 s1,t
write(s1,15) x
write(t,15) fix
if(s1.eq.t) then
ishag=1
else
ishag=0
endif
15 format(E11.4)
end
!!vychislenie sec(x+y)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
integer function k_sec(xf,yf,sec1) !vychislenie zadannoj funkcii
common /vvod/x_max,x_min,y_max,y_min,xi,yi !vhodnye dannye v obshej oblasti
common /pi/ pi
x=xf
y=yf
if(nyl(x,y).eq.0)then
k_sec=1
else
k_sec=0
endif
x=(x*pi)/180.0
y=(y*pi)/180.0
a=y+x
sec1=1/cos(a)
end
!!sravnenie s nylem!!!!!!!!!!!!!!!!!!!!!!!
integer function nyl(x1,y1)
common /vvod/x_max,x_min,y_max,y_min,xi,yi !vhodnye dannye v obshej oblasti
common /pi/ pi
aa=x1+y1
oo=ishag(aa,0.9000E+02)
if(oo.eq.1)then
nyl=1
else
nyl=0
endif
end
!!-------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine chertochki(n)
30 format('-----------------'\)
31 format(/)
write(2,31)
do i=1,n
write(2,30)
end do
write(2,31)
end
!!PROGRAMMA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
program laba2
common/vvod/x_max,x_min,y_max,y_min,xi,yi
common /pi/ pi
common /eps/ eps
!!formatnii vivod!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5 format(/A3,' ','|'\)
6 format(' ',E11.4,' ','|'\)
8 format(' ',E11.4,' ','|'\)
9 format(' ',A3,' ','|')
7 format(E11.4,' ','|'\)
13 format(A6\)
14 format(E11.4,' ','|'\)
16 format(' ',A3,' ','|'\)
66 format(/A14)
145 format(A6/)
146 format(/A6\)
143 format(' ',E11.4,' ','|'/)
call vvod1()
!!opredelenie kol-va shagov dlya Y!!!!!!!!!!!!!!
m=0
n=0
y=y_min
3 if(y.gt.y_max) goto 33
y_pred=y
m=m+1
y=y_min+m*yi
goto 3
33 l = ishag(y_pred,y_max)
if(l.eq.1)m = m - 1
!!opredelenie kol-va shagov dlya x!!!!!!!!!!!!!!
x=x_min
4 if(x.gt.x_max) goto 34
x_pred=x
4. Тесты
1) f(x,y)=∞
| 0.8999E+02 | 0.9000E+02 | 0.9001E+02 |
-----------------------------------------------------------
| 0.5731E+04 | inf | -0.5728E+04 |
2) f(x,y)=∞
0.8999E+02 | 0.5731E+04 | -0.5788E+02 |
---------------------------------------------------------
0.9000E+02 | inf | -0.5730E+02 |
-----------------------------------------------------------
3) Невидимый шаг
В этих тестах мы видим, что при одинаковых значениях аргумента значение функции разное. Это происходит из-за того что заданный шаг очень маленький и при отображении аргументов с четырьмя знаками в мантиссе он просто незаметен, вследствие чего неравные аргументы отображаются в таблице как равные. Чтобы предотвратить возникновение этого явления, вводим функцию, которая записывает текущее значение аргумента и следующее значение в две строки (в формате Е11.4) и сравнивает их. Если они равны отказ выводить таблицу:
ne ho4y!:-P
4)Диагональ бесконечностей
-0.1000E-01 | 0.9549E+03 | 0.1146E+04 | 0.1432E+04 | 0.1910E+04 | 0.2865E+04 | 0.5731E+04 | inf |
--------------------------------------------------------------------------------------------------------------------------------------------------
0.0000E+00 | 0.1146E+04 | 0.1433E+04 | 0.1910E+04 | 0.2864E+04 | 0.5731E+04 | inf | -0.5728E+04 |
---------------------------------------------------------------------------------------------------------------------------------------------------
0.1000E-01 | 0.1432E+04 | 0.1910E+04 | 0.2864E+04 | 0.5727E+04 | inf | -0.5728E+04 | -0.2865E+04 |
----------------------------------------------------------------------------------------------------------------------------------------------------
0.2000E-01 | 0.1910E+04 | 0.2865E+04 | 0.5727E+04 | inf | -0.5728E+04 | -0.2865E+04 | -0.1910E+04 |
---------------------------------------------------------------------------------------------------------------------------------------------------
0.3000E-01 | 0.2864E+04 | 0.5731E+04 | inf | -0.5732E+04 | -0.2865E+04 | -0.1910E+04 | -0.1432E+04 |
--------------------------------------------------------------------------------------------------------------------------------------------------
0.4000E-01 | 0.5727E+04 | inf | -0.5732E+04 | -0.2866E+04 | -0.1910E+04 | -0.1432E+04 | -0.1146E+04 |
---------------------------------------------------------------------------------------------------------------------------------------------------
0.5000E-01 | inf | -0.5728E+04 | -0.2866E+04 | -0.1910E+04 | -0.1432E+04 | -0.1146E+04 | -0.9549E+03 |
5) Ноль аргументов, sec(x+y)=∞ (тесты принципиально не отличаются, поэтому приведен один из них)
X_min=-99e+7; x_max=1e+7; xi=1e+7; y_min=0; y_max=0; yi=0.
| -0.1000E+08 | 0.0000E+00 | 0.1000E+08 |
| 0.5384E+01 | 0.1000E+01 | 0.5384E+01 |
| 0.5869E+01 | 0.1000E+01 | 0.4973E+01 |
X_min=-99e-7; x_max=1e-7; xi=1e-7; y_min=0; y_max=0; yi=0
| -0.1000E-06 | 0.0000E+00 | 0.1000E-06 |
| 0.1000E+01 | 0.1000E+01 | 0.1000E+01 |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.