Re: Triangles and trigonometry
- To: mathgroup at smc.vnet.net
- Subject: [mg15036] Re: [mg15000] Triangles and trigonometry
- From: BobHanlon at aol.com
- Date: Wed, 9 Dec 1998 04:12:21 -0500
- Sender: owner-wri-mathgroup at wolfram.com
In a message dated 12/5/98 4:56:25 AM, gabrielle at XXXpsy.uwa.edu.au writes: >Does anyone know of a package suitable for solving triginometry >problems such as > >(Upper case are angles, lower case is opposite side) > >A=12 Degree >a=5 >b=17 >C<90 Degree > >I've written something (which works) using repeated applications of >Solve with the Sin and Cos rules which does the job very badly(!). >However, it doesn't cope with the _generic_ case of _any_ mixture of >(minimally sufficient) information, and I've had to go about the >solution in several steps to get it to work properly. > Mark, I haven't tested this notebook very extensively; however, I think it works. Bob Hanlon ___________________________ Notebook[{ Cell["Off[General::spell1, Solve::ifun];", "Input"], Cell[CellGroupData[{ Cell["\<\ soln = Solve[{a == 3, b == 4, c == 5, \ta^2 == b^2 + c^2 - 2*b*c*Cos[A], \tb^2 == a^2 + c^2 - 2*a*c*Cos[B], \tA + B + C == Pi}, {a, b, c, A, B, C}]\ \>", "Input"], Cell[BoxData[ \({{C \[Rule] \[Pi] - ArcCos[3\/5] - ArcCos[4\/5], a \[Rule] 3, b \[Rule] 4, c \[Rule] 5, B \[Rule] ArcCos[3\/5], A \[Rule] ArcCos[4\/5]}}\)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["\<\ soln = Solve[{A == 12. Degree, a == 5., b == 17., \ta^2 == b^2 + c^2 - 2*b*c*Cos[A], \tb^2 == a^2 + c^2 - 2*a*c*Cos[B], \tA + B + C == Pi}, {a, b, c, A, B, C}]; soln // ColumnForm\ \>", "Input"], Cell[BoxData[ InterpretationBox[GridBox[{ { \({C \[Rule] 0.575665907967170209`, a \[Rule] 5.`, b \[Rule] 17.`, c \[Rule] 13.0919404475054879`, B \[Rule] 2.35648723538330351`, A \[Rule] 0.20943951023931957`} \)}, { \({C \[Rule] 2.14704772514398412`, a \[Rule] 5.`, b \[Rule] 17.`, c \[Rule] 20.1650779774439037`, B \[Rule] 0.785105418206489691`, A \[Rule] 0.20943951023931957`} \)}, { \({C \[Rule] 3.71725856155696332`, a \[Rule] 5.`, b \[Rule] 17.`, c \[Rule] 20.1650779774439037`, B \[Rule] \(-0.785105418206489691`\), A \[Rule] 0.20943951023931957`}\)}, { \({C \[Rule] 5.28864037873377679`, a \[Rule] 5.`, b \[Rule] 17.`, c \[Rule] 13.0919404475054879`, B \[Rule] \(-2.35648723538330351`\), A \[Rule] 0.20943951023931957`}\)} }, GridBaseline->{Baseline, {1, 1}}, ColumnAlignments->{Left}], ColumnForm[ {{C -> 0.57566590796717021, a -> 5.0, b -> 17.0, c -> 13.091940447505488, B -> 2.3564872353833035, A -> 0.20943951023931956}, {C -> 2.1470477251439841, a -> 5.0, b -> 17.0, c -> 20.165077977443904, B -> 0.78510541820648971, A -> 0.20943951023931956}, {C -> 3.7172585615569633, a -> 5.0, b -> 17.0, c -> 20.165077977443904, B -> -0.78510541820648971, A -> 0.20943951023931956}, {C -> 5.2886403787337768, a -> 5.0, b -> 17.0, c -> 13.091940447505488, B -> -2.3564872353833035, A -> 0.20943951023931956}}], Editable->False]], "Output"], Cell["\<\ Note that the last two solutions include negative angles. \ Excluding solutions with any negative values:\ \>", "Text"], Cell[CellGroupData[{ Cell["\<\ Select[soln, Min[({a, b, c, A, B, C} /. #)] > 0&] // \ ColumnForm\ \>", "Input"], Cell[BoxData[ InterpretationBox[GridBox[{ { \({C \[Rule] 0.575665907967170209`, a \[Rule] 5.`, b \[Rule] 17.`, c \[Rule] 13.0919404475054879`, B \[Rule] 2.35648723538330351`, A \[Rule] 0.20943951023931957`} \)}, { \({C \[Rule] 2.14704772514398412`, a \[Rule] 5.`, b \[Rule] 17.`, c \[Rule] 20.1650779774439037`, B \[Rule] 0.785105418206489691`, A \[Rule] 0.20943951023931957`} \)} }, GridBaseline->{Baseline, {1, 1}}, ColumnAlignments->{Left}], ColumnForm[ {{C -> 0.57566590796717021, a -> 5.0, b -> 17.0, c -> 13.091940447505488, B -> 2.3564872353833035, A -> 0.20943951023931956}, {C -> 2.1470477251439841, a -> 5.0, b -> 17.0, c -> 20.165077977443904, B -> 0.78510541820648971, A -> 0.20943951023931956}}], Editable->False]], "Output"] }, Open ]] }, Open ]], Cell["\<\ It is the same problem if we interchange a and b and A and B; \ however,\ \>", "Text"], Cell[CellGroupData[{ Cell["\<\ Solve[{B == 12. Degree, b == 5., a == 17., \ta^2 == b^2 + c^2 - 2*b*c*Cos[A], \tb^2 == a^2 + c^2 - 2*a*c*Cos[B], \tA + B + C == Pi}, {a, b, c, A, B, C}]// \tColumnForm\ \>", "Input"], Cell[BoxData[ \(Solve::"incnst" \( : \ \) "Inconsistent or redundant transcendental equation. After reduction, \ the bad equation is \!\(\(-69696\) - \(6600\\ \(Cos[A]\)\^2\) + \(76296\\ \ \(Cos[B]\)\^2\)\) == 0."\)], "Message"], Cell[BoxData[ InterpretationBox[GridBox[{ { RowBox[{"{", RowBox[{\(B == 0.20943951023931957`\), ",", RowBox[{"b", "==", StyleBox["5.`", StyleBoxAutoDelete->True, PrintPrecision->1]}], ",", RowBox[{"a", "==", StyleBox["17.`", StyleBoxAutoDelete->True, PrintPrecision->2]}], ",", \(a\^2 == b\^2 + c\^2 - 2\ b\ c\ Cos[A]\), ",", \(b\^2 == a\^2 + c\^2 - 2\ a\ c\ Cos[B]\), ",", \(A + B + C == \[Pi]\)}], "}"}]}, {\({a, b, c, A, B, C}\)} }, GridBaseline->{Baseline, {1, 1}}, ColumnAlignments->{Left}], ColumnForm[ Solve[ { Equal[ B, 0.20943951023931956], Equal[ b, 5.0], Equal[ a, 17.0], Equal[ Power[ a, 2], Plus[ Power[ b, 2], Power[ c, 2], Times[ -2, b, c, Cos[ A]]]], Equal[ Power[ b, 2], Plus[ Power[ a, 2], Power[ c, 2], Times[ -2, a, c, Cos[ B]]]], Equal[ Plus[ A, B, C], Pi]}, {a, b, c, A, B, C}]], Editable->False]], "Output"] }, Open ]], Cell[TextData[{ "It appears that the canonical order of the variables affects whether ", StyleBox["Mathematica", FontSlant->"Italic"], " can solve the equations. One approach is to use dummy variables which \ force the required canonical order." }], "Text"], Cell["\<\ pythagorum::usage = \"pythagorum[valuesList] solves the Pythagorum \ttheorem given (in the form of equations) either two sides and \tan angle, two angles and a side, or three sides. \tpythagorum[valuesList, condition] adds a condition on one of \tthe variables. pythagorum[valuesList, condition, variableList] \talso specifies the variable names for the sides and \tcorresponding opposite angles.\"; pythagorum[values_List, cond_:True, var_List:{a,b,c,A,B,C}] := \tModule[{eqns, soln, i, given, ord, \tva, vb, vc, vA, vB, vC, vVar, ordVar}, \tvVar = {va, vb, vc, vA, vB, vC}; \tgiven = Sort[Table[values[[i, 1]], {i, 3}], \t\tPosition[var, #1][[1,1]] > 3&]; \tord = Join[{i = Mod[Position[var, given[[1]]][[1,1]] - 1, 3] + 1}, \t\tComplement[{1,2,3}, {i}]]; \tordVar = {var[[ord[[1]]]], var[[ord[[2]]]], var[[ord[[3]]]], \t\tvar[[ord[[1]]+3]], var[[ord[[2]]+3]], var[[ord[[3]]+3]]}; \teqns = {va^2 == vb^2 + vc^2 - 2*vb*vc*Cos[vA], \t\tvb^2 == va^2 + vc^2 - 2*va*vc*Cos[vB], \t\tvA + vB + vC == Pi}; \tsoln = Chop[Solve[Join[ \t\tvalues /. Inner[Rule, ordVar, vVar, List], eqns], vVar]]; \tsoln = Select[soln, Min[(vVar /. #)] > 0&]; \tsoln = soln /. Inner[Rule, vVar, ordVar, List]; \tSort /@ Select[soln, (cond /. #)&]]\ \>", "Input"], Cell[CellGroupData[{ Cell["pythagorum[{A == 12. Degree, a == 5., b == 17.}]//ColumnForm", "Input"], Cell[BoxData[ InterpretationBox[GridBox[{ { \({a \[Rule] 5.`, A \[Rule] 0.20943951023931957`, b \[Rule] 17.`, B \[Rule] 2.35648723538330351`, c \[Rule] 13.0919404475054879`, C \[Rule] 0.575665907967170209`}\)}, { \({a \[Rule] 5.`, A \[Rule] 0.20943951023931957`, b \[Rule] 17.`, B \[Rule] 0.785105418206489691`, c \[Rule] 20.1650779774439037`, C \[Rule] 2.14704772514398412`} \)} }, GridBaseline->{Baseline, {1, 1}}, ColumnAlignments->{Left}], ColumnForm[ {{a -> 5.0, A -> 0.20943951023931956, b -> 17.0, B -> 2.3564872353833035, c -> 13.091940447505488, C -> 0.57566590796717021}, {a -> 5.0, A -> 0.20943951023931956, b -> 17.0, B -> 0.78510541820648971, c -> 20.165077977443904, C -> 2.1470477251439841}}], Editable->False]], "Output"] }, Open ]], Cell["Now when the variables are interchanged", "Text"], Cell[CellGroupData[{ Cell["pythagorum[{B == 12. Degree, b == 5., a == 17.}]//ColumnForm", "Input"], Cell[BoxData[ InterpretationBox[GridBox[{ { \({a \[Rule] 17.`, A \[Rule] 2.35648723538330351`, b \[Rule] 5.`, B \[Rule] 0.20943951023931957`, c \[Rule] 13.0919404475054879`, C \[Rule] 0.575665907967170209`}\)}, { \({a \[Rule] 17.`, A \[Rule] 0.785105418206489691`, b \[Rule] 5.`, B \[Rule] 0.20943951023931957`, c \[Rule] 20.1650779774439037`, C \[Rule] 2.14704772514398412`} \)} }, GridBaseline->{Baseline, {1, 1}}, ColumnAlignments->{Left}], ColumnForm[ {{a -> 17.0, A -> 2.3564872353833035, b -> 5.0, B -> 0.20943951023931956, c -> 13.091940447505488, C -> 0.57566590796717021}, {a -> 17.0, A -> 0.78510541820648971, b -> 5.0, B -> 0.20943951023931956, c -> 20.165077977443904, C -> 2.1470477251439841}}], Editable->False]], "Output"] }, Open ]], Cell["\<\ If there is more than one solution, a condition can be set to \ select the desired solution:\ \>", "Text"], Cell[CellGroupData[{ Cell["\<\ pythagorum[{A == 12. Degree, a == 5., b == 17.}, C <= 90 \ Degree]\ \>", "Input"], Cell[BoxData[ \({{a \[Rule] 5.`, A \[Rule] 0.20943951023931957`, b \[Rule] 17.`, B \[Rule] 2.35648723538330351`, c \[Rule] 13.0919404475054879`, C \[Rule] 0.575665907967170209`}}\)], "Output"] }, Open ]], Cell["Exact solutions can also be found:", "Text"], Cell[CellGroupData[{ Cell["\<\ pythagorum[{A == 12 Degree, a == 5, b == 17}, C <= 90 Degree]\ \>", "Input"], Cell[BoxData[ \({{a \[Rule] 5, A \[Rule] 12\ Degree, b \[Rule] 17, B \[Rule] ArcCos[\(-\(1\/5\)\)\ \ at \(\(-264\) + 289\ Cos[12\ Degree]\^2\)], c \[Rule] 17\ Cos[12\ Degree] - \ at \(\(-264\) + 289\ Cos[12\ Degree]\^2\), C \[Rule] \(-12\)\ Degree + \[Pi] - ArcCos[\(-\(1\/5\)\)\ \ at \(\(-264\) + 289\ Cos[12\ Degree]\^2\)]}} \)], "Output"] }, Open ]], Cell["\<\ Any names for the variables can be specified provided they are \ given with the sides first and then the corresponding angles.\ \>", "Text"], Cell[CellGroupData[{ Cell["\<\ pythagorum[{angleB == 12. Degree, sideA == 5., sideB == 17.}, True, \ \t{sideA, sideB, sideC, angleA, angleB, angleC}]\ \>", "Input"], Cell[BoxData[ \({{angleA \[Rule] 0.0611886724307138063`, angleB \[Rule] 0.20943951023931957`, angleC \[Rule] 2.87096447091975992`, sideA \[Rule] 5.`, sideB \[Rule] 17.`, sideC \[Rule] 21.8589234759147998`}}\)], "Output"] }, Open ]], Cell["\<\ You can also specify two angles and one side. However, the \ algorithm in this case is considerably slower.\ \>", "Text"], Cell[CellGroupData[{ Cell["pythagorum[{A == 12. Degree, B == 5. Degree, a == 17.}]", "Input"], Cell[BoxData[ \({{a \[Rule] 17.`, A \[Rule] 0.20943951023931957`, b \[Rule] 7.12633147699662661`, B \[Rule] 0.0872664625997164833`, c \[Rule] 23.9059139038177237`, C \[Rule] 2.84488668075075743`}}\)], "Output"] }, Open ]], Cell["Specifying three sides", "Text"], Cell[CellGroupData[{ Cell["pythagorum[{a == 3, b == 4, c == 5}]", "Input"], Cell[BoxData[ \({{a \[Rule] 3, A \[Rule] ArcCos[4\/5], b \[Rule] 4, B \[Rule] \[Pi]\/2 - ArcCos[4\/5], c \[Rule] 5, C \[Rule] \[Pi]\/2}} \)], "Output"] }, Open ]], Cell[CellGroupData[{ Cell["pythagorum[{a == 3.5, b == 4.7, c == 5.2}]", "Input"], Cell[BoxData[ \({{a \[Rule] 3.5`, A \[Rule] 0.715903141062576331`, b \[Rule] 4.70000000000000017`, B \[Rule] 1.07863990696806744`, c \[Rule] 5.20000000000000017`, C \[Rule] 1.34704960555914965`}}\)], "Output"] }, Open ]] }, FrontEndVersion->"Macintosh 3.0", ScreenRectangle->{{0, 1024}, {0, 748}}, CellGrouping->Manual, WindowSize->{956, 721}, WindowMargins->{{4, Automatic}, {Automatic, 1}}, ShowCellLabel->False, MacintoshSystemPageSetup->"\<\ 00<0001804P000000]P2:?oQon82n at 960dL5:0?l0080001804P000000]P2:001 0000I00000400`<300000BL?00400 at 0000000000000006P801T1T00000000000 00000000000000000000000000000000\>" ]