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

МГТУГА

кафедра ОРТиЗИ

( полное наименование кафедры)

УТВЕРЖДАЮ

Начальник кафедры

полковник Н. Сахаров

« » 2010 г.

кандидат технических наук Антонов А.А.

(ученая степень, ученое звание, фамилия и инициалы автора)

дисциплина:

Средства и методы программирования

курсовая работа

Тема № 3 Алгоритмизация и программирование

(номер и полное наименование темы)

ТЕМА: Решение прикладных задач численными методами

Обсуждено на заседании кафедры

Выполнила:

Нагель Кристина

БИ 3-2(1)

г. Москва

Первая часть расчётно–графической работы

Цель 1-й части расчётно–графической работы:

Получить практические навыки в использовании численных методов решения нелинейных уравнений, используемых в прикладных задачах.

Для выполнения части 1 работы необходимо:

  • составить программу и рассчитать значения функции в левой части нелинейного уравнения для решения задачи отделения корней,

  • составить логическую схему алгоритма, таблицу идентификаторов и программу нахождения корня уравнения методом дихотомии,

  • ввести программу в компьютер, отладить, решить задачу с точностью ε=0,0001 и вывести результат,

  • предусмотреть в программе вывод на экран дисплея процесса получения корня.

Математическое описание численных методов нахождения корня нелинейного уравнения:

Решение методом дихотомии заключается в следующем:

Первая итерация

  1. Делим интервал пополам и находим первое приближение к корню .

  2. Анализируем: если , то корень найден и дальнейшие итерации прекращаем. Если , то переходим к следующим действиям.

  3. Из двух половин интервала , как то и выбираем тот, где есть корень, а другую половину отбрасываем.

Алгоритм выбора:

Анализируем знак произведения

а) Если , то корень находится в этой половине, т.е. Тогда мы обозначаем новые концы подинтервала:

Рис.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