- •Математическое описание численных методов нахождения корня нелинейного уравнения:
- •Первая итерация
- •Вторая итерация
- •Нелинейное уравнение и условия его решения, заданные в варианте
- •График функции, заданной левой частью уравнения, для отделения корней
- •Схемы алгоритма нахождения корня заданным методом:
- •Программа, реализующая метод дихотомии:
- •Значение корня, полученные в результате расчётов, и потребное количество итераций для получения корня с заданной точностью:
- •Анализ результатов и вывод:
- •Вторая часть расчетно-графической работы:
- •Математическое описание численного метода решения дифференциального уравнения методом, заданным в варианте:
- •Т.О., для первого шага
- •Дифференциальное уравнение, начальные условия и набор шагов интегрирования, указанные в варианте:
- •Программа численного интегрирования дифференциального уравнения
- •Результат выполнения программы:
- •График ошибок Δу(х) результатов численного интегрирования при различных шагах интегрирования
Программа численного интегрирования дифференциального уравнения
Листинг программы:
;РЕШЕНИЕ ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ МЕТОДОМ РУНГЕ КУТТА 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