Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_2012 / Лекции / Численные_методы.pdf
Скачиваний:
392
Добавлен:
09.06.2015
Размер:
1.99 Mб
Скачать

14

Глава_1.

Погрешность результата численного решения задачи

В практике численного анализа важно сознавать, что численное решение — это не точное математическое решение. Точность численного решения уменьшается по многим причинам несколькими тонкими способами. Понимание этих трудностей часто может привести профессионала к правильному выполнению и усовершенствованию численного алгоритма.

Определение 1.1. Предположим, что абсолютная погрешность равна Ap =

~

равна Op = p ~ p , p 0 .

p

p

является приближением

p . Тогда

~

 

 

 

 

 

~

 

, а относительная погрешность

 

 

p p

 

Таким образом, абсолютная погрешность — это простая разность между истинным и приближенным значениями, тогда как относительная погрешность — это доля истинного значения.

Пример 1.1. Пусть p =1000000 и ~p = 999996 , тогда абсолютная погрешность

равна

Ap

=

 

~

 

=

 

1000000 999996

 

= 4 , а относительная погрешность равна

 

 

 

 

 

p p

 

 

 

 

 

 

~

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Op =

 

p p

 

=

 

4

 

 

 

= 4.000016 106 .

 

 

 

 

 

 

 

 

 

 

~

 

 

999996

 

 

 

 

p

 

 

 

 

 

 

 

 

Определение 1.2. Значащими цифрами числа называются все цифры в его записи, начиная с первой ненулевой слева. Так, например, у чисел 0.010087 и 0.0100870000 значащие цифра будут, 10087 и 100870000 соответственно.

Любое число можно представить в виде x = a1 β n + a2 β n1 +.... + am β nk +1 , где β

- основание системы счисления, n - некоторое число(старший десятинный разряд числа x ), ai - значащие цифры приближенного числа x .

Определение 1.3. Значащая цифра ak

считается верной, если имеет место

равенство: a ϖβ nk +1 , где 0.5 ϖ 1,

a - абсолютная погрешность.

(Вообще говоря, значащая цифра считается верной, если абсолютная погрешность не превосходит единицы разряда значащей цифры; в более строгом определении – половины единицы разряда).

Например, пусть дано число X = 0.010087, a = 0.0006; Тогда a < 0.001 => 3

верных единичных знака после запятой 0.010087 («жирный ноль» - последняя верная значащая цифра); С другой стороны a > 0.0005 (абсолютная погрешность превосходит половины единицы разряда, третьего после

15

запятой) => 2 верных единичных знака после запятой 0.010087 в более строгом смысле.

Основная задача теории погрешностей заключается в следующем: по известным погрешностям некоторой системы параметров требуется определить погрешность функции этих параметров. Пусть задана дифференцируемая функция y = f (x1 , x2 ,..., xn ) и пусть Axi - абсолютные

погрешности аргументов. Тогда абсолютная погрешность функции имеет следующую оценку:

Ay =

 

y y

 

n

f (x , x ,..., x )

xi

(формула Лагранжа).

 

 

1 2

n

 

 

~

 

 

 

 

 

 

 

 

 

 

 

 

 

i=1

xi

 

 

 

 

 

~

 

~

 

 

 

 

 

 

 

 

 

 

При зависимости функции от одного параметра

Ay

 

 

 

 

 

f '(x )

 

x .

Рассмотрим

теперь

некоторые

задачи,

связанные

с

нахождением

погрешностей.

 

 

 

 

 

 

 

 

 

 

 

 

Задача 1. Определить число верных знаков приближенного числа

x =1.709 ,

если известны абсолютная погрешность

Ax = 0.1 102

и также определить

число верных десятичных знаков приближенного числа

x = 0.07777 , если

известна абсолютная погрешность

Ax = 0.5 103 .

 

 

 

 

 

 

Решение.

Записываем представление числа x =1.709

в десятичной системе

счисления:

x =1 100

+ 7 101 + 0 102 + 9 103 . Отсюда,

n = 0 .

 

 

При

k =1:

0.1 102

ϖ 1001+1

-

верно при

0.5 ϖ 1,

 

 

 

При

k = 2 :

