
- •Лабораторная работа № 13-1 приближенное вычисление определенного интеграла в среде microsoft excel
- •Постановка задачи
- •Теоретические сведения
- •Численное интегрирование.
- •Работа в среде MathCad
- •Порядок выполнения работы
- •Лабораторная работа № 13-3 приближенное вычисление определенного интеграла в среде fortran
- •Постановка задачи
- •Вариант №1
- •Содержание работы
- •Вычисление определенного интеграла (Контрольные вопросы – правильные варианты)
Лабораторная работа № 13-3 приближенное вычисление определенного интеграла в среде fortran
Выполнил |
ст. 211 гр. |
Иванов А.П. |
|
Проверил |
доцент каф. 304 |
Скоб Ю.А. |
|
Цель – научиться использовать средства Microsoft Developer Studio для создания приложений Windows диалогового типа на примере нахождения приближенного значения определенного интеграла функции y=f(x).
Постановка задачи
С помощью диалогового приложения Windows найти приближенное значение определенного интеграла функции f(x) на интервале [a, b] при заданном числе промежутков интегрирования n (n=12 для всех вариантов).
Приближенное значение интеграла определить с помощью методов левых и правых прямоугольников, метода трапеций и метода Симпсона (парабол).
Для методов трапеций и парабол оценить погрешность вычисления приближенного интеграла, что предполагает расчет интегралов для двух вариантов разбиения интервала на n и n/2 промежутков.
Вариант №1
Вычислить
определенный интеграл
,
если a=0,
b=1.8,
n=12
f(x)=
.
Содержание работы
Текст файла Lab13_V1.f90:
! Lab13_V1.f90
! FUNCTIONS:
! WinMain() - Entry point for the application
! displays the main window processes the message loop
! Lab13_V1Sub() - Callback routine for the main dialog box
! Lab13_V1Apply()- Callback routine for the APPLY button
!**************************************************************************
! FUNCTION: WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow )
! PURPOSE: Entry point for the application
! COMMENTS: Displays the main window and processes the message loop
!**************************************************************************
integer*4 function WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow )
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'WinMain' :: WinMain
!DEC$ ENDIF
use user32
use kernel32
use dflogm
use Lab13_V1Globals
implicit none
integer*4 hInstance
integer*4 hPrevInstance
integer*4 lpszCmdLine
integer*4 nCmdShow
include 'resource.fd'
external Lab13_V1Sub
external Lab13_V1Apply
! Variables
type (T_MSG) mesg
integer*4 ret
logical*4 lret
!*** передача начальных значений исходных данных строкам
write(text_a,'(f5.2)') a
write(text_b,'(f5.2)') b
write(text_n,'(i5)') n
!--------------------------------------------------------
ghInstance = hInstance
ghModule = GetModuleHandle(NULL)
ghwndMain = NULL
lret = DlgInit(IDD_LAB13_V1_DIALOG, gdlg)
if (lret == .FALSE.) goto 99999
lret = DlgSetSub(gdlg, IDD_LAB13_V1_DIALOG, Lab13_V1Sub)
lret = DlgSetSub(gdlg, IDM_APPLY, Lab13_V1Apply)
!*** выводим строки в соответствующие окна редактирования
lret = DlgSet( gdlg, IDC_EDIT_A, trim(text_a))
lret = DlgSet( gdlg, IDC_EDIT_B, trim(text_b))
lret = DlgSet( gdlg, IDC_EDIT_N, trim(text_n))
!--------------------------------------------------------
lret = DlgModeless(gdlg, nCmdShow)
if (lret == .FALSE.) goto 99999
! Read and process messsages
do while( GetMessage (mesg, NULL, 0, 0) )
if ( DlgIsDlgMessage(mesg) .EQV. .FALSE. ) then
lret = TranslateMessage( mesg )
ret = DispatchMessage( mesg )
end if
end do
call DlgUninit(gdlg)
WinMain = mesg.wParam
return
99999 &
ret = MessageBox(ghwndMain, "Error initializing application Lab13_V1"C, &
"Error"C, MB_OK)
WinMain = 0
end
!****************************************************************************
! FUNCTION: Lab13_V1Sub ( dlg, id, callbacktype )
! PURPOSE: Dialog box callback for initialization and destroy
! COMMENTS:
!****************************************************************************
SUBROUTINE Lab13_V1Sub( dlg, id, callbacktype )
!DEC$ ATTRIBUTES DEFAULT :: Lab13_V1Sub
use user32
use dflogm
implicit none
type (dialog) dlg
integer id, callbacktype
if (callbacktype == dlg_destroy) then
call PostQuitMessage(0)
endif
END SUBROUTINE Lab13_V1Sub
!****************************************************************************
! FUNCTION: Lab13_V1Apply ( dlg, id, callbacktype )
! PURPOSE: Dialog box callback for APPLY button
! COMMENTS:
!****************************************************************************
SUBROUTINE Lab13_V1Apply( dlg, id, callbacktype )
!DEC$ ATTRIBUTES DEFAULT :: Lab13_V1Apply
use dflogm ! получаем доступ к диалоговым процедурам
use Lab13_V1Globals ! подключаем глобальные переменные
implicit none ! обязательное обявление имен
include 'resource.fd' ! получаем доступ к ресурсным данным
type (dialog) dlg ! производный тип для диалога
integer id ! имя элемента управления, пославшего сообщение
integer callbacktype ! показывает тип сообщения Windows
logical*4 lret ! результат диалоговой функции
real Func ! подинтегральная функция
real x,y,C,h,Sum,IntTrap2h,IntSimp2h ! локальные переменные
integer i ! счетчик
!------------------------
if (callbacktype == dlg_clicked) then ! сообщение-щелчок мышью
! TO DO Add your APPLY logic here
! считать значения текстовых переменных из окон редактироания
lret = dlgget(dlg, IDC_EDIT_A, text_a)
lret = dlgget(dlg, IDC_EDIT_B, text_b)
lret = dlgget(dlg, IDC_EDIT_N, text_n)
! обменяться данными между текстовыми и расчетными переменными
read(text_a, "(f5.2)") a
read(text_b, "(f5.2)") b
read(text_n, "(i5)") n
!*** расчет интегралов и погрешностей
h=(b-a)/n ! шаг интегрирования
! метод левых прямоугольников
Sum=0
do i=0,n-1
x=a+i*h
y=Func(x)
Sum=Sum+y*h
enddo
IntLeft=Sum ! интеграл методом левых прямоугольников
! метод правых прямоугольников
Sum=0
do i=1,n
x=a+i*h
y=Func(x)
Sum=Sum+y*h
enddo
IntRight=Sum
! метод трапеций
Sum=Func(a)+Func(b)
do i=1,n-1 ! расчет с разбиением интервала с шагом h
x=a+i*h
y=Func(x)
Sum=Sum+2*y
enddo
IntTrap=h/2*Sum
Sum=Func(a)+Func(b)
do i=1,n-1 ! расчет с разбиением интервала с шагом 2*h
if((-1)**i < 0) then
C=0
else
C=2
endif
x=a+i*h
y=Func(x)
Sum=Sum+C*y
enddo
IntTrap2h=h*Sum
Rtrap=abs(IntTrap2h-IntTrap)/3 ! погрешность
! метод Симпсона (парабол)
Sum=Func(a)+Func(b) ! расчет с разбиением интервала с шагом h
do i=1,n-1
x=a+i*h
y=Func(x)
if((-1)**i > 0) then
C=2
else
C=4
endif
Sum=Sum+C*y
enddo
IntSimp=h/3*Sum
Sum=Func(a)+Func(b) ! расчет с разбиением интервала с шагом 2*h
do i=1,n/2-1
x=a+i*2*h
y=Func(x)
if((-1)**i > 0) then
C=2
else
C=4
endif
Sum=Sum+C*y
enddo
IntSimp2h=2*h/3*Sum
RSimp=abs(IntSimp2h-IntSimp)/15 ! погрешность
!-------------------------------------
write(text_IntLeft,'(f11.6)') IntLeft ! методом левых прямоугольников
write(text_IntRight,'(f11.6)') IntRight! методом правых прямоугольников
write(text_IntTrap,'(f11.6)') IntTrap ! интеграл методом трапеций
write(text_IntSimp,'(f11.6)') IntSimp ! интеграл методом парабол
write(text_Rtrap,'(f12.8)') Rtrap ! погрешность метода трапеций
write(text_RSimp,'(f12.8)') RSimp ! погрешность метода парабол
!*** выводим строки в соответствующие окна редактирования
lret = DlgSet( gdlg, IDC_EDIT_LEFT, trim(text_IntLeft))
lret = DlgSet( gdlg, IDC_EDIT_RIGHT, trim(text_IntRight))
lret = DlgSet( gdlg, IDC_EDIT_TRAP, trim(text_IntTrap))
lret = DlgSet( gdlg, IDC_EDIT_SIMP, trim(text_IntSimp))
lret = DlgSet( gdlg, IDC_EDIT_R_TRAP, trim(text_Rtrap))
lret = DlgSet( gdlg, IDC_EDIT_R_SIMP, trim(text_RSimp))
endif
END SUBROUTINE Lab13_V1Apply
!****************************************************************************
! подинтегральная функция
real function Func(x)
real x
Func=(x**2-4.1)/(x**4+1)
end function Func
!****************************************************************************
Файл модуля глобальных данных.
!****************************************************************************
! Global data, parameters, and structures
!****************************************************************************
module Lab13_V1Globals
use dflogm
implicit none
! Parameters
integer*4, parameter, public :: SIZEOFAPPNAME = 100
! Global data
integer ghInstance
integer ghModule
integer ghwndMain
type (dialog) gdlg
! объявление и инициализация глобальных переменных
real::a=0.0 ! нижний предел интегрирования
real::b=1.8 ! верхний предел интегрирования
integer::n=12 ! число разбиений интервала
real IntLeft ! интеграл методом левых прямоугольников
real IntRight ! интеграл методом правых прямоугольников
real IntTrap ! интеграл методом трапеций
real IntSimp ! интеграл методом парабол (Симпсона)
real Rtrap ! погрешность метода трапеций
real RSimp ! погрешность метода парабол (Симпсона)
! строки для обмена с текстовыми окнами
character(5)::text_a='',text_b='',text_n=''
character(12)::text_IntLeft='',text_IntRight='',text_IntTrap='', &
text_IntSimp='',text_Rtrap='',text_RSimp=''
end module
Окно приложения с результатами расчета.
Выводы:
получены навыки использования средств Microsoft Developer Studio для создания приложений Windows диалогового типа на примере нахождения приближенного значения определенного интеграла функции y=f(x).