Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




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

Вычисление интеграла функции

    В качестве первого примера рассмотрим приближенное вычисление интеграла от функции Sin(x) методом Симпсона по трем точкам на отрезке от p/3 до 3p/4. Интеграл вычисляется по следующей формуле:

 

,

 

где a и b – границы отрезка (в данном случае a = p/3, b = 3p/4), h – шаг (расстояние между узлами интегрирования: h = (b – a) / 2 = 5p/24. Для вычисления интеграла сначала нужно составить таблицу значений функции Sin(x) для точек a, b и (a + 2) / 2:

Sin(p/3) 0, 866025403784438646763723170752936
Sin(13p/24) 0, 991444861373810411144557526928563
Sin(3p/4) 0, 707106781186547524400844362104849

 

Эти значения используются в программе для вычисления значения интеграла. Результат вычисления значения интеграла заносится в регистр ST(0). Далее представлен текст программы:

CODE SEGMENT                    ; сегмент команд

   ASSUME CS: CODE, DS: DATA, SS: STAC

Start: MOV AX, DATA  ; настройка DS

   MOV DS, AX          ; на сегмент данных

   FINIT            ; инициализация сопроцессора

   FLD n4                     ; загрузка в стек числа 4. 0

   FMUL Sin[8]      ; умножение на значение функции в точке (a + b) / 2

 

   FADD Sin[0]                ; прибавление значения функции в точке a

 

   FADD Sin[16]    ; прибавление значения функции в точке b

 

   FDIV n3              ; деление на число 3. 0

   FLD B                          ; вычисление

   FSUB A                   ; значения

   FDIV n2              ; шага h

   FMUL ST, ST(1)    ; умножение шага на полученное значение

   MOV AX, 4C00H    ; функция завершения программы

   INT 21H             ; вызов DOS

CODE ENDS

DATA SEGMENT                    ; сегмент данных

; определение границ отрезка интегрирования

   A DQ 1. 04719755119659774615421446109317

   B DQ 2. 35619449019234492884698253745963

; определение промежуточных чисел

   n2 DD 2. 0

   n3 DD 3. 0

   n4 DD 4. 0

; определение таблицы значений функции Sin

   Sin DQ 0. 866025403784438646763723170752936

       DQ 0. 991444861373810411144557526928563

       DQ 0. 707106781186547524400844362104849

DATA ENDS

STAC SEGMENT PARA STACK; сегмент стека

   DB 128 DUP (? )           ; область памяти под стек

STAC ENDS

END Start                   ; точка входа

Для обращения к элементам таблицы значений функции используются смещения 8 (для второго элемента) и 16 (для третьего элемента), поскольку размер элемента таблицы – 8 байт.

 

 Вычисление суммы степенного ряда

    В качестве второго примера будет рассмотрена программа вычисления суммы степенного ряда для функции ex.

    Степенной ряд для функции ex записывается в виде:

 

 

    При вычислении значения функции ex будет использоваться машинная точность, т. е. максимально возможная точность для выбранного формата представления действительных чисел. В примере используется формат с расширенной точностью. Переменная X содержится в сегменте данных программы и имеет двойную точность (8 байт). Программа завершает работу, когда достигнут машинный нуль, т. е. когда при добавлении очередного слагаемого к сумме степенного ряда значение этой суммы не изменяется. В этом случае вычисленное значение функции имеет машинную точность. Далее представлен текст программы.

CODE SEGMENT                    ; сегмент команд

   ASSUME CS: CODE, DS: DATA, SS: STAC

Start: MOV AX, DATA  ; настройка DS

   MOV DS, AX          ; на сегмент данных

   FINIT            ; инициализация сопроцессора

   FLD1             ; загрузка 1. 0 в стек

   FLD1             ; ---//---

   FLD1             ; ---//---

   FLD1             ; ---//---

   FLD X                     ; загрузка переменной X в стек

M1: FADD ST(1), ST      ; добавление к сумме ряда очередного слагаемого

   FXCH ST(2)                 ; обмен ST(0) и ST(2)

   FCOM                 ; сравнение значений предыдущей и текущей суммы

   FSTSW SW    ; загрузка регистра состояния в переменную SW

      AND SW, 4500H; наложение маски

   CMP SW, 4000H; проверка на установку флага C3

   JE M2        ; переход, если достигнут машинный нуль

   FXCH ST(2)             ; обмен ST(0) и ST(2)

   FADD ST(2), ST; получение предыдущей суммы ряда

   FMUL X         ; умножение предыдущего слагаемого на X

   FXCH ST(3)             ; обмен ST(0) и ST(3)

   FLD1              ; загрузка 1. 0 в стек

   FADDP ST(1), ST    ; увеличение аргумента факториала

   FXCH ST(3)             ; обмен ST(0) и ST(3)

   FDIV ST, ST(3); деление предыдущего слагаемого на арг. факториала

   JMP M1                   ; следующая итерация вычислений

M2: MOV AX, 4C00H ; функция завершения программы

   INT 21H         ; вызов DOS

CODE ENDS

DATA SEGMENT ; сегмент данных

   X DQ 1. 0        ; аргумент функции ex

   SW DW?         ; переменная для хранения регистра состояния

DATA ENDS

STAC SEGMENT PARA STACK; сегмент стека

   DB 128 DUP (? ); область памяти под стек

STAC ENDS

END Start                   ; точка входа

 

Значение следующего слагаемого вычисляется из значения предыдущего слагаемого следующим образом. Предыдущее слагаемое умножается на значение переменной X и делится на аргумент факториала для последующего слагаемого. Аргумент факториала для последующего слагаемого вычисляется путем добавления единицы к аргументу факториала предыдущего слагаемого. После вычисления значения очередного слагаемого оно добавляется к результату. Затем сравниваются значения предыдущего и текущего значений суммы ряда. Если они равны, значит достигнут машинный нуль и программа завершает работу, при этом результат находится в регистре ST(0). Если они не равны, то вычисления продолжаются дальше. В качестве начального слагаемого в стек заносится две единицы – для предыдущего и текущего значений суммы ряда. Еще две единицы заносятся в стек для начального аргумента факториала и для значения, на которое увеличивается аргумент факториала. Для получения значений флагов условий используется команда FSTSW и маска 4500H, выделяющая значения необходимых бит. При равенстве сравниваемых операндов флаг C3 должен быть установлен, а флаги C2 и C0 – сброшены. Это соответствует значению 4000H после наложения маски на значение регистра состояния сопроцессора.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...