Порядок операций, численные алгоритмы


10

Я прочитал это

(1) Плохо обусловленные операции должны выполняться до хорошо подготовленных.

Например, нужно вычислить как (xy) z, поскольку вычитание плохо обусловлено, а умножение - нет.xzyz(xy)z

Однако анализ ошибок первого порядка обоих алгоритмов показывает, что они различаются только в три раза (*), и я не понимаю, почему можно обобщить это в утверждении (1), и при этом я интуитивно не понимаю значение порядок действий. Как вы думаете, утверждение (1) является принятым правилом, и есть ли у вас другие объяснения для него?

*: более конкретно, первая версия имеет относительную ошибку, ограниченную

eps+3|x|+|y||x||y|eps
тогда как относительная ошибка второй версии ограничена

3eps+|x|+|y||x||y|eps

где eps - точность машины.

Этот анализ основан на предположении, что i промежуточный результат умножается на (1+εi) (из-за ошибок округления), где εi - это случайные переменные iid, ограниченные eps . «Первый порядок» означает, что членами высшего порядка, такими как ϵiϵjx , пренебрегают.


Где ты это прочитал?
Дэвид Кетчон

в моих конспектах лекций
Бананах

Ответы:


8

Обозначим через (мне было лень пытаться получить обведенную версию оператора деления) аналоги с плавающей запятой точного умножения ( ), сложения ( ) и вычитания ( ) соответственно. Предположим (IEEE-754), что для всех них где - машинный эпсилон, дающий верхнюю границу относительной ошибки из-за округления. Мы также будем использовать следующую лемму (при условии, что все , а не слишком велика), которую легко доказать: × + - [ x y ] = ( x,,×+ϵ m a c h | δ я | ϵ m a c h m m i = 1 ( 1 + δ

[xy]=(x+y)(1+δ),|δ|ϵmach,
ϵmach|δi|ϵmachm
i=1m(1+δi)=1+θ(m),|θ(m)|mϵmach1mϵmach

Давайте определим истинную функцию которая работает с действительными числами какfx,y,z

f(x,y,z)=(x×z)(y×z)

и две версии реализации функции в IEEE-совместимой арифметике с плавающей точкой, такие как и которые работают с представлениями с плавающей точкой , следующим образом:f1~f2~x~=x(1+δx),y~,z~

f1~(x~,y~,z~)=(x~z~)(y~z~),

f2~(x~,y~,z~)=(x~y~)z~.

Анализ ошибок для :f1~

f1~=((x(1+δx)×z(1+δz))(1+δxz)(x~z~)(y(1+δy)×z(1+δz))(1+δyz)(y~z~))(1+δ)=xz(1+δx)(1+δz)(1+δxz)(1+δ)yz(1+δy)(1+δz)(1+δyz)(1+δ)=xz(1+θxz,1)yz(1+θyz,1).
Здесь .|θxz,1|,|θyz,1|4ϵmach14ϵmach

Аналогично, для Здесь .f2~

f2~=(((x(1+δx)y(1+δy)(1+δxy))×(z(1+δz)))(1+δ)=xz(1+δx)(1+δz)(1+δxy)(1+δ)yz(1+δy)(1+δz)(1+δxy)(1+δ)=xz(1+θx,2)yz(1+θy,2).
|θx,2|,|θy,2|4ϵmach14ϵmach

Итак, для и мы получили выражения одного типа, поэтому я не понимаю, почему одна реализация предпочтительнее другой с числовой точки зрения (за исключением того факта, что выполняет только 2 операции с плавающей точкой по сравнению с ).f1~f2~f2~f1~

Вычисление относительной ошибки покажет, что проблема связана с тем, что и могут быть очень близки ( отмена ).xy

|f1~f||f|=|xz+xzθxz,1yzyzθyz,1(xzyz)||xzyz|=|xθxz,1yθyz,1||xy||x|+|y||xy|4ϵmach14ϵmach,
|f2~f||f|=|xz+xzθx,2yzyzθy,2(xzyz)||xzyz|=|xθx,2yθy,2||xy||x|+|y||xy|4ϵmach14ϵmach.

Незначительные различия между могут сделать одну из двух числовых реализаций незначительно лучше или хуже в зависимости от . Однако я сомневаюсь, что это может иметь какое-либо значение. Результат полностью имеет смысл, потому что, независимо от того, что, если вам нужно вычислить , когда и достаточно близки по значениям (для точности, с которой вы работаете), используя арифметику с плавающей точкой, никакое масштабирование не поможет вам: ты уже в беде.x , y , z ( x - y ) x yθx,y,z(xy)xy

NB: Все обсуждения выше предполагают, что нет переполнения или недостаточного значения, то есть , - набор всех нормальных чисел с плавающей точкой.F 0x,y,z,f(x,y,z)F0F0

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.