プロが教える店舗&オフィスのセキュリティ対策術

直角三角形の斜辺の長さを求める場合には、ピタゴラスの定理を使えばよいのですが、ある本に次のような手順の紹介がありました。
・直角三角形の底辺の長さをx、対辺の長さをyとした時に
1) t = y/x
2) t = t*t
3) t = t/(4+t)
4) x = x + 2*x*t
5) y = t*y
この手順を数回繰り返すと、x に斜辺の長さが求まります。もちろん近似値ですが、Excelなどで試してみると確かに数回の試行で充分な近似値が求まります。
さて、なぜこの手順で求まるのでしょうか?

A 回答 (3件)

#2で用いられている記号を拝借して、



t = y / x
c = t^2 / (4 + t^2)
x' = (1 + 2c)x
y' = cy

ここで、tを介さずにcをx、yで表すと
c = (y/x)^2 / [4 + (y/x)^2]
分母分子に (x/2)^2 を掛けると
c = (y/2)^2 / [x^2 + (y/2)^2]
と書くことができます。
この c が何を意味するのか?ということを、
初等幾何的に捉えてみましょう。

直角三角形ABCにおいて、角Cが直角、BC = x、AC = yとします。
BとACの中点Mを結び、角MBC = αとします。
ここで、(sinα)^2 という量を考えます。
(sinα)^2 = (MC / BM)^2 = MC^2 / BM^2 = MC^2 / (BC^2 + MC^2)
= (y/2)^2 / [x^2 + (y/2)^2]
これは初めに求めた c の式に一致していますね。
すなわち、図形上では c は (sin∠MBC)^2 という
意味が与えられていることになります。

次に、x'、y'の持つ意味を考えてみましょう。

辺ABから見て点Cと反対の側に、
∠DBM = α(したがってって∠DBC = 2α)となるような点Dを適当に取ります。
つまりαを2倍に広げると、斜辺ABを乗り越えてしまう、ということです。
線分BDの端Dを動かしてBDを伸ばしたり縮めたりすると、
どこかに必ず∠ADBが直角になるところがありますから、
その点を改めて点Dと名づけることにしましょう。
結論から言うと、この新しい直角三角形
(もとの直角三角形よりは細長いですね)の
辺BD、ADが、それぞれ初めに書いた
BD = (1 + 2c)x = [1 + 2・(sinα)^2]x
AD = cy = (sinα)^2・y
で表されるのです。

以下、このことを証明します。
CからBMに垂線CHを下ろし、
さらに延長してBDと交わる点をEとし、EとAを結びます。

直角三角形BCMと垂線CHに着目すると、
∠HCM = αであることが分かります。
次に、∠EBH = ∠HBC = α、CE ⊥ BHより、
BHは二等辺三角形BECの対称軸であり、
BE (= BC) = x、またHはCEの中点です。
これとMがACの中点であることから、
三角形AECにおいて、中点連結定理により AE // MH となります。
したがって AE ⊥ EC 、∠DEA (= ∠DBM) = α です。

さて、直角三角形AECにおいて、AC = y、∠ACE = αより、
AE = y・sinαとなります。
さらに直角三角形ADEにおいて、∠DEA = αより、
AD = AE・sinα = (y・sinα)・sinα = (sinα)^2・y
ED = AE・cosα = (y・sinα)・cosα
となります。これでADのほうは証明されました。
BDに関しては BD = BE + ED = x + (y・sinα・cosα)
となりますが、まだ目標の形になっていません。
ここで、αをどのように決めたかを思い出すと、
tanα = (y/2) / x、すなわち y = 2x・tanα = 2x・sinα / cosα
であるので、これを代入すると
AE = x + (2x・sinα / cosα)・sinα・cosα
= x + 2x・(sinα)^2 = [1 + (sinα)^2]x
となり、めでたく証明されました。

結局このアルゴリズムは、直角三角形BCAを、
斜辺を共有する扁平な直角三角形BDAの話に置きかえることによって、
斜辺の長さを求めている、という解釈を付けることができます。

できれば出典を教えていただけると嬉しいです。
    • good
    • 0
この回答へのお礼

zabuzaburodさん、回答ありがとうございます。
アルゴリズムの背景が良く理解できました。
zabuzaburodさんの言われているように
「直角三角形BCAを、
斜辺を共有する扁平な直角三角形BDAの話に置きかえることによって、
斜辺の長さを求めている、という解釈を付けることができます」ですね。
以下直角三角形BDAを新たな直角三角形BCA
として計算を繰り返しているわけですね。
さて、このアルゴリズムの出典は以下の書物によります。
-------------------------------------------------
書名:アルゴリズム事典
著者:奥村 晴彦
出版:技術評論社 1991年3月
この本のP190には文献として次の記述がありました。
Jon Bentley. More Programming Pearls. Addison-Wesley,1988. 156ページ
-------------------------------------------------
最後に、回答を下さった皆さんありがとうございました。

