2016-07-08 16 views
1

三角形を解くとは、a、b、cの各辺とA、B、Cの角度(Aはaとは逆の角度など)知られている。この問題には、0,1,2、または無限に多くの解決策があります。三角法を解く

三角形を解決する手順を書いてみたいと思います。ユーザーはa、b、c、A、B、Cの中のいくつかのデータをプロシージャに送ります(簡単にするために必要な場合は、無限に多くのソリューションがある状況をユーザーが避けることができます)。プロシージャは他のものを計算します。状況に応じて、通常、正弦の法則または余弦の法則を使用する必要があります。

私は関数のグラフを表示したいMathクラスのため、Mapleで実装します。 Mapleがあなたの答えに適していない場合は、別の言語を提案してください(私は、JavaとPythonの初心者を適度に受け入れています)。

私の素朴なアイデアは、条件付きの指示if ... then ... elseを使用して手元にあるケースを判断することですが、ちょっと退屈です。 Javaはスイッチを持っています。これは、物事をより短く明確にすることができますが、よりスマートな構造を望んでいます。

私の質問:いくつかの変数は既知の関係によって関連付けられているとします。いくつかの値しか与えられていないときに、欠落している変数を決定するための手続きを整理する簡単で明確な方法はありますか?

PS:どうすればこの質問にタグを付けるべきかわかりません。どんな提案も大歓迎です。

答えて

1

名前に対応するデフォルト値(A、B、C、a、b、c)を使用して、プロシージャのすべての引数をオプションにすることができます。 欠落している変数はすべて 'numeric'型でないものと仮定できるので、どの変数がまだ値を持たないかを素早く判断し、それらを値としてsolveコマンドに渡すのは簡単です残りの辺または角度。次の呼び出し

trisolve := proc({ side1::{positive,symbol} := A, side2::{positive,symbol} := B, side3::{positive,symbol} := C, 
        angle1::{positive,symbol} := a, angle2::{positive,symbol} := b, angle3::{positive,symbol} := c }) 
    local missing := remove(hastype, [ side1, side2, side3, angle1, angle2, angle3 ], numeric); 

    return solve({ 180 = angle1 + angle2 + angle3, 
       side1/sin(angle1*Pi/180)=side2/sin(angle2*Pi/180), 
       side1/sin(angle1*Pi/180)=side3/sin(angle3*Pi/180), 
       side2/sin(angle2*Pi/180)=side3/sin(angle3*Pi/180), 
       side1^2=side2^2+side3^2-2*side2*side3*cos(angle1) }, 
       missing); 
end proc: 

trisolve(side1 = 1, angle1 = 90, angle2 = 45); 

リターン:

[B = (1/2)*sqrt(2), C = (1/2)*sqrt(2), c = 45] 
+0

おかげで、次のような

何かが良いスタートである可能性があります。私は似たような解決策を思いついた。サインの法則は十分ではなく、方程式のリストにコサインの法則を加えるべきであることに注意してください。変数の宣言には問題がありました。私はラジアンとPi/2のような式に '*'型の式を使用します。また、arctan(sqrt(2)/ 2、sqrt(2)/ 2)のような「奇妙な」結果が返されます。解を再度表示すると、Pi/4のような簡略化された式が表示されます。 – Taladris