Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КУРСОВАЯ НАГЕЛЬ.doc
Скачиваний:
5
Добавлен:
18.04.2019
Размер:
384 Кб
Скачать

Программа численного интегрирования дифференциального уравнения

Листинг программы:

;РЕШЕНИЕ ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ МЕТОДОМ РУНГЕ КУТТА 3-ГО ПОРЯДКА

.486

.model flat, stdcall

option casemap :none ; case sensitive

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

include \masm32\include\windows.inc

include \masm32\include\user32.inc

include \masm32\include\kernel32.inc

include \masm32\macros\macros.asm

include \masm32\include\Fpu.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\Fpu.lib

.data

X db "1",0 ;минимальное начальное значение

H db "0.05",0 ;длина подинтервала

Y db "2.718281828459045",0 ;начальное условие для y

;ВЕЩЕСТВЕННАЯ ЗАПИСЬ ДАННЫХ

x dt 0 ;минимальное начальное значение

h dt 0 ;длина подинтервала

y dt 0 ;начальное условие для y

ph dt 0 ;половина длины подинтервала

kvx dt 0 ;x^2

xe dt 0 ;e^x

part dt 0 ;(x^2+1)*e^x

wow dt 0 ;(x^2+1)*e^x+x*y

a dt 0 ;((x^2+1)*e^x+x*y)/x

xb dt 0 ;x+h/2

by dt 0 ;y+a*h/2

b dt 0 ;((x^2+1)*e^x+x*y)/x=b при x=x+h/2, y=y+a*h/2

xc dt 0 ;x+h=xc

cy dt 0 ;y+b*h=cy

rezc dt 0 ;((x^2+1)*e^x+x*y)/x при x=x+h, y=y+b*h

f dt 0 ;(a+b+c)/6=f

I dt 0 ;увеличиваем на единицу для определения количества выполненных итераций

so dt 0 ;x^2/2

mom dt 0 ;ln|x|+x^2/2

golf dt 0 ;e^x*(ln|x|+x^2/2)

sun dt 0 ;e^x/2

exact dt 0 ;e^x*(ln|x|+x^2/2)+e^x/2

mistake dt 0 ;погрешность

u dt 0

;ВЫДЕЛЯЕМ МЕСТО ДЛЯ РЕЗУЛЬТАТА

result db 32 dup(0)

res_title db "Значение X=",0

result1 db 32 dup(0)

res_title1 db "Результат расчета искомой функции, Y=",0

result2 db 32 dup(0)

res_title2 db "Точное значение функции",0

result3 db 32 dup(0)

res_title3 db "Ошибка результата численного интегрирования",0

result4 db 32 dup(0)

res_title4 db "шаг интегрирования",0

.code

start:

;ПРЕОБРАЗОВЫВАЕМ СТРОКУ В ВЕЩЕСТВЕННОЕ

invoke FpuAtoFL, ADDR X, ADDR x, DEST_MEM

invoke FpuAtoFL, ADDR Y, ADDR y, DEST_MEM

invoke FpuAtoFL, ADDR H, ADDR h, DEST_MEM

;ДЕЛИМ ДЛИНУ ПОДИНТЕРВАЛА ПОПОЛАМ

invoke FpuDiv, ADDR h, 2, ADDR ph, SRC1_REAL or SRC2_DIMM or DEST_MEM

;ОТКРЫВАЕМ ЦИКЛ

mov eax, CMP_LOWER

.while eax==CMP_LOWER || eax==CMP_EQU

invoke FpuAdd, ADDR I, 1, ADDR I, SRC1_REAL OR SRC2_DIMM OR DEST_MEM ;инкремент

;Y ТОЧНОЕ

invoke FpuMul, ADDR x, ADDR x, 0, SRC1_REAL or SRC2_REAL or DEST_FPU ;x^2

invoke FpuDiv, 0, 2, ADDR so, SRC1_FPU or SRC2_DIMM or DEST_MEM ;x^2/2=so

invoke FpuAbs, ADDR x, 0, SRC1_REAL or DEST_FPU ;|x|

invoke FpuLnx, 0, 0, SRC1_FPU or DEST_FPU ;ln|x|