お礼日時:2002/10/20 17:36

kony0さんのご指摘通り,



(第n項)x,y>0 に対し,
t=y/x
c=t^2/(4+t^2)
x'=(1+2c)x ・・・(*)
y'=cy
で定義される(第n+1項)x',y'(ともに正)は,
1) (x')^2+(y')^2=x^2+y^2=一定値α^2=(xo)^2+(yo)^2 (α>0)
2) y→y' は真に単調減少で lim(y')=0 (n→∞)
⇒ [1),2)より] x→x' は真に単調増加で lim(x')=α (n→∞)
が示せます.

さらに付け加えれば, (*)式の補正係数=1+2c=(4+3t^2)/(4+t^2) は
r=√(x^2+y^2)=x√(1+t^2)
の √(1+t^2) の部分をテイラー展開した時の
1+(1/2)t^2-(1/8)t^4+(1/16)t^6+・・・
のうち,上からt^4までの項を有理式で(常に下から)近似した形(**)になっていて, t^4までは完全に一致し, 誤差はt^6 のオーダーです(首位t^6の係数は正). これが(t<1 を一度満たすと)収束が速い理由でしょう.
ただし, t=y/x が初期に1よりかなり大きいと(t>>1), 初めは収束が遅いようです[t<1 になるまでは有限回だが, やや遅い].

なお, 漸化式から分かるように, t>1の時も常にyは真に単調減少し, xは真に単調増加で, 有限回で減少関数 t=y/x は1未満に達し, xは急速に極限値 α=√{(xo)^2+(yo)^2} に収束しますので, 任意の初期値 xo, yo に対して収束することがいえます.

[補足]『(常に下から)近似した形(**)』は, 漸化式から示せる 1),2) から既知のことですが, t>1も含め,全てのt>0に対し, 直接
√(1+t^2)>1+2c=(4+3t^2)/(4+t^2) [誤差はt^6以上のオーダー]
が示せます. これにより, 補正係数(1+2c)に関して,全てのステップでc>0で良い理由が直接確認されます.[xの補正量が常に正.]

ところで, xに注目しましたが, y→0の収束の速度を見た方が賢いんでしょうかね.
また, 計算を間違ってないか,是非ご検証下さい.

この回答への補足

先ほどの記述で間違いがありました。次のように訂正します。
【誤】
級数展開した式がどのようにして、この陰関数に表現されるのでしょうか?
【正】
級数展開した式がどのようにして、この有理関数に表現されるのでしょうか?

補足日時:2002/10/20 10:26
    • good
    • 0
この回答へのお礼

oshiete_gooさん、回答ありがとうございます。
このアルゴリズムで問題なく解が得られる過程はよく理解できました。
このアルゴリズムの本来の目的は、小規模なシステムで四則演算だけで平方根を求める場合に使われるようです。
oshiete_gooさんの記述で
√(1+t^2)>1+2c=(4+3t^2)/(4+t^2)
の部分が良く理解できません。級数展開した式がどのようにして、この陰関数に表現されるのでしょうか?
また、xに関してはこのように変換した場合、なぜ
y'=cy
と置くと良いのでしょうか?
このように置けば繰り返し過程の中で常にx^2+y^2=一定値、は理解しているのですが。

お礼日時:2002/10/20 10:20

・操作によりx^2+y^2の値が固定されていること(式計算面倒なのでしていませんが^^;)


・3)で求められるtは0<t<1を満たすため、5)よりyは単調減少(非増加ではなく、真に単調減少)。あとy>0も言えます。これによりyの極限値は0。
ということで、xの極限値は斜辺の長さになる。

というシナリオじゃないんでしょうか?
    • good
    • 0
この回答へのお礼

kony0さん回答ありがとうございました。
そうですね、kony0さんの回答の通りですね。
さて、私の質問の仕方が本来の意図を得ていなかったようです。
改めて質問します。
1)から5)の手順で斜辺の長さの近似値が得られます。
この手順(アルゴリズム)は、どのようにして得られたのでしょうか?
その過程,背景を知りたいのです。なにか手がかりは無いでしょうか?

お礼日時:2002/10/19 20:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!