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

Варианты исходных данных

№ варианта

Определенный интеграл

№ варианта

Определенный интеграл

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

ПРИМЕР ОФОРМЛЕНИЯ ОТЧЕТА

Лабораторная работа № 15-3

ОПРЕДЕЛЕНИЕ КОРНЕЙ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ

КОМБИНИРОВАННЫМ МЕТОДОМ

Выполнил

ст. 211 гр.

Иванов А.П.

Проверил

доцент каф. 304

Скоб Ю.А.

Цель работы – освоить навыки приближенного нахождения корней алгебраических трансцендентных уравнений комбинированным методом в различных средах программирования.

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

  1. Используя комбинированный метод, вычислить с заданной точностью ( ) действительные корни заданного алгебраического уравнения .

  2. Решить задачу в различных средах: Fortrani, ms Excel и MathCad.

Вариант №1

Вычислить корни уравнения с точностью =10-5 на предварительно найденном интервале изоляции [a, b].

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

  1. Текст файла Lab15_V1.f90:

! Lab15_V1.f90

! FUNCTIONS:

! WinMain() - Entry point for the application

! displays the main window processes the message loop

! Lab15_V1Sub() - Callback routine for the main dialog box

! Lab15_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 Lab15_V1Globals

implicit none

integer*4 hInstance

integer*4 hPrevInstance

integer*4 lpszCmdLine

integer*4 nCmdShow

include 'resource.fd'

external Lab15_V1Sub

external Lab15_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_LAB15_V1_DIALOG, gdlg)

if (lret == .FALSE.) goto 99999

lret = DlgSetSub(gdlg, IDD_LAB15_V1_DIALOG, Lab15_V1Sub)

lret = DlgSetSub(gdlg, IDM_APPLY, Lab15_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 Lab15_V1"C, &

"Error"C, MB_OK)

WinMain = 0

end

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

! FUNCTION: Lab15_V1Sub ( dlg, id, callbacktype )

! PURPOSE: Dialog box callback for initialization and destroy

! COMMENTS:

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

SUBROUTINE Lab15_V1Sub( dlg, id, callbacktype )

!DEC$ ATTRIBUTES DEFAULT :: Lab15_V1Sub

use user32

use dflogm

implicit none

type (dialog) dlg

integer id, callbacktype

if (callbacktype == dlg_destroy) then

call PostQuitMessage(0)

endif

END SUBROUTINE Lab15_V1Sub

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

! FUNCTION: Lab15_V1Apply ( dlg, id, callbacktype )

! PURPOSE: Dialog box callback for APPLY button

! COMMENTS:

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

SUBROUTINE Lab15_V1Apply( dlg, id, callbacktype )

!DEC$ ATTRIBUTES DEFAULT :: Lab15_V1Apply

use dflogm ! получаем доступ к диалоговым процедурам

use Lab15_V1Globals ! подключаем глобальные переменные

implicit none ! обязательное обявление имен

include 'resource.fd' ! получаем доступ к ресурсным данным

type (dialog) dlg ! производный тип для диалога

integer id ! имя элемента управления, пославшего сообщение

integer callbacktype ! показывает тип сообщения Windows

logical*4 lret ! результат диалоговой функции

real & ! локальные переменные, необходимые для расчета корня

buff, & ! буферная переменная

da, & ! изменение границы A

db ! изменение границы B

real F ! заданная функция

real F1 ! первая производная заданной функции

real F11 ! вторая производная заданной функции

!------------------------

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

!*** расчет корня комбинированным методом

if(F(b)*F11(b) < 0)then ! проверка функции на вогнутость/выпуклость

buff=a ! смена местами А и В для выпуклой функции

a=b

b=buff

endif

do while(abs(b-a)>eps) ! проверка на близость к корню границ

da=F(a)*(b-a)/(F(b)-F(a)) ! приближение методом хорд

a=a-da

db=F(b)/F1(b) ! приближение методом касательных

b=b-db

iter=iter+1 ! новое значение числа итераций

enddo

kor=(a+b)/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 Lab15_V1Apply

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

! заданная функция

real function F(x)

real x

F=x**3-2.8*x**2-6.2*x+3.7

end function F

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

! первая производная заданной функции

real function F1(x)

real x

F1=3*x**2-5.6*x-6.2

end function F1

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

! вторая производная заданной функции

real function F11(x)

real x

F11=6*x-5.6

end function F11

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

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

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

! Global data, parameters, and structures

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

module Lab15_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

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

  1. Работа в MathCad.

  1. Работа в Excel.

  1. Выводы:

  • освоены навыки приближенного нахождения корней алгебраических трансцендентных уравнений комбинированным методом в различных средах программирования;

  • изучены приемы реализации вычислительного процесса с помощью приложения Windows диалогового типа в среде Fortran.