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


10

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

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

Например, нужно вычислить как (xy) z, поскольку вычитание плохо обусловлено, а умножение - нет.xz−yz(x−y)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 + δ

[x⊕y]=(x+y)(1+δ⊕),|δ⊕|≤ϵmach,
ϵmach|δi|≤ϵmachm
∏i=1m(1+δi)=1+θ(m),|θ(m)|≤mϵmach1−mϵ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ϵmach1−4ϵ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ϵmach1−4ϵmach

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

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

|f1~−f||f|=|xz+xzθxz,1−yz−yzθyz,1−(xz−yz)||xz−yz|=|xθxz,1−yθyz,1||x−y|≤|x|+|y||x−y|4ϵmach1−4ϵmach,
|f2~−f||f|=|xz+xzθx,2−yz−yzθy,2−(xz−yz)||xz−yz|=|xθx,2−yθy,2||x−y|≤|x|+|y||x−y|4ϵmach1−4ϵmach.

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

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

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