- •Глава 2
- •2.1. Введение
- •Относительные и абсолютные ошибки
- •2.3. Ошибки, содержащиеся в исходной информации
- •2.4. Ошибки ограничения
- •2.5. Ошибки округления
- •2.6. Распространение ошибок
- •2 .7. Графы вычислительных процессов
- •Пример 1
- •2.9. Памятка программисту
- •Упражнения
- •Численное решение уравнений
- •5.1. Введение
- •5.2. Метод последовательных приближений
- •5.3.Усовершенствованный метод последовательных приближений
- •5.4. Метод ньютона — рафсона
- •5.5. Случай почти равных корней
- •5.6. Сравнение методов и их ошибок округления
- •5.7. Корни многочленов
- •5.8. Влияние неточности коэффициентов многочлена
- •5.9. Системы уравнений
- •5.10. Комплексные корни
- •5.11. Нахождение исходного приближения
- •Упражнения
- •Глава 8
- •8.1. Введение
- •8.3. Ошибки округления
- •8.5. Влияние погрешностей коэффициентов. Достижимая точность решения
- •8.6. Итерационные методы решения систем линейных уравнений
- •8.7. Сравнение методов
- •8.8. Практический пример 10: проведение кривой методом наименьших квадратов
- •Лекция №1 Численное интегрирование
- •Лекция №2
- •Правило Симпсона.
- •Метод Гаусса
- •Методы прогноза и коррекции
- •Анализ ошибок при использовании метода прогноза и коррекции
8.3. Ошибки округления
В этом разделе мы рассмотрим ошибки округления, которые возникают при вычислениях с плавающей запятой. Здесь мы зададимся целью не столько найти верхнюю границу возможной ошибки округления (хотя эту верхнюю границу и можно определить), сколько указать правило организации вычислений, которое свело бы ее к минимуму. Определение величины еамой ошибки отложим до разд. 8.4,
Р и с. 8.6. Блок-схема программы для обратной подстановки при решении системы уравнений методом исключения.
где будет рассмотрен метод, позволяющий использовать ЭЦВМ не только для определения величины ошибки, но и для коррекции ошибочных результатов.
Вспомним, что перед началом процесса исключения очередного неизвестного может понадобиться переставить уравнения в системе, чтобы избежать деления на нуль. Обычно приходится делать несколько таких перестановок. В этом разделе мы покажем, как с помощью соответствующего выбора пары уравнений для перестановки можно существенно уменьшить ошибки округления. Оказывается, что обычно перестановка уравнений желательна, даже если диагональный член и не равен нулю.
Предположим, что мы собираемся исключить Xk. Система уравнений имеет следующий вид:
a11x1+a12x2+ ... a1kxk+ ... +a1jxj+ ... +a1nxn=b1
a`22x2+a`2kxk+ ... +a`2jxj+ ... +a`2nxn=b`2,
................................................................................
akk^(k - 1)xk+ ... +akj^(k - 1)xj+ ... +akn^(k -1)xn=bk^(k - 1), (8.19)
...............................................................................
aik^(k - 1)xk+ ... +aij^(k - 1)xj+ ... +ain^(k - 1)xn=bi^(k - ),
...............................................................................
ank^(k - 1)xk+ ... +anj^(k - 1)xj+ ... +ann^(k - 1)xn=bn^(k - ),
Теперь коэффициенты aij^(k) определяются формулой (8.15), в которой множители mi^(k - 1) вычисляются по формуле (8.14). Граф этого процесса приведен на рис. 8.7.
Определим теперь относительную ошибку округления при вычислении коэффициента aij^(k) . Пусть aij — относительная ошибка, содержащаяся в коэффициенте aij^(k - 1) и пусть , и — относительные ошибки округления соответственно при делении, умножении и вычитании.Тогда, обозначая через eij абсолютную ошибку коэффициента аij^(k) имеем
eij/aij^(k)= - (mi^(k - 1)aki^(k - 1))/aij^(k) * (aik - akk+akj++)+ aij^(k - 1)/aij^(k)*aij+.
Если , и не превосходят по абсолютной величине 5*10^(-t) и aij, не превосходит K*10^(-t), где K>=5, то предыдущую формулу можно переписать в следующем виде:
I eij I<={3*(K+5)*I akj^(k -1)I*I mi^(k - 1)I+10*I aij^(k - 1)I}*10^(-t).
Рассмотрим теперь некоторый столбец j. Можно с уверенностью сказать, что ошибка при вычислении нового коэффициента определяется в основном первым членом, стоящим в фигурных скобках, а величина его уменьшается
Р и с 8.7. Граф вычислительного процесса при решении системы уравнений методом исключения.
при уменьшении \тi^(k - 1)\. Поэтому желательно, чтобы \тi^(k - 1)\ было возможно меньшим. Но ведь для того, чтобы сделать \тi^(k - 1)\ возможно меньшим, необходимо, чтобы \akk^(k - 1)\ было возможно большим. Другими словами, при перестановке уравнений необходимо добиваться того, чтобы
\akk^(k - 1)\ >=\aik^(k - 1)\
потому что тогда \mi^(k - 1)\ <=1.
Если не соблюдать этого правила при перестановке уравнений, то по крайней мере один из множителей \mi^(k - 1)\ окажется по абсолютной величине больше 1.
Поэтому мы будем переставлять n-k+1 оставшихся уравнений так, чтобы наибольший по абсолютной величине коэффициент при xk попал на главную диагональ; в результате ни один из множителей mi^(k-1) не превзойдет 1 по абсолютной величине. Описанный способ решения линейных уравнений часто называется методом главного элемента.
Блок-схема программы для определения наибольшего коэффициента и соответствующей перестановки уравнений приведена на рис. 8.8. Она должна входить в блок-схему из рис. 8.5 вместо прямоугольника, обозначенного звездочкой. При рассмотрении рис. 8.8 необходимо помнить, что при переходе к этому этапу вычислений индекс имеет некоторое определенное значение, a i = k + 1. Вначале в программу вводится вспомогательный индекс l, которому присваивается значение k. Первое сравнение производится между alk, элементом, лежащим на главой диагонали, и следующим за ним aik. Если aik окажется по абсолютной величине больше alk, то индексу l присваивается значение i и дальнейшее сравнение производится уже со вторым элементом. Поэтому индекс l является номером элемента, который оказался при сравнении больше других по абсолютной величине. Индекс i пробегает по ходу программы значения от k + 1 до n включительно, и в конце этого цикла индекс l определяет номер наибольшего по абсолютной величине элемента в k-ì столбце. При перестановке уравнений этот элемент должен попасть на главную диагональ, т. е. должен стать элементом akk.
Может случиться так, что значение akk уже является наибольшим по абсолютной величине в k-ì столбце. Поэтому такая возможность сразу проверяется и в этом случае перестановка не производится. Перед возвращением к основному процессу вычислений необходимо восстановить первоначальное значение индекса i, который был использован при сравнении. Это делается очень просто: перед началом процесса сравнения индекс i имел значение k + 1. Остается только снова присвоить ему это значение.
Фактически процесс состоит в перестановке коэффициентов, один из которых содержится в уравнении k, а другой — в уравнении l, каково бы ни было значение l. Как уже указывалось в разд. 7.9, перестановка значений производится с помощью трехступенчатого процесса. Эту перестановку необходимо произвести для всех пар коэффициентов двух уравнений, что делается с помощью цикла, использующего в качестве индекса переменную l. Наконец, необходимо переставить свободные члены уравнений, и на этом процесс перестановки заканчивается.
Можно еще уменьшить ошибку округления, если переставлять не только строки, но и столбцы. Другими словами, необходимо искать наибольший по абсолютной величине коэффициент среди всех оставшихся, а не только среди коэффициентов k-го cтолбца. Ошибка округления в самом деле уменьшается, но за счет существенного усложнения программы: перестановка столбцов равносильна переименованию неизвестных, которое необходимо запоминать. Конечно, это можно сделать, но обычно соответствующее уменьшение ошибки округления не оправдывает усложнения программы; кроме того, такая программа работает гораздо медленнее. В упражнении 26 рассмотрен практический прием, с помощью которого можно произвести переименование неизвестных.
Чтобы проиллюстрировать практическое значение перестановки уравнений, рассмотрим следующую простую систему:
* IO^0x1+l .600 * 10^2x2= 1.632 *10^2
1.020 * 10^4x1+1.540 * 10^3x2= 1.174 * 10^4 (8.20)
Точное решение этой системы следующее:
x1= 1.000 *10^0
x2= 1.000 *10^0
Попытаемся решить эти уравнения методом исключения в том порядке, в котором они написаны, используя при вычислениях числа с четырьмя значащими цифрами в мантиссе. Первый и единственный множитель будет равен
m=1.020*10^4/3.241*10^0=3.147*10^3
Преобразованное второе уравнение запишется так:
*10^-1 - 5.020 * 10^5x2 = - 5.019*10^5 .
Естественно, коэффициент при x1 должен был бы быть равен нулю, но ошибка округления не позволяет получить точный результат. Так как этот коэффициент нигде не входит в дальнейшие вычисления, то мы принимаем его равным нулю и производим обратную подстановку
x2= - 5.019*10^5/ - 5.020*10^5=9.998*10^-1 (8.21)
Из первого уравнения получаем
x1= 9*873*10^-1 (8.22)
Теперь переставим уравнения, как это потребовалось бы согласно описанному правилу. Теперь множитель равен
m=3.241*10^0/1.020*10^4=3.177*10^-4 .
Преобразованное второе уравнение запишется так:
0.000x1+1.595*10^2x2=1.595*10^2
откуда
x2=1.000*10^0
и x1=1.000*10^0 .
В этом примере коэффициенты сильно отличались по величине, но чаще всего различия эти не так велики. Однако при решении большой системы уравнений ошибки округления могут накапливаться (система из 10 уравнений представляет собой обычное явление, а система из 100 уравнений тоже встречается довольно часто). Первая же перестановка в очень большой степени влияет на точность последующих вычислений. 'Нетрудно привести примеры сравнительно малых систем, при решении которых без перестановки уравнений ответы получаются совершенно неверными, не имеющими ни одной правильной значащей цифры. Любая практическая программа для решения системы линейных уравнений на ЭЦВМ методом исключения должна предусматривать перестановку уравнений, кроме, может быть, некоторых весьма специальных случаев, когда заранее можно предсказать поведение коэффициентов в процессе вычислений.
8.4. УТОЧНЕНИЕ РЕШЕНИЯ
Независимо от того, производится при решении системы перестановка уравнений или нет, ошибка округления обычно влияет на результат. В этом разделе мы рассмотрим метод уточнения уже найденного решения системы. Это позволит в большинстве случаев уменьшить влияние ошибок округления на окончательный результат; может оказаться даже, что в некоторых случаях получится правдоподобное решение некоторых плохо обусловленных систем.
Обозначим через x1^(0) x2^(0) x3^(0) x4^(0) ... xn^(0) приближенное решение уравнения (8.13), найденное с помощью метода исключения или некоторым другим способом. Подставляя это приближенное решение в левые части системы (8.13), получим
a11x1^(0)+a12x2^(0)+ ... +a1nxn^(0)=b1^(0)
a21x1^(0)+a22x2^(0)+ ... +a2nxn^(0)=b2^(0)
........................................................................ (8.23)
an1x1^(0)+an2x2^(0)+ ... +annxn^(0)=bn^(0) .
Если bi^(0) сильно отличаются от bi , то xi^(0) не являются достаточно хорошим приближением к решению уравнения. С другой стороны, даже если все bi^0 достаточно близки к bi, то xi^0 все равно могут явиться плохим приближением к решению системы (см. пример (8.3) в разд. 8.1).
Если вычесть каждое уравнение системы (8.23) из соответствующего уравнения системы (8.13) и обозначить
di^(0)=xi - xi^(0) i=l,...,n, (8.24)
bi^(0)=ci - ci^(0) i=1,...,n (8.25)
то можно написать
a11d1^(0)+a12d2^(0)+ ... +a1ndn^(0)=b1^(0),
a21d1^(0)+a22d2^(0)+ ... +a2ndn^(0)=b2^(0), (8.26)
..........................................................................
an1d1^(0)+an2d2^(0)+ ... +anndn^(0)=bn^(0),
Легко вычислить величины ^ и определить е^ из системы (8.26) методом исключения. Новое приближение к решению системы (8.13) запишется так:
xi^(1)=xi^(0)+di^(0) i=1,2, ... ,n
Теперь снова можно подставить xi^(1) в левые части уравнений (8.13) и обозначить через bi^(1) значения свободных членов, которые будут вычислены в результате этой подстановки.
Новую поправку к решению системы (8.13) можно получить из системы уравнений
a11d1^(1)+a12d2^(1)+ ... +a1ndn^(1)=b1^(1),
a21d1^(1)+a22d2^(1)+ ... +a2ndn^(1)=b2^(1), (8.27)
..........................................................................
an1d1^(1)+an2d2^(1)+ ... +anndn^(1)=bn^(1),
где
bi^(1)= ci - ci^(1), i=1,2, ... ,n .
Новое приближение запишется после этого в следующем виде:
xi^(2)=xi^(1)+di^(1) , i=1,2, ... ,n .
Естественно, такой процесс можно продолжать до тех пор, пока все i; не станут достаточно малыми. Важно отметить, что нельзя останавливать вычисления только потому, что все di стали малыми; тот же пример (8.3) ясно . показывает, что при малых di решение системы вовсе не обязано быть точным.
В качестве примера рассмотрим систему (8.20), решенную без перестановки уравнений. В качестве первого приближения были получены следующие величины:
x1^(0)=9.873*10^-1; x2^(0)=9.998*10^-1
Подставляя эти значения в (8.20) и вычисляя все величины с точностью до четырех значащих цифр, получим
c1^(0)=1.632*10^2
c2^(0)=1.161*10^4
так что
b1^(0)=c1 - c1^(0)=0
b2^(0)=c2 - c2^(0)=1.300*10^2
Теперь решим систему (8.20), подставив в качестве правых частей b1^(0) и b2^(0), т. е.
3.241*10^0d1^(0)+1.600*10^2d2^(0)=0
1.020*10^4d1^(0)+1.540*10^3d2^(0)=1.300*10^2
Снова, не прибегая к перестановке уравнений, получим
d1^(0) = 1.284 *10^-2
d2^(0) = -2.600*10^-4
так что новое приближение будет равно
x1^(1)=x1^(0)+d1^(0)=1.000*10^0
x2^(1)=x2^(0)+d2^(0)= 9.995*10^-1
Подставляя эти значения в (8.20), найдем
b1^(1)=c1 - c1^(1)=1.000*10^-1
b2^(1)=c2 - c2^(1)= 0
так что
d1^(1)=- 9.256*10^-5
d2^(1)= 6.268*10^-4
Следующее приближение будет равно
x1^(2) = x1^(1)+d1^(1)=1.000*10^0
x2^(2) =x2^(1)+d2^(1)=1.000*10^0
Таким образом, удалось получить точное решение трех итераций. (Укажем, что при перестановке достаточно одной итерации.)
Важно отметить, что удалось существенно уточнить решение, даже несмотря на значительную величину ошибок округления. Естественно, при практических вычислениях производится ^ перестановка уравнений. Основной смысл описанного выше метода состоит в уточнении решения, полученного с использованием перестановки уравнений, но тем не менее содержащего ошибки округления.
