Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
krav.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
3.45 Mб
Скачать

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 рассмотрен практиче­ский прием, с помощью которого можно произвести переи­менование неизвестных.

Чтобы проиллюстрировать практическое значение перестановки уравнений, рассмотрим следующую простую систему:

  1. * 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

Преобразованное второе уравнение запишется так:

  1. *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

Таким образом, удалось получить точное решение трех итераций. (Укажем, что при перестановке достаточно одной итерации.)

Важно отметить, что удалось существенно уточнить решение, даже несмотря на значительную величину ошибок округления. Естественно, при практических вычислениях производится ^ перестановка уравнений. Основной смысл описанного выше метода состоит в уточнении решения, полученного с использованием перестановки уравнений, но тем не менее содержащего ошибки округления.

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