invoke FpuAdd, 0, ADDR so, ADDR mom, SRC1_FPU or SRC2_REAL or DEST_MEM ;ln|x|+x^2/2=mom

invoke FpuEexpX, ADDR x, 0, SRC1_REAL or DEST_FPU ;e^x

invoke FpuMul, 0, ADDR mom, ADDR golf, SRC1_FPU or SRC2_REAL or DEST_MEM ;e^x*(ln|x|+x^2/2)=golf

invoke FpuEexpX, ADDR x, 0, SRC1_REAL or DEST_FPU ;e^x

invoke FpuDiv, 0, 2, ADDR sun, SRC1_FPU or SRC2_DIMM or DEST_MEM ;e^x/2=sun

invoke FpuAdd, ADDR golf, ADDR sun, ADDR exact, SRC1_REAL or SRC2_REAL or DEST_MEM ;e^x*(ln|x|+x^2/2)+e^x/2=exact

;ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ КОЭФФИЦИЕНТОВ

;A

invoke FpuEexpX, ADDR x, ADDR xe, SRC1_REAL or DEST_MEM ;e^x=xe

invoke FpuMul, ADDR x, ADDR x, ADDR kvx, SRC1_REAL or SRC2_REAL or DEST_MEM ;x^2=kvx

invoke FpuAdd, ADDR kvx, 1, 0, SRC1_REAL or SRC2_DIMM or DEST_FPU ;x^2+1

invoke FpuMul, 0, ADDR xe, ADDR part, SRC1_FPU or SRC2_REAL or DEST_MEM ;(x^2+1)*e^x=part

invoke FpuMul, ADDR x, ADDR y, 0, SRC1_REAL or SRC2_REAL or DEST_FPU ;x*y

invoke FpuAdd, ADDR part, 0, ADDR wow, SRC1_REAL or SRC2_FPU or DEST_MEM ;(x^2+1)*e^x+x*y=wow

invoke FpuDiv, ADDR wow, ADDR x, ADDR a, SRC1_REAL or SRC2_REAL or DEST_MEM ;((x^2+1)*e^x+x*y)/x=a

;B

invoke FpuAdd, ADDR x, ADDR ph, ADDR xb, SRC1_REAL or SRC2_REAL or DEST_MEM ;x+h/2

invoke FpuMul, ADDR a, ADDR ph, 0, SRC1_REAL or SRC2_REAL or DEST_FPU ;a*h/2

invoke FpuAdd, ADDR y, 0, ADDR by, SRC1_REAL or SRC2_FPU or DEST_MEM ;y+a*h/2

invoke FpuEexpX, ADDR xb, ADDR xe, SRC1_REAL or DEST_MEM ;e^x=xe

invoke FpuMul, ADDR xb, ADDR xb, ADDR kvx, SRC1_REAL or SRC2_REAL or DEST_MEM ;x^2=kvx

invoke FpuAdd, ADDR kvx, 1, 0, SRC1_REAL or SRC2_DIMM or DEST_FPU ;x^2+1

invoke FpuMul, 0, ADDR xe, ADDR part, SRC1_FPU or SRC2_REAL or DEST_MEM ;(x^2+1)*e^x=part

invoke FpuMul, ADDR xb, ADDR by, 0, SRC1_REAL or SRC2_REAL or DEST_FPU ;x*y

invoke FpuAdd, ADDR part, 0, ADDR wow, SRC1_REAL or SRC2_FPU or DEST_MEM ;(x^2+1)*e^x+x*y=wow

invoke FpuDiv, ADDR wow, ADDR xb, ADDR b, SRC1_REAL or SRC2_REAL or DEST_MEM ;((x^2+1)*e^x+x*y)/x=b

;invoke FpuSub, ADDR x, ADDR ph, ADDR x, SRC1_REAL or SRC2_REAL or DEST_MEM

;C

invoke FpuAdd, ADDR x, ADDR h, ADDR xc, SRC1_REAL or SRC2_REAL or DEST_MEM ;x+h=xc

invoke FpuMul, ADDR b, ADDR h, 0, SRC1_REAL or SRC2_REAL or DEST_FPU ;b*h