0.1 102

ϖ 101

-

верно при

0.5 ϖ 1,

 

 

 

При

k = 3:

0.1 102

ϖ 102

-

верно при

0.5 ϖ 1,

 

 

 

 

При

k = 4 :

0.1 102

ϖ 103

-

не верно при 0.5 ϖ <1(строго меньше 1),

Заметим, что если ϖ =1 , то число верных знаков

m = 4 .

 

 

 

 

Итак, число верных знаков для данного числа равно

m = 3 .

 

 

Записываем

представление

 

числа

x = 0.07777

в

 

десятичной

системе

счисления:

x = 7 102 + 7 103

+ 7 104

+ 7 105 .

Отсюда, n = −2 .

 

0.5 103 ϖ 102+1m - это неравенство верно при

0.5 ϖ 1, если выполняется:

3 = −2 +1 m , отсюда число верных значащих цифр для

данного числа

равно m = 2 , а число верных десятичных знаков равно 3.

 

 

 

Приведем теперь решение данной задачи в системе Scilab (для числа, по модулю большего единицы, программа выдает количество верных знаков, для числа же, по модулю меньшего единицы – количество верных десятичных знаков):

16

Листинг 1.1.

x = input('Введите приближенное число');

a = input('Введите абсолютную погрешность'); omega = input('введите омегу (от 0.5 до 1)');

// данная функция находит максимальную степень (число n) function[n] = max_degree(number)

if number < 0

number = -number; //работаем только с модулем end

n = 0;

if number < 1

while number < 1 n = n-1;

number = number*10; end

else

while number >= 10 n = n+1;

number = number/10; end

end max_degree = n;

endfunction

function[k_1, k_2] = func_1(a, x) n = max_degree(x);

k_1 = 1.0; // нумерация начинается с единицы (см. определение 1.3)

//используем определение 1.3 while a <= omega*(10^(n-k_1+1))

k_1 = k_1 + 1; end

//не забываем вычесть единицу, т.к. k_1 уже не удовлетворяет определению k_1 = k_1 - 1;

k_2 = k_1; // фиктивная инструкция

if n < 0 // значащие цифры начинаются после запятой k_2 = k_1-n-1;

end

func_1 = [k_1, k_2];

endfunction

[k_1, k_2] = func_1(a, x); if abs(x) >= 1

disp('число верных знаков'); k_1

else

disp('число верных десятичных знаков(после запятой)'); k_2

end

//Пример: x=0.07777, a=0.0005, первые 2 семёрки верные

//значащие цифры, значит 077 - верные десятичные знаки (их три)

17

Рис.1.1. Результат работы Листинга_1.1

Задача 2. Определить абсолютную погрешность числа x =1.7297 , если известно число верных знаков m = 3 .

Решение. Эта задача – обратная к задаче 1. Приведем решение данной задачи в системе Scilab:

Листинг 1.2.

x = input('введите приближенное число'); m = input('введите кол-во верных знаков'); omega = input('введите омегу (от 0.5 до 1)');

//теперь для различных "омег" получаем различную абсолютную погрешность

//Т.о. абсолютная погрешность лежит в некотором диапазоне,

//имеет свой inf и sup

//данная функция находит максимальную степень(число n)

function[n] = max_degree(number) if number < 0

number = -number; //работаем только с модулем

18

end n = 0;

if number < 1

while number < 1 n = n-1;

number = number*10; end

else

while number >= 10 n = n+1;

number = number/10; end

end max_degree = n;

endfunction

n = max_degree(x); if abs(x) < 1

k = m+n+1; // кол-во верных десятичных знаков // не равно кол-ву верных значащих цифр

else

k = m; end

a = omega*10^(n-k+1); disp('абсолютная погрешность = ') disp(a)

Рис.1.2. Результат работы Листинга_1.2

Ax = 0.5 103 , Ay = 0.5 102 .

19

Прежде чем решить еще одну задачу, рассмотрим пример.

Пример 1.2. Найти предельную абсолютную и относительную погрешности

объема шара V =

 

1

 

πd 3 , если d = 3.7 см±0.05 см; π 3.14 .

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рассмотрим

d

 

и

π

 

как

 

 

 

переменные величины.

Вычислим

частные

производные

V

 

=

1

πd 2 ,

 

 

V

=

1

d 3 . При заданных значениях

d и π получаем,

d

 

 

 

 

 

π

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

6

 

 

 

 

 

 

 

 

что

V

=

1

3.14 (3.7)2

 

 

= 21.49,

 

V

 

=

1

(3.7)3 =8.44 . Согласно правилу нахождения

d

 

 

π

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

предельной абсолютной погрешности, имеем:

 

 

 

 

 

 

 

V =

 

V

 

 

 

d

 

 

+

 

V

 

 

 

π

 

= 21.49 0.05 + 8.44 0.0016 =1.101508 1.1 см3 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d

 

π

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1

 

 

 

Поэтому V 26.51 ±1.1 см3 . Относительная погрешность

OV =

0.04 = 4% .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

26.51

 

 

Задача 3.

Определить абсолютную погрешность функции

z =

x

, если

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y +1

 

известны абсолютные погрешности ее аргументов: Решение. Приведем решение данной задачи в системе Scilab:

Листинг 1.3.

a_x = input('введите абсолютную погрешность 1-ого аргумента'); a_y = input('введите абсолютную погрешность 2-ого аргумента');

x= input('введите приближенное значение 1-ого аргумента');

y= input('введите приближенное значение 2-ого аргумента');

// определим функцию

function[Z] = f(X), Z=X(1)/sqrt(X(2)+1), endfunction

X = [x, y];

//находим модули частных производных в точках x, y

//и сохраняем эти значения в массиве X

X = abs(numdiff(f, X));

disp('абсолютная погрешность заданной функции = ') disp(X(1)*a_x + X(2)*a_y);

20

Рис.1.3. Результат работы Листинга_1.3

1

 

Задача 4. Найти сумму ряда

с точностью до ε = 0.0001.

(4n 1)(4n +1)

n=1

 

Решение. Приведем решение данной задачи в системе Scilab:

Листинг 1.4. e = 1e-6; summa = 0.0; prev_sum = 1.0; iter = 100;

//суммирование не эффективно, но точность достигается

//используется ПРАВИЛО РУНГЕ

//разность между более точным(summa) и менее точным(prev_summa) значением while abs(summa - prev_sum) > e

prev_sum = summa; summa = 0;

for n = 1.0:iter

summa = summa + 1/((4*n-1)*(4*n+1)); end

iter = iter*2; end disp(summa);

disp(0.5 - %pi/8);

// Правильный ответ: 0.5 - %pi/8

disp('погрешность = ');

 

disp(abs((0.5 - %pi/8) - summa));

 

21

Рис.1.4. Результат работы Листинга_1.4

Задача 5. Просуммировать бесконечный ряд на примере широко известного разложения:

sin(x) = x

x3

+

x5

−K+

(1)n x 2n+1

+K .

 

 

(2n +1)!

3!

5!

 

 

Решение. Вычислять сумму ряда по приведенной выше формуле вряд ли целесообразно, поскольку при x >1 числитель дроби быстро растет, знаменатель – также быстрорастущая функция, а при делении одного большого числа на другое большое ошибки округления начинают сильно сказываться. К тому же, мы очень быстро придем к переполнению в знаменателе. Поэтому для решения подобной задачи лучше подобрать рекуррентное соотношение, т. е. найти формулу, связывающую очередное слагаемое с предыдущим. Нетрудно убедиться, что следующее выражение и будет искомым рекуррентным соотношением:

 

x2

sn = −sn1

 

.

2n (2n +1)

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

Листинг 1.5.

/*при больших значениях аргумента (получилось, при больших 20) может получиться не совсем корректный результат, так как используемое для синуса разложение в ряд Тэйлора справедливо в окрестности нуля

*/

x = input('sin(x), x?'); e = 1e-8;

summa = x;

22

last_member = x; n = 1.0;

while abs(last_member) > e

last_member = last_member * (-x*x/(2.0*n*(2.0*n + 1.0))); summa = summa + last_member;

n = n + 1.0; end

disp(summa)

disp(sin(x))

Рис.1.5. Результат работы Листинга_1.5