Написание программы на языке Фортран, вычисляющей таблицу значений формулы для перевода вычисляемых углов из градусов в радианы (Лабораторная работа № 2)

Страницы работы

Содержание работы

Министерство образования и науки РФ

Новосибирский государственный технический университет

Кафедра прикладной математики

Лабораторная работа №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  |

Похожие материалы

Информация о работе