Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1_Погрешности_2.doc
Скачиваний:
362
Добавлен:
12.02.2015
Размер:
561.15 Кб
Скачать

1.4. Погрешность произвольной функции

Пусть задана произвольная функция u = f(xl, x2,..., xn), где xl, x2, ... , xn — приближенные величины, а Δxl, Δx2 , …, Δxn —их известные предельные абсолютные погрешности. Тогда предельная абсолютная погрешность результата — функции u — для малых Δxi. вычисляется по формуле

(1.17)

Как видно из формулы (1.17), для ее применения требуется, чтобы функция f(xl, x2,..., xn) была дифференцируемой по всем переменным.

Пример 1.17. Вычислить функцию u = 2 sin(3x + 4у),

если х = π/24±0.002 и y = π/32±0.005. Найти предельные абсолютную и относительную погрешности результата и определить число верных значащих цифр.

Решение.

Применяя формулу (1.17), имеем

Для функции u находим u = 21/2 = 1.414214. Учитывая предельную абсолютную погрешность Δu = 0.04, получаем результат, который имеет две верных значащих цифры в узком смысле. Ответ можно записать в виде u = 1.4 ± 0.04.

1.5. Представление чисел в компьютере и погрешность

Так как для записи числа в компьютере выделяется ограниченная область памяти, то числовые значения ограничены. Границы значений зависят от типа числа и конкретной среды программирования или математического пакета. В табл. 1.1 представлены диапазоны значений чисел различных типов в языке программирования С.

Таблица 1.1

Если при вычислениях для переменной типа float будет получено число с меньшим порядком, чем -38, оно будет заменено нулем, а если порядок числа превысит 38, то произойдет так называемый «аварийный останов» (система прекратит выполнение программы пользователя) и выведено сообщение о переполнении порядка. Для переменной типа float число с меньшим порядком, чем -38, является нулем, а с большим, чем 38, — бесконечностью.

-Для переменной типа double нулем являются значения с меньшим порядком, чем -308, а бесконечностью — значения с порядком большим, чем 308.

В табл. 1.2 приведены константы для чисел с плавающей точкой стандартной библиотеки языка программирования С.

Таблица 1.2

В программах OpenOffice Calc, Microsoft Excel и Mathcad границы значений числа приблизительно соответствуют типу double языка С. Мантисса может содержать до 15 десятичных цифр. Например, число десятичных знаков числа с плавающей точкой в программе Excel можно найти очень простым способом: записать в ячейку формулу = 1/3 и с помощью команды меню «Формат ячейки» определить формат «числовой с 20 знаками после запятой». Мы увидим, что мантисса числа содержит 15 (значащих) десятичных цифр, остальные цифры равны нулю.

Если в программах Excel и Mathcad вычислить значение 1 + 10-15, то получим 0, а значение выражения 1 + 10-14 будет равно 1.00000000000001. Это число содержит 15 значащих цифр. Предельной относительной погрешностью представления числа с плавающей точкой в программах Excel и Mathcad можно считать 10-14.

Относительная погрешность представления чисел с плавающей точкой («машинное эпсилон») определяется как наименьшее положительное число ε, при сложении которого с единицей получается отличное от единицы число. Это значение зависит от количества знаков, которые можно записать в мантиссе числа.

Для приблизительной оценки значения относительной погрешности представления можно предложить следующий алгоритм:

1) ε = 1;

2) ε = ε /2;

3) если 1 < 1 + ε , то переходим к п. 2, иначе — переходим к п. 4;

4) выводим значение 2ε.

Вычислим по этому алгоритму в программе Excel значение ε. Для этого вводим в ячейке А1 значение 1, в А2 формулу = А1/2, а в В2 — формулу = 1 + А2. Выделим две ячейки А2:В2 и маркером заполнения протянем вниз до строки 50. В столбце В получим результаты сложения с единицей убывающих чисел из столбца А. В табл. 1.3 приведены последние пять строк вычисленных значений. Очевидно, что за предельную относительную погрешность можно принять значение ε = 7,10543 • 10-15, или, если округлить, ε = 10-14, и максимальное число значащих цифр в мантиссе составляет 15.

Таблица 1.3

Создадим в программе Excel макрос — пользовательскую функцию для определения значения ε.

Выполним команду меню «Сервис — Макрос — Редактор Visual Basic»; в открывшемся окне выберем меню «Insert — Module» и введем описание функции:

Function epsilon ()

eps = 1

2 eps = eps/2

If 1 < 1 + eps Then GoTo 2

epsilon = eps*2

End Function

На рис. 1.3 показано окно редактора Visual Basic с введенным текстом программы.

Рис. 1.3

Закроем редактор, перейдем на лист Excel и введем в любой ячейке формулу

= epsilon (), получим значение

ε= 2,22045Е-16 = 0,000 000 000 000 000 222045.

Отличие полученного значения ε = 2.22045Е-16 от ε = = 7,10543 • 10-15 из таблицы 1.2 объясняется особенностями вывода значений в ячейки программы Excel. При выводе числовых значений в ячейки количество значащих цифр равно 15, остальные цифры отбрасываются.

Применим алгоритм вычисления «машинного эпсилон» в системе программирования Mathcad. Однако здесь нас ждут интересные особенности. Введем в Mathcad следующую программу:

Мы видим, что число х = 9.09494701772928 10-13 в неравенстве 1 < х + 1 программа Mathcad принимает за 0, но если мы выполним сложение

1 + 9,09494701772928 • 10-13, то получим 1,00000000000091. Это означает, что в неравенствах в программе Mathcad относительная погрешность составляет 10-12. Интересно, что в программе Excel в неравенствах та же относительная погрешность 10-14 , что и в представлении числа с плавающей точкой. Чтобы проверить это, в любой ячейке листа Excel введем неравенство в виде формулы = 1 + 10^-14>1. Получим значение «ИСТИНА». А если ввести формулу = 1 + 10^-15>1, то «ЛОЖЬ». Обращаем здесь внимание на то, что в выражении 10^-15 не обязательно брать в скобки показатель степени -15.

Вычислим «машинное эпсилон» для языка программирования Borland С++ . Для этого составим следующую программу:

#include <stdio.h>

int main () {

float eps2, eps = 1, x = 1, y;

do{

eps = eps/2; у = x + eps;

} while (x < y);

eps2 = 2 * eps;

printf ("\neps =%e:", eps2);

return 0;

}

В результате выполнения программы получим eps = 1.192093е-07. Это значение совпадает с числом FLT_EPSILON = 1.192093е-07, приведенным в табл. 1.1 (минимально возможное значение переменной типа float, такое, что 1.0 + FLT_EPSILON ≠ 1.0). Если в этой программе мы заменим тип float на тип double, то получим значение eps = 2.220446е-16, которое совпадает с константой DBL_EPSILON.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]