Langley(ラングレー)の問題をJavaで解いてみました。(^_^;
ずっと前、三角関数を使って導いた公式を使って、プログラムを作ってみました。始めから公式を使うと、誤差が目立つので、まず、代入法で整数解を探しています。(^_^;
四角形ABCDにおいて、 ∠ABD=a, ∠DBC=b, ∠BCA=c, ∠ACD=d, ∠CDB=e, ∠BAC=f, ∠ADB=x, ∠DAC=y のとき、x, y を求めます。
●LangleyProb01.java
/* * LangleyProb01.java * * ・y x・ * f e * * a d * ・ b c・ * * x+y=b+c … ① * * sin[a]*sin[c]*sin[e]*sin[y] * --------------------------- = 1 … ② * sin[b]*sin[d]*sin[x]*sin[f] * * 連立方程式①,②を使って解く。ただし、e=180-(b+c+d), f=180-(a+b+c) * * 変数部分と定数部分に分けるために次のように変形して、①',②'の定数部分をそれぞれP,Qとおく。 * * x+y=b+c=P … ①' * * sin[y] sin[b]*sin[d]*sin[f] * ------ = -------------------- = Q … ②' * sin[x] sin[a]*sin[c]*sin[e] * * このとき、 * sin[P] sin[P] * tan[x] = -------- , tan[y] = ---------- * cos[P]+Q cos[P]+1/Q * */ public class LangleyProb01 { static double sinD(double x) { return(Math.sin( Math.toRadians(x))); } static double cosD(double x) { return(Math.cos( Math.toRadians(x))); } static double atanD(double x) { return(Math.toDegrees(Math.atan(x))); } static double Langley(double a,double b,double c,double d) { double p=b+c; double e=180.0-(p+d), f=180.0-(a+p); double q=(sinD(b)*sinD(d)*sinD(f))/(sinD(a)*sinD(c)*sinD(e)); double x; if(e<=0 || f<=0) return -1.0; // エラーの時は、-1.0を返す。 // 代入法で整数解を探してみる。 for(x=1.0; x< p; x++) if(sinD(p-x)/sinD(x)==q) return x; // 整数解が見つからなかったら、公式を使ってみる。 return (x=atanD(sinD(p)/(cosD(p)+q))) >=0 ? x : x+180.0; } public static void main(String[] args) { double a = 20.0, b = 60.0, c = 50.0, d = 30.0; double x, y; x = Langley(a,b,c,d); y = (b+c)-x; System.out.println("x="+x); System.out.println("y="+y); } }
●実行結果
x=30.0 y=80.0
※参考URL
http://q.hatena.ne.jp/1349700436
●算数で解けるラングレーの問題|受験算数に挑戦!
●ラングレーの問題、整角四角形
●Langleyの問題を三角関数で解いてみた。
●Langleyの問題を三角関数で解いてみた。(2)
●半整数角四角形の問題を解いてみた。
●sin(3°)系列
●sin(3°)系列 (2)
ラングレーの問題にトドメをさす!―4点の作る小宇宙完全ガイド
- 作者: 斉藤浩
- 出版社/メーカー: 現代数学社
- 発売日: 2009/02/25
- メディア: 単行本
- 購入: 1人 クリック: 2回
- この商品を含むブログを見る
ヱヴァンゲリヲン新劇場版 プレミアムフィギュア Vol.8 式波・アスカ・ラングレー
- 出版社/メーカー: セガ
- メディア: おもちゃ&ホビー
- 購入: 1人 クリック: 2回
- この商品を含むブログ (2件) を見る