- •Математическое описание численных методов нахождения корня нелинейного уравнения:
- •Первая итерация
- •Вторая итерация
- •Нелинейное уравнение и условия его решения, заданные в варианте
- •График функции, заданной левой частью уравнения, для отделения корней
- •Схемы алгоритма нахождения корня заданным методом:
- •Программа, реализующая метод дихотомии:
- •Значение корня, полученные в результате расчётов, и потребное количество итераций для получения корня с заданной точностью:
- •Анализ результатов и вывод:
- •Вторая часть расчетно-графической работы:
- •Математическое описание численного метода решения дифференциального уравнения методом, заданным в варианте:
- •Т.О., для первого шага
- •Дифференциальное уравнение, начальные условия и набор шагов интегрирования, указанные в варианте:
- •Программа численного интегрирования дифференциального уравнения
- •Результат выполнения программы:
- •График ошибок Δу(х) результатов численного интегрирования при различных шагах интегрирования
МГТУГА
кафедра ОРТиЗИ
( полное наименование кафедры)
УТВЕРЖДАЮ
Начальник кафедры
полковник Н. Сахаров
« » 2010 г.
кандидат технических наук Антонов А.А.
(ученая степень, ученое звание, фамилия и инициалы автора)
дисциплина:
Средства и методы программирования
курсовая работа
Тема № 3 Алгоритмизация и программирование
(номер и полное наименование темы)
ТЕМА: Решение прикладных задач численными методами
Обсуждено на заседании кафедры
Выполнила:
Нагель Кристина
БИ 3-2(1)
г. Москва
Первая часть расчётно–графической работы
Цель 1-й части расчётно–графической работы:
Получить практические навыки в использовании численных методов решения нелинейных уравнений, используемых в прикладных задачах.
Для выполнения части 1 работы необходимо:
составить программу и рассчитать значения функции в левой части нелинейного уравнения для решения задачи отделения корней,
составить логическую схему алгоритма, таблицу идентификаторов и программу нахождения корня уравнения методом дихотомии,
ввести программу в компьютер, отладить, решить задачу с точностью ε=0,0001 и вывести результат,
предусмотреть в программе вывод на экран дисплея процесса получения корня.
Математическое описание численных методов нахождения корня нелинейного уравнения:
Решение методом дихотомии заключается в следующем:
Первая итерация
Делим интервал пополам и находим первое приближение к корню .
Анализируем: если , то корень найден и дальнейшие итерации прекращаем. Если , то переходим к следующим действиям.
Из двух половин интервала , как то и выбираем тот, где есть корень, а другую половину отбрасываем.
Алгоритм выбора:
Анализируем знак произведения
а) Если , то корень находится в этой половине, т.е. Тогда мы обозначаем новые концы подинтервала:
Рис.1.
б) Если , то это означает, что корень лежит в другой
половине интервала, т.е.,
В этом случае обозначаем новые концы подинтервала
,
.
Вторая итерация
Находим второе приближение к корню .
Далее повторяем анализ: если
Иначе - если «да», то
если «да», то
Далее аналогично повторяются описания действия для всех последующих итераций.
Для n – ой итерации
Далее повторяем анализ: если ,
Иначе - , если «да», то
если «да», то
Условие прекращения итераций
Нелинейное уравнение и условия его решения, заданные в варианте
Вариант задания:
12. |
|
[0; 1] |
График функции, заданной левой частью уравнения, для отделения корней
График функции X^2
График функции TAN(0.55*X+0.1)
Схемы алгоритма нахождения корня заданным методом:
Программа, реализующая метод дихотомии:
Листинг программы:
;ПРОГРАММА НАХОЖДЕНИЯ КОРНЯ УРАВНЕНИЯ МЕТОДОМ ДИХОТОМИИ ВАРИАНТ 12
.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
e db "0.0001" , 0 ;точность
a0 db "0" , 0 ;начальная точка отрезка
b0 db "1" , 0 ;конечная точка отрезка
k db "0.55" , 0 ;значение для вычисления уравнения
m db "0.1" , 0 ;значение для вычисления уравнения
re db "0.6" , 0 ;n-ый член последовательности
;ВЕЩЕСТВЕННАЯ ЗАПИСЬ ДАННЫХ
ee dt 0 ;точность
aa0 dt 0 ;начальная точка отрезка
bb0 dt 0 ;конечная точка отрезка
x dt 0 ;значение корня
kk dt 0 ;значение для вычисления уравнения
M dt 0 ;значение для вычисления уравнения
p dt 0 ;tg(0.55x+0.1)
kv dt 0 ;x^2
fx dt 0 ;результат уравнения при х
fa dt 0 ;результат уравнения при a
ap dt 0 ;tg(0.55a+0.1)
akv dt 0 ;a^2
z dt 0 ;f(a)*f(x)
xn dt 0 ;n-ый член последовательности
gr dt 0 ;abs(x-xn)-e
I dt 0 ;увеличиваем на единицу для определения количества выполненных итераций
aa dt 0 ;плавающая начальная точка отрезка
bb dt 0 ;плавающая конечная точка отрезка
result1 db 32 dup(0)
res_title1 db "корень уравнения",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 "Итерационный процесс завершён на шаге I=",0
.code
start:
;ПРЕОБРАЗОВЫВАЕМ СТРОКУ В ВЕЩЕСТВЕННОЕ
invoke FpuAtoFL, ADDR a0, ADDR aa0, DEST_MEM
invoke FpuAtoFL, ADDR e, ADDR ee, DEST_MEM
invoke FpuAtoFL, ADDR b0, ADDR bb0, DEST_MEM
invoke FpuAtoFL, ADDR k, ADDR kk, DEST_MEM
invoke FpuAtoFL, ADDR m, ADDR M, DEST_MEM
invoke FpuAtoFL, ADDR re, ADDR xn, DEST_MEM
invoke FpuAdd, ADDR aa0, 0, ADDR aa, SRC1_REAL OR SRC2_DIMM OR DEST_MEM ;a0->a
invoke FpuAdd, ADDR bb0, 0, ADDR bb, SRC1_REAL OR SRC2_DIMM OR DEST_MEM ;b0->b
;открываем цикл. Вычисляем корень уравнения, используя метод Дихотомии
mov eax,CMP_GREATER
.while eax==CMP_GREATER
invoke FpuAdd, ADDR x, 0, ADDR xn, SRC1_REAL OR SRC2_DIMM OR DEST_MEM ;X->XN
invoke FpuAdd, ADDR I, 1, ADDR I, SRC1_REAL OR SRC2_DIMM OR DEST_MEM ;инкремент
;ВЫЧИСЛЕНИЕ СЕРЕДИНЫ ОТРЕЗКА
invoke FpuAdd, ADDR aa, ADDR bb, 0, SRC1_REAL or SRC2_REAL or DEST_FPU
invoke FpuDiv, 0, 2, ADDR x, SRC1_FPU or SRC2_DIMM or DEST_MEM ;x=(a+b)/2
;ВЫЧИСЛЯЕМ ЗНАЧЕНИЕ ФУНКЦИИ ПРИ X f(x)
invoke FpuMul, ADDR kk, ADDR x, 0, SRC1_REAL or SRC2_REAL or DEST_FPU
invoke FpuAdd, 0, ADDR M, 0, SRC1_FPU or SRC2_REAL or DEST_FPU
invoke FpuTan, 0, ADDR p, SRC1_FPU or DEST_MEM
invoke FpuMul, ADDR x, ADDR x, ADDR kv, SRC1_REAL or SRC2_REAL or DEST_MEM
invoke FpuSub, ADDR p, ADDR kv, ADDR fx, SRC1_REAL or SRC2_REAL or DEST_MEM
invoke FpuComp, ADDR fx, 0, SRC1_REAL or SRC2_DIMM
.if eax==CMP_EQU ; f(x)=0
jmp metka ;перемещаемся на метку для вывода результата и выхода из программы
.else
;ВЫЧИСЛЯЕМ ЗНАЧЕНИЕ ФУНКЦИИ ПРИ X=A f(a)
invoke FpuMul, ADDR kk, ADDR aa, 0, SRC1_REAL or SRC2_REAL or DEST_FPU
invoke FpuAdd, 0, ADDR M, 0, SRC1_FPU or SRC2_REAL or DEST_FPU
invoke FpuTan, 0, ADDR ap, SRC1_FPU or DEST_MEM
invoke FpuMul, ADDR aa, ADDR aa, ADDR akv, SRC1_REAL or SRC2_REAL or DEST_MEM
invoke FpuSub, ADDR ap, ADDR akv, ADDR fa, SRC1_REAL or SRC2_REAL or DEST_MEM
;f(a)*f(x)
invoke FpuMul, ADDR fa, ADDR fx, ADDR z, SRC1_REAL or SRC2_REAL or DEST_MEM
;ПРОВЕРКА УСЛОВИЯ Z>0 ИЛИ Z<0
invoke FpuComp, ADDR z, 0, SRC1_REAL or SRC2_DIMM
.if eax==CMP_GREATER ;z<0
invoke FpuAdd, ADDR x, 0, ADDR aa, SRC1_REAL or SRC2_DIMM or DEST_MEM ;a=x
.else
invoke FpuAdd, ADDR x, 0, ADDR bb, SRC1_REAL or SRC2_DIMM or DEST_MEM ;b=x
.endif
;УСЛОВИЕ ПРЕКРАЩЕНИЯ ИТЕРАЦИЙ
invoke FpuSub, ADDR x, ADDR xn, 0, SRC1_REAL or SRC2_REAL or DEST_FPU
invoke FpuAbs, 0, 0, SRC1_FPU or DEST_FPU
invoke FpuSub, 0, ADDR ee, ADDR gr, SRC1_FPU or SRC2_REAL or DEST_MEM
.endif
invoke FpuComp, ADDR gr, 0, SRC1_REAL or SRC2_DIMM
.endw
;МЕТКА
metka:
invoke FpuFLtoA, ADDR x, 8, ADDR result1, SRC1_REAL or SRC2_DIMM
invoke MessageBox, 0, ADDR result1, ADDR res_title1,0
invoke FpuFLtoA, ADDR fx, 8, ADDR result2, SRC1_REAL or SRC2_DIMM
invoke MessageBox, 0, ADDR result2, ADDR res_title2,0
invoke FpuFLtoA, ADDR ee, 8, 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
exit
end start