invoke FpuAdd, ADDR y, 0, ADDR cy, SRC1_REAL or SRC2_FPU or DEST_MEM ;y+b*h=cy

invoke FpuEexpX, ADDR xc, ADDR xe, SRC1_REAL or DEST_MEM ;e^x=xe

invoke FpuMul, ADDR xc, ADDR xc, ADDR kvx, SRC1_REAL or SRC2_REAL or DEST_MEM ;x^2=kvx

invoke FpuAdd, ADDR kvx, 1, 0, SRC1_REAL or SRC2_DIMM or DEST_FPU ;x^2+1

invoke FpuMul, 0, ADDR xe, ADDR part, SRC1_FPU or SRC2_REAL or DEST_MEM ;(x^2+1)*e^x=part

invoke FpuMul, ADDR xc, ADDR cy, 0, SRC1_REAL or SRC2_REAL or DEST_FPU ;x*y

invoke FpuAdd, ADDR part, 0, ADDR wow, SRC1_REAL or SRC2_FPU or DEST_MEM ;(x^2+1)*e^x+x*y=wow

invoke FpuDiv, ADDR wow, ADDR xc, ADDR rezc, SRC1_REAL or SRC2_REAL or DEST_MEM ;((x^2+1)*e^x+x*y)/x=c

;invoke FpuSub, ADDR x, ADDR h, ADDR x, SRC1_REAL or SRC2_REAL or DEST_MEM

;F

invoke FpuAdd, ADDR a, ADDR b, 0, SRC1_REAL or SRC2_REAL or DEST_FPU ;a+b

invoke FpuAdd, 0, ADDR rezc, 0, SRC1_FPU or SRC2_REAL or DEST_FPU ;a+b+c

invoke FpuDiv, 0, 6, ADDR f, SRC1_FPU or SRC2_DIMM or DEST_MEM ;(a+b+c)/6=f

invoke FpuSub, ADDR u, ADDR u, ADDR u, SRC1_REAL or SRC2_REAL or DEST_MEM

invoke FpuAdd, ADDR u , ADDR exact, ADDR u, SRC1_REAL or SRC2_REAL or DEST_MEM

;ПРИСВАЕВАЕМ

;Y

invoke FpuMul, ADDR f, ADDR h, 0, SRC1_REAL or SRC2_REAL or DEST_FPU ;f*h

invoke FpuAdd, 0, ADDR u, ADDR u, SRC1_FPU or SRC2_REAL or DEST_MEM ;y=y+f*h

;ПОГРЕШНОСТЬ

invoke FpuSub, ADDR exact, ADDR u, ADDR mistake, SRC1_REAL OR SRC2_REAL OR DEST_MEM

invoke FpuAbs, ADDR mistake, ADDR mistake, SRC1_REAL OR DEST_MEM

;ВЫВОД РЕЗУЛЬТАТОВ НА ЭКРАН

invoke FpuFLtoA, ADDR x, 3, ADDR result, SRC1_REAL or SRC2_DIMM

invoke MessageBox, 0, ADDR result, ADDR res_title,0

invoke FpuFLtoA, ADDR exact, 6, ADDR result1, SRC1_REAL or SRC2_DIMM

invoke MessageBox, 0, ADDR result1, ADDR res_title1,0

invoke FpuFLtoA, ADDR u, 6, ADDR result2, SRC1_REAL or SRC2_DIMM

invoke MessageBox, 0, ADDR result2, ADDR res_title2,0

invoke FpuFLtoA, ADDR mistake, 6, ADDR result3, SRC1_REAL or SRC2_DIMM

invoke MessageBox, 0, ADDR result3, ADDR res_title3,0

invoke FpuFLtoA, ADDR I, 0, ADDR result4, SRC1_REAL or SRC2_DIMM

invoke MessageBox, 0, ADDR result4, ADDR res_title4,0

;X

invoke FpuAdd, ADDR x, ADDR h, ADDR x, SRC1_REAL or SRC2_REAL or DEST_MEM ;x=x+h

invoke FpuComp, ADDR x, 2, SRC1_REAL or SRC2_DIMM

.endw

exit

end start