Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР-13. Численное интегрирование (FORTRAN,Excel,...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.01 Mб
Скачать

Лабораторная работа № 13-3 приближенное вычисление определенного интеграла в среде fortran

Выполнил

ст. 211 гр.

Иванов А.П.

Проверил

доцент каф. 304

Скоб Ю.А.

Цель – научиться использовать средства Microsoft Developer Studio для создания приложений Windows диалогового типа на примере нахождения приближенного значения определенного интеграла функции y=f(x).

Постановка задачи

  1. С помощью диалогового приложения Windows найти приближенное значение определенного интеграла функции f(x) на интервале [a, b] при заданном числе промежутков интегрирования n (n=12 для всех вариантов).

  2. Приближенное значение интеграла определить с помощью методов левых и правых прямоугольников, метода трапеций и метода Симпсона (парабол).

  3. Для методов трапеций и парабол оценить погрешность вычисления приближенного интеграла, что предполагает расчет интегралов для двух вариантов разбиения интервала на n и n/2 промежутков.

Вариант №1

Вычислить определенный интеграл , если a=0, b=1.8, n=12 f(x)= .

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

  1. Текст файла 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

!****************************************************************************

  1. Файл модуля глобальных данных.

!****************************************************************************

! 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

  1. Окно приложения с результатами расчета.

  1. Выводы:

  • получены навыки использования средств Microsoft Developer Studio для создания приложений Windows диалогового типа на примере нахождения приближенного значения определенного интеграла функции y=f(x).