OBSAH TROJÚHELNÍKA

PROBLÉM
Jsou dány tři strany trojúhelníka X, Y, Z, máme vypočítat jeho obsah.

Numericky nestabilní a numericky stabilní řešení
Klasický vzorec pochází od Herona z Alexandrie. Využívá jej následující funkce HERON

IMPLEMENTACE
Jednotka: vnitřní funkce
 
Vazba: funkce SQRT
 
Parametry: kladná reálná čísla X, Y, Z - délky stran trojúhelníka, přirozené P - počet platných číslic v hodnotě výsledku, implicitně 9
 
Vrací: obsah trojúhelníka

 


HERON: procedure
parse arg X, Y, Z, P
if P = "" then P = 9; numeric digits P
S = (X + Y + Z) / 2
return SQRT(S * (S - X) * (S - Y) * (S - Z), P)

 

Tato funkce je numericky nestabilní pro trojúhelníky s jedním velmi malým úhlem, vypadají jako jehly. W. Kahan popisuje následující numericky stabilní funkci
 


ATRIAN: procedure
parse arg X, Y, Z, P
if P = "" then P = 9; numeric digits P
/* uspořádat X, Y, Z, tak že X>=Y>=Z */
if Y > X
  then do; W = X; X = Y; Y = W; end
if Z > X
  then do; W = X; X = Z; Z = W; end
if Z > Y
  then do; W = Y; Y = Z; Z = W; end
if Z < (X - Y)
  then call ERROR "Takový trojúhelník neexistuje"
  else do
    W1 =  X + Y + Z
    W2 = -X + Y + Z
    W3 =  X - Y + Z
    W4 =  X + Y - Z
    return SQRT(W1 * W2 * W3 * W4, P) / 4
  end
 
ERROR: say ARG(1); exit

 

Příklad (W. Kahan)
Program


X = 100.01; Y = 99.995; Z = 0.025
say " 5 platných. č. Heron" HERON(X, Y, Z, 5)
say "20 platných. č. Heron" HERON(X, Y, Z, 20)
say " 5 platných. č. Kahan" ATRIAN(X, Y, Z, 5)
say "20 platných. č. Kahan" ATRIAN(X, Y, Z, 20)
exit
...

zobrazí na displeji:


 5 platných. č. Heron 1.5813
20 platných. č. Heron 1.0000249921876952771
 5 platných. č. Kahan 1.0000
20 platných. č. Kahan 1.0000249921876952771

Literatura
Kahan W., Mathematics Written in Sand

 

SPOLUAUTOR
Robert D. Acker, Jr. - vylepšení vzhledu procedury ATRIAN


Obálka Obsah Index Hlavní stránka Rexx   Mail

změněno 18. března 2005
Copyright © 2000-2005 Vladimír Zábrodský, RNDr.