
Варианты исходных данных
№ варианта |
Определенный интеграл |
№ варианта |
Определенный интеграл |
1 |
|
16 |
|
2 |
|
17 |
|
3 |
|
18 |
|
4 |
|
19 |
|
5 |
|
20 |
|
6 |
|
21 |
|
7 |
|
22 |
|
8 |
|
23 |
|
9 |
|
24 |
|
10 |
|
25 |
|
11 |
|
26 |
|
12 |
|
27 |
|
13 |
|
28 |
|
14 |
|
29 |
|
15 |
|
30 |
|
ПРИМЕР ОФОРМЛЕНИЯ ОТЧЕТА
Лабораторная работа № 16-3
ОПРЕДЕЛЕНИЕ КОРНЕЙ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ
МЕТОДОМ ИТЕРАЦИЙ
Выполнил |
ст. 211 гр. |
Иванов А.П. |
|
Проверил |
доцент каф. 304 |
Скоб Ю.А. |
|
Цель работы – освоить навыки приближенного нахождения корней алгебраических трансцендентных уравнений методом итераций в различных средах программирования.
Постановка задачи
Используя комбинированный метод, вычислить с заданной точностью ( ) действительные корни заданного алгебраического уравнения .
Решить задачу в различных средах: Fortrani, MS Excel и MathCad.
Вариант №1
Вычислить корни уравнения с точностью =10-5 на предварительно найденном интервале изоляции [a, b].
Содержание работы
Текст файла Lab16_V1.f90:
! Lab16_V1.f90
! FUNCTIONS:
! WinMain() - Entry point for the application
! displays the main window processes the message loop
! Lab16_V1Sub() - Callback routine for the main dialog box
! Lab16_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 Lab16_V1Globals
implicit none
integer*4 hInstance
integer*4 hPrevInstance
integer*4 lpszCmdLine
integer*4 nCmdShow
include 'resource.fd'
external Lab16_V1Sub
external Lab16_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_lamb,'(f5.2)') lamb
write(text_eps,'(e8.1)') eps
ghInstance = hInstance
ghModule = GetModuleHandle(NULL)
ghwndMain = NULL
lret = DlgInit(IDD_LAB16_V1_DIALOG, gdlg)
if (lret == .FALSE.) goto 99999
lret = DlgSetSub(gdlg, IDD_LAB16_V1_DIALOG, Lab16_V1Sub)
lret = DlgSetSub(gdlg, IDM_APPLY, Lab16_V1Apply)
!*** выводим строки в соответствующие окна редактирования
lret = DlgSet( gdlg, IDC_EDIT_A, trim(text_a))
lret = DlgSet( gdlg, IDC_EDIT_B, trim(text_b))
lret = DlgSet( gdlg, IDC_EDIT_EPS, trim(text_eps))
lret = DlgSet( gdlg, IDC_EDIT_LAMB, trim(text_lamb))
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 Lab16_V1"C, &
"Error"C, MB_OK)
WinMain = 0
end
!****************************************************************************
! FUNCTION: Lab16_V1Sub ( dlg, id, callbacktype )
! PURPOSE: Dialog box callback for initialization and destroy
! COMMENTS:
!****************************************************************************
SUBROUTINE Lab16_V1Sub( dlg, id, callbacktype )
!DEC$ ATTRIBUTES DEFAULT :: Lab16_V1Sub
use user32
use dflogm
implicit none
type (dialog) dlg
integer id, callbacktype
if (callbacktype == dlg_destroy) then
call PostQuitMessage(0)
endif
END SUBROUTINE Lab16_V1Sub
!****************************************************************************
! FUNCTION: Lab16_V1Apply ( dlg, id, callbacktype )
! PURPOSE: Dialog box callback for APPLY button
! COMMENTS:
!****************************************************************************
SUBROUTINE Lab16_V1Apply( dlg, id, callbacktype )
!DEC$ ATTRIBUTES DEFAULT :: Lab16_V1Apply
use dflogm ! получаем доступ к диалоговым процедурам
use Lab16_V1Globals ! подключаем глобальные переменные
implicit none ! обязательное обявление имен
include 'resource.fd' ! получаем доступ к ресурсным данным
type (dialog) dlg ! производный тип для диалога
integer id ! имя элемента управления, пославшего сообщение
integer callbacktype ! показывает тип сообщения Windows
logical*4 lret ! результат диалоговой функции
real & ! локальные переменные, необходимые для расчета корня
Xnew, & ! новое значение Х
Xold ! значение Х на предыдущей итерации
real F ! заданная функция
!------------------------
if (callbacktype == dlg_clicked) then
! обработка сообщения "щелчок мышью"
! считать значения текстовых переменных из окон редактироания
lret = dlgget(dlg, IDC_EDIT_A, text_a)
lret = dlgget(dlg, IDC_EDIT_B, text_b)
lret = dlgget(dlg, IDC_EDIT_EPS, text_eps)
lret = dlgget(dlg, IDC_EDIT_LAMB, text_lamb)
! обменяться данными между текстовыми и расчетными переменными
read(text_a, "(f5.2)") a
read(text_b, "(f5.2)") b
read(text_eps, *) eps
!*** расчет корня методом итераций
Xnew=(a+b)/2 ! начальное значение Х
do
Xold=Xnew ! переназначение Х для следующей итерации
Xnew= Xold - lamb*F(Xold) ! новая итерация по Х
iter=iter+1 ! увеличиваем число итераций
if(abs(Xnew - Xold)<eps)exit ! проверка на завершение поиска
enddo
kor=( Xnew + Xold)/2 ! приближенное значение корня
!-------------------------------------
write(text_kor,'(f11.6)') kor ! корень
write(text_Iter,'(i5)') iter ! число итераций
!*** выводим строки в соответствующие окна редактирования
lret = DlgSet( gdlg, IDC_EDIT_KOR, trim(text_kor))
lret = DlgSet( gdlg, IDC_EDIT_ITER, trim(text_Iter))
endif
END SUBROUTINE Lab16_V1Apply
!****************************************************************************
! заданная функция
real function F(x)
real x
F=x**3-2.8*x**2-6.2*x+3.7
end function F
!****************************************************************************
Файл модуля глобальных данных.
!****************************************************************************
! Global data, parameters, and structures
!****************************************************************************
module Lab16_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=-2.0 ! левая граница интервала изоляции корня
real::b=-1.0 ! правая граница интервала изоляции корня
real::eps=1e-5 ! точность вычислений
real::lamb=0.1 ! итерационный коэффициент
real kor ! искомый корень уравнения
integer iter ! число итераций поиска корня
!--- строки для обмена с текстовыми окнами
character(5)::text_a='',text_b='',text_iter='',text_lamb=''
character(8)::text_eps=''
character(12)::text_kor=''
end module
Окно приложения с результатами расчета.
Работа в MathCad.
Работа в Excel.
Выводы:
освоены навыки приближенного нахождения корней алгебраических трансцендентных уравнений методом итераций в различных средах программирования;
закреплены приемы реализации вычислительного процесса с помощью приложения Windows диалогового типа в среде Fortran.