- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
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 10−6 . |
|||||
|
|
|
|
|
|
|
|
||||||||
|
|
~ |
|
|
999996 |
|
|||||||||
|
|
|
p |
|
|
|
|
|
|
|
|
||||
Определение 1.2. Значащими цифрами числа называются все цифры в его записи, начиная с первой ненулевой слева. Так, например, у чисел 0.010087 и 0.0100870000 значащие цифра будут, 10087 и 100870000 соответственно.
Любое число можно представить в виде x = a1 β n + a2 β n−1 +.... + am β n−k +1 , где β
- основание системы счисления, n - некоторое число(старший десятинный разряд числа x ), ai - значащие цифры приближенного числа x .
Определение 1.3. Значащая цифра ak |
считается верной, если имеет место |
равенство: a ≤ϖβ n−k +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 10−2 |
и также определить |
||||||||||||
число верных десятичных знаков приближенного числа |
x = 0.07777 , если |
|||||||||||||
известна абсолютная погрешность |
Ax = 0.5 10−3 . |
|
|
|
|
|
|
|||||||
Решение. |
Записываем представление числа x =1.709 |
в десятичной системе |
||||||||||||
счисления: |
x =1 100 |
+ 7 10−1 + 0 10−2 + 9 10−3 . Отсюда, |
n = 0 . |
|
|
|||||||||
При |
k =1: |
0.1 10−2 |
≤ϖ 100−1+1 |
- |
верно при |
0.5 ≤ϖ ≤1, |
|
|
|
|||||
При |
k = 2 : |
0.1 10−2 |
≤ϖ 10−1 |
- |
верно при |
0.5 ≤ϖ ≤1, |
|
|
|
|||||
При |
k = 3: |
0.1 10−2 |
≤ϖ 10−2 |
- |
верно при |
0.5 ≤ϖ ≤1, |
|
|
|
|
||||
При |
k = 4 : |
0.1 10−2 |
≤ϖ 10−3 |
- |
не верно при 0.5 ≤ϖ <1(строго меньше 1), |
|||||||||
Заметим, что если ϖ =1 , то число верных знаков |
m = 4 . |
|
|
|
|
|||||||||
Итак, число верных знаков для данного числа равно |
m = 3 . |
|
|
|||||||||||
Записываем |
представление |
|
числа |
x = 0.07777 |
в |
|
десятичной |
системе |
||||||
счисления: |
x = 7 10−2 + 7 10−3 |
+ 7 10−4 |
+ 7 105 . |
Отсюда, n = −2 . |
|
|||||||||
0.5 10−3 ≤ϖ 10−2+1−m - это неравенство верно при |
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
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 = −sn−1 |
|
. |
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
