- •Лабораторная работа № 14
- •Теоретические сведения
- •Типовый вариант
- •Реализация типового варианта
- •Варианты исходных данных
- •Лабораторная работа № 14
- •Уравнений методом половинного деления
- •Постановка задачи
- •Используя метод половинного деления, вычислить с заданной точностью ( ) действительные корни заданного алгебраического уравнения .
- •Решить задачу в различных средах: Fortran, ms Excel и MathCad. Вариант №1
- •Содержание работы
- •Метод половинного деления (Контрольные вопросы – правильные варианты)
Варианты исходных данных
№ варианта |
Определенный интеграл |
№ варианта |
Определенный интеграл |
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 |
|
ПРИМЕР ОФОРМЛЕНИЯ ОТЧЕТА
Лабораторная работа № 14
ОПРЕДЕЛЕНИЕ КОРНЕЙ АЛГЕБРАИЧЕСКИХ ТРАНСЦЕНДЕНТНЫХ
Уравнений методом половинного деления
Выполнил |
ст. 211 гр. |
Иванов А.П. |
|
Проверил |
доцент каф. 304 |
Скоб Ю.А. |
|
Цель работы – освоить навыки приближенного нахождения корней алгебраических трансцендентных уравнений методом половинного деления в различных средах программирования; научиться реализовывать вычислительный процесс с помощью приложения Windows диалогового типа
Постановка задачи
Используя метод половинного деления, вычислить с заданной точностью ( ) действительные корни заданного алгебраического уравнения .
Решить задачу в различных средах: Fortran, ms Excel и MathCad. Вариант №1
Вычислить корни уравнения с точностью =10-5 на предварительно найденном интервале изоляции [a, b].
Содержание работы
Текст файла Lab14_V1.f90:
! Lab14_V1.f90
!
! FUNCTIONS:
! WinMain() - Entry point for the application
! displays the main window processes the message loop
! Lab14_V1Sub() - Callback routine for the main dialog box
! Lab14_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 Lab14_V1Globals
implicit none
integer*4 hInstance
integer*4 hPrevInstance
integer*4 lpszCmdLine
integer*4 nCmdShow
include 'resource.fd'
external Lab14_V1Sub
external Lab14_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_eps,'(e8.1)') eps
!--------------------------------------------------------
ghInstance = hInstance
ghModule = GetModuleHandle(NULL)
ghwndMain = NULL
lret = DlgInit(IDD_LAB14_V1_DIALOG, gdlg)
if (lret == .FALSE.) goto 99999
lret = DlgSetSub(gdlg, IDD_LAB14_V1_DIALOG, Lab14_V1Sub)
lret = DlgSetSub(gdlg, IDM_APPLY, Lab14_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 = 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 Lab14_V1"C, &
"Error"C, MB_OK)
WinMain = 0
end
!****************************************************************************
! FUNCTION: Lab14_V1Sub ( dlg, id, callbacktype )
! PURPOSE: Dialog box callback for initialization and destroy
! COMMENTS:
!****************************************************************************
SUBROUTINE Lab14_V1Sub( dlg, id, callbacktype )
!DEC$ ATTRIBUTES DEFAULT :: Lab14_V1Sub
use user32
use dflogm
implicit none
type (dialog) dlg
integer id, callbacktype
if (callbacktype == dlg_destroy) then
call PostQuitMessage(0)
endif
END SUBROUTINE Lab14_V1Sub
!****************************************************************************
! FUNCTION: Lab14_V1Apply ( dlg, id, callbacktype )
! PURPOSE: Dialog box callback for APPLY button
! COMMENTS:
!****************************************************************************
SUBROUTINE Lab14_V1Apply( dlg, id, callbacktype )
!DEC$ ATTRIBUTES DEFAULT :: Lab14_V1Apply
use dflogm ! получаем доступ к диалоговым процедурам
use Lab14_V1Globals ! подключаем глобальные переменные
implicit none ! обязательное обявление имен
include 'resource.fd' ! получаем доступ к ресурсным данным
type (dialog) dlg ! производный тип для диалога
integer id ! имя элемента управления, пославшего сообщение
integer callbacktype ! показывает тип сообщения Windows
logical*4 lret ! результат диалоговой функции
real F ! заданная функция
real & ! локальные переменные, необходимые для расчета корня
C, & ! середина интервала изоляции корня
L, & ! левая текущая граница интервала изоляции корня
R ! правая текущая граница интервала изоляции корня
!------------------------
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)
! обменяться данными между текстовыми и расчетными переменными
read(text_a, "(f5.2)") a
read(text_b, "(f5.2)") b
read(text_eps, *) eps
!*** расчет корня методом половинного деления
L=a ! начальное значение левой текущей границы интервала
R=b ! начальное значение правой текущей границы интервала
do while(abs(R-L)>eps) ! проверка на завершение поиска корня
C=(R+L)/2 ! расчет середины интервала
iter=iter+1 ! суммируем число итераций
if(F(L)*F(C)>=0)then ! проверка знака функции в С
L=C ! смещение левой границы интервала в С
else
R=C ! смещение правой границы интервала в С
endif
enddo
kor=(R+L)/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 Lab14_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 Lab14_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 kor ! искомый корень уравнения
integer iter ! число итераций поиска корня
!--- строки для обмена с текстовыми окнами
character(5)::text_a='',text_b='',text_iter=''
character(8)::text_eps=''
character(12)::text_kor=''
end module
Окно приложения с результатами расчета.
Работа в MathCad.
Работа в Excel.
Выводы:
освоены навыки приближенного нахождения корней алгебраических трансцендентных уравнений методом половинного деления в различных средах программирования;
изучены приемы реализации вычислительного процесса с помощью приложения Windows диалогового типа в среде Fortran.
