- ベストアンサー
logを分数で近似
log_2 3を、0.00001以下の誤差で表される分数(aとbを整数として、a/bと表される)で書き表したいのですが、どなたか方法と過程を示していただけないでしょうか?
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (10)
- f272
- ベストアンサー率46% (8469/18132)
エクセルVBAで求めてみた。 Sub log2_3() n = 10 ReDim a(0 To n), c(1 To n), p(-1 To n), q(-1 To n), e(1 To n) p(-1) = 0 q(-1) = 1 a(0) = Log(3) / Log(2) p(0) = 1 q(0) = 0 For i = 1 To n c(i) = Int(a(i - 1)) a(i) = 1 / (a(i - 1) - c(i)) p(i) = c(i) * p(i - 1) + p(i - 2) q(i) = c(i) * q(i - 1) + q(i - 2) e(i) = p(i) / q(i) - a(0) Next i Range("a1").Resize(n + 2) = WorksheetFunction.Transpose(p) Range("b1").Resize(n + 2) = WorksheetFunction.Transpose(q) Range("c3").Resize(n) = WorksheetFunction.Transpose(e) End Sub A列が分母,B列が分子,C列が誤差 _____0_________1 _____1_________0 _____1_________1______-0.584962501 _____2_________1______0.415037499 _____3_________2______-0.084962501 _____8_________5______0.015037499 ____19________12______-0.001629167 ____65________41______0.000403353 ___84________53______-5.68403E-05 __485_______306______4.81954E-06 _1054_______665______-9.47061E-08 24727_____15601______1.68254E-09
お礼
ご回答ありがとうございます。 No.2の方と同じく数値計算で丁寧に示されていますが、違うんです。 私は偏微分方程式や非線形微分方程式のような数値計算もできますし、誤差論もわかります。 問題は、如何にきれいにスマートにこの問題を解くかなんです。 この辺は数学者のような感覚に近いです。 もちろん、数値計算によるものであってもいいのですが…スッキリしません。 数値計算の恩恵、文明の恩恵に預かるではなく、頭の体操といった傾向が強いのは否めません。 この質問をしたのもある種のヒラメキで、簡単に解けるのでは?と思って質問させていただきました。
- ta20000005
- ベストアンサー率46% (30/64)
alice_44さんの回答を見て、音律を決める時に使う (3/2)^12≒2^7 は使えないかなと試してみました。 3^12≒2^19より log[2](3)≒19/12≒1.5833 ちょっと誤差が大きいですね。 なら、53音平均律を導く関係 (3/2)^53≒2^31 ならどうか? 3^53≒2^84より log[2](3)≒84/53≒1.584905 惜しい!精度は一桁足りずです。 というわけで失敗ではありますが、音楽理論から結構いい近似が求まるのは自分には面白かったです。
お礼
ご回答ありがとうございます。 これは興味深いですね。 音階とlog[2](3)が非常に近い関係あるのがなんとも言えない感じで、良いです。 貴重な種、ありがとうございました。
- ramayana
- ベストアンサー率75% (215/285)
- alice_44
- ベストアンサー率44% (2109/4759)
代入計算は、連分数展開のほうが簡潔だが、 展開式を得る過程は、冪級数よりややこしいのでは?
お礼
ご回答ありがとうございます。 連分数に慣れていないので、なんとも言えません… 問題発起の時点でマクローリン展開などの級数展開法を用いれば簡単に出てくることは分かっていました。 しかし、級数以外の方法でも簡単にできるんだという、私のなんとも言えないヒラメキがこの質問をさせたのです。
- ramayana
- ベストアンサー率75% (215/285)
「連分数展開」というのを使う方法もあります。ひたすら逆数の計算と引き算をするだけなので、高校生でも十分理解できると思います。インターネットで検索すれば、どこかに載っているでしょう。利点は、次の2つ。 1 マクローリン展開より計算量が少ない。 2 誤差は、特段の計算をしなくても、結果からすぐ分かる。 (誤差は、分母の2乗の逆数より小さい⇒分母が318(10万の平方根)より大きくなるまで計算すれば、誤差は0.00001以下になる。 log_2 3を0.00001以下の誤差で表すなら、最初の8項ぐらい計算すればよいでしょう。せいぜい3桁程度の数字の割り算と引き算を繰り返すことになります。
お礼
ご回答ありがとうございます。 計算を工夫したら連分数みたいになったのですが、 自分の計算が完全に展開までは出来ていませんでした。
- alice_44
- ベストアンサー率44% (2109/4759)
難しげな話は拔きで、高校生っぽい道具と根性だけで解決しよう というのなら、飛びっきりの根性が必要になります。 log_2 3 ≒ p/q ⇔ 2^p ≒ 3^q だから、 2^8 = 256 ≒ 243 = 3^5 あたりから出発して、試行錯誤しながら 2^p ≒ 3^q となる p,q の桁数を上げてゆく手はある。 2^8 > 3^5 だけれども、2^80 ≒ 3^50 を改善するにあたって 2^79 ≒ 3^50 と 2^80 ≒ 3^51 ではどちらがよいか?とか。 ともかく山程計算すれば、p/q < log_2 3 < r/s かつ r/s - p/q < 0.00001 となる p,q,r,s を見つけることが できるかもしれないし、途中でやんなって終るかもしれない。 どうせ根性を発揮するのなら、計算に燃えるよりも 勉強に熱意を使って、log の級数近似くらい理解するように なるほうが、前向きでよいような気はしますね。
お礼
ご回答ありがとうございます。 この山ほどの計算が見えているとこをうまく回避する、というのが、この問題の本当に聞きたいところでした。 舌足らずですみません。
- zeta0208
- ベストアンサー率45% (17/37)
詳細は『テイラー展開』『マクローリン展開』にて調べてください。 概略のみ示します。 log[e](1+x)は xがZero に近い時 マクローリン展開すると log[e](1+x)≒ (x^1)/1 - (x^2)/2 + (x^3)/3 - (x^4)/4 + ・・・・・ となります。 これを利用すれば代数的な計算で求まります。 上記の式を log[e]{(1+x)/(1-x)} =log[e](1+x) - log[e](1+(-x)) =2{(x^1)/1 + (x^3)/3 + (x^5)/5 + ・・・・・} として、この式を利用する。 まず Zeroに近い数としてx=1/3とすると log[e]2 = log[e]{(1+1/3)/(1-1/3)} = 2{1/3 + ((1/3)^3)/3 + ((1/3)^5)/5 + ・・・・・} Zeroに近い数としてx=1/2とすると log[e]3 = log[e]{(1+1/2)/(1-1/2)} = 2{1/2 + ((1/2)^3)/3 + ((1/2)^5)/5 + ・・・・・} つまり log[2]3 = log[e]3/log[e]2 = {1/2 + ((1/2)^3)/3 + ((1/2)^5)/5 + ・・・・・}/{1/3 + ((1/3)^3)/3 + ((1/3)^5)/5 + ・・・・・} 求める桁との誤差がなくなるところで項を足すのを打ち切れば近似が求まります。 ※ log[2]3=1.58496として 1項で求めると ≒{1/2}/{1/3}=3/2=1.5 2項目で求めると ≒{1/2 + ((1/2)^3)/3}/{1/3 + ((1/3)^3)/3}=1.56696 3項目で求めると ≒{1/2 + ((1/2)^3)/3 + ((1/2)^5)/5}/{1/3 + ((1/3)^3)/3 + ((1/3)^5)/5}=1.58182 4項目で求めると ≒{1/2 + ((1/2)^3)/3 + ((1/2)^5)/ + ((1/2)^7)/7}/{1/3 + ((1/3)^3)/3 + ((1/3)^5)/5 + ((1/3)^7)/7}=1.58420 と誤差が少なくなっていくことが判るかと思います。
お礼
丁寧にありがとうございます。 こちらはANo.1の段階でお礼の欄に書かせていただいた文に包含させていただきました。
- Tacosan
- ベストアンサー率23% (3656/15482)
「高校生レベルで手計算でできそうだと感じている」という根拠は何? 「超越数を有理数で近似する」だけでもものによっては非常に難しい (というか「ただの作業」) し, さらに誤差評価まで入れると本気でめんどくさいことになるんだけどなぁ. いや, 「高校生レベルの計算」でできるのは間違いないんだよ. 手計算する気にならないだけで.
お礼
そうですね~。 ものすごい累乗になってしまうのが目に見えているんですが、どっかに抜け道があるのでは?と思ってます。 因みに、log_a b=log_(a^n) (b^n)を使ってうまく切り抜けられないか考えてます。
- FT56F001
- ベストアンサー率59% (355/599)
数値的に探すと, 485/306 誤差は4.82×10^(-6) Private Sub Command1_Click() g = 9999 n = 0 X0 = Log(3) / Log(2) While g > 0.00001 n = n + 1 m = Int(X0 * n + 0.5) g = Abs(X0 - m / n) Wend Print m, n End Sub
お礼
なるほど。 数値的にはそうなるんですが… 何かもっとスッキリ出したいのです。高校数学レベルでもうちょっとうまくできないかと。
- Tacosan
- ベストアンサー率23% (3656/15482)
1. log_2 3 を 0.00001以下の誤差で小数で表す 2. それを 100000倍する 3. 2 で得られた値を分子, 100000 を分母とする分数を作る でどうでしょか.
お礼
ご回答ありがとうございます。 大学レベルの知識を持ち合わせていれば可能ですね。 ただ、私の中では高校生レベルで手計算でできそうだと感じているのですが、他に方法はないでしょうか?
お礼
ご回答ありがとうございます。 x6=4+αと置くことで、 α=0と置いたものと、α=1と置いたもので大小関係を比較すると、0.0001以下までの精度がありました。 おそらくx7まで出せば十分…と言っても相当計算が必要ですが(^^;) まあ、根性出してやるよりかははるかに計算量は少なかったです。 この場合、756/477 < log_2 3 < 12115/7644でした。 貴重な考え方を頂き、ありがとうございましたm(_ _)m