Министерство образования и науки РФ
Кафедра ПМ
Лабораторная работа №2
по дисциплине
программирование вычислений
вариант №16
Преподаватель: Токарева М.Г.
Факультет: ФПМИ
Группа: ПМ-62
Студентка: Коротенко Д.Ю.
Новосибирск 2008г.
I.Условие задачи
II. Используемые формулы
Математическая модель
Функция f(x,y)=Cos(x)/Sin(y) имеет область определения : Область значений: ; функция имеет особые точки:
при х=90 и у 0, f=0;
при х=0 и у=90, f=1
при х=90 и у=0, f=0/0, функция неопределенна
при х ≠ 90 и у=0, f= ∞, функция неопределенна
Функции Cos(x) и Sin(y) имеют период, равный 2π
Программная модель
Область определения и значения функции, представимые в ЭВМ, представляют собой диапазон значений 10-38 ÷ 1038
Исходные данные проверяются на корректность:
max<min или шаг=0
max=min и шаг!=0
max!=min и шаг=0
невидимый шаг x
max-min<шаг
Так представление чисел в ЭВМ не является точным и в ходе вычислений накапливается погрешность, то чтобы избежать потери точности в особых ситуациях, делаются соответствующие проверки:
1.Для вычисления m и n –количества строк и столбцов в таблице:
EPS=1.192093E-07 - самое маленькое число, представимое в памяти ЭВМ
if(mod(xmax-xmin +EPS,dx)<=|(EPS/(dx-EPS)|)then !если область делится шагом нацело
n=( xmax-xmin +dx/2)/dx+1
else
n=( xmax-xmin +dx/2)/dx+2
end if
EPS и dx/2 прибавляются, чтобы компенсировать машинную погрешность
Остаток от деления mod(xmax-xmin +EPS,dx) сравнивается с 0 с точностью |(EPS/(dx-EPS)|)
2.Для обработки особых значений аргументов
if(-1*i*EPS*dx.lt.x(i).and.x(i).lt.EPS*i*dx)then лежитлихвокрестностинулявдиапазонешага
x(i)=0
else
if(abs(x(i-1)/x(i)).gt.100.0)then проверка на 0 при очень маленьком шаге
x(i)=0 !если х равен 0 в рамках погрешности, то положим его равным 0
else
if(abs(90-x(i))/x(i).gt.1E4) сравнение через относительную погрешность с точностью не меньше 4 значащих цифр
x(i)=90 !если х равен 90 в рамках погрешности, то положим его равным 90
end if
end if
3.Для обработки особых значений функции
ic=0
if((abs(mod(x(i),90.0)).lt.EPS/90.0).and.(abs(mod(x(i),180.0)).gt.EPS/180.0))ic=1
если косинус равен 0 с учетом периода и погрешности, то функция равна 0
if(abs(mod(y,180.0)).lt.EPS/180.0)then
если синус равен 0 с учетом периода и погрешности, то функция равна “indefened”, неопределенна
if(ic.eq.1)then
если ситуация 0/0, то функция равна”0/0”, неопределена
III. Структура программы
subroutineproverka (i) // подпрограмма проверки входных данных, проверяет их на корректность
входные данные и результаты: формальный параметр i-номер устройства для записи, возращает результат проверки (1-все правильно,2-неверный шаг,0-неверные данные)
subroutinevvod (n) // подпрограмма ввода читает входные данные: xmin, xmax, dx, ymin, ymax, dy из файла
входные данные и результаты: пременная n целого типа номер устройства для чтения
subroutinerazmer//подпограмма вычисления размеров таблицы, результат nx и my - размеры по x и y
subroutine tab(n)//подпрограмма заполнения таблицы, формальный параметр n- номер файла для записи
Взаимодействиеподпрограмм
program main
subroutine vvod (n) subroutine tab(n)
subroutine proverka (n)
IV. Текст программы
!подпограмма ввода,читает входные данные:xmin,xmax,dx,ymin,ymax,dy из файла
subroutine vvod(n)
common /f/ xmin,xmax,dx,ymin,ymax,dy
read (n,*)xmin,xmax,dx,ymin,ymax,dy
end
!подпограмма прверки входных данных, проверяет их на корректность
!формальный параметр i-номер устройства для записи, возращает результат проверки
!(1-все правильно,2-неверный шаг,0-неверные данные)
subroutine proverka (i)
common /f/ xmin,xmax,dx,ymin,ymax,dy
1 format(A)
if((xmax.lt.xmin).or.(ymax.lt.ymin).or.(dx.lt.0).or.(dy.lt.0)) !max<min || шаг=0
*then
write(i,1)'NEKORRECTNIE DANNIE'
i=0
else
if((xmax.eq.xmin).and.(dx.ne.0).or.(ymax.eq.ymin).and.(dy.ne.0)) !max=min && шаг!=0
*then
write(i,1)'NEKORRECTNIE DANNIE'
i=0
else
if((xmax.ne.xmin).and.(dx.eq.0).or.(ymax.ne.ymin).and.(dy.eq.0)) !max!=min && шаг=0
*then
write(i,1)'NEKORRECTNIE DANNIE'
i=0
else
if(dx.ne.0)then
if((xmax/dx.gt.1E4).or.((xmax-xmin).lt.dx).or. ! невидимый шаг x ||max-min<шаг
*((ymax-ymin).lt.dy))then
write(i,1)'NEKORRECTNIY SHAG'
i=2
else
i=1
end if
else
if(dy.ne.0)then
if(ymax/dy.gt.1E4)then
write(i,1)'NEKORRECTNIY SHAG' !невидимый шаг y
i=2
else
i=1
end if
else
i=1
end if
end if
end if
end if
end if
end
!подпограмма вычисления размеров таблицы, результат nx и my - размеры по x и y
subroutine razmer
common /f/ xmin,xmax,dx,ymin,ymax,dy
common /raz/ nx,my,EPS
EPS=1.192093E-07
if(dx.ne.0.0)then
xn=(xmax-xmin)
if(mod(xn+EPS,dx).le.abs(EPS/(dx-EPS)))then !если область делится шагом нацело
nx=(xn+dx/2)/dx+1
else
nx=(xn+dx/2)/dx+2
end if
else
nx=1
end if
if(dy.ne.0.0)then
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.