From 6c010c99fa9289fbec4507631eaf0f5cb01dedc5 Mon Sep 17 00:00:00 2001 From: Aron T Date: Fri, 15 Aug 2025 13:40:58 +0300 Subject: [PATCH 1/5] Update copilot instructions for mathematical symbols --- .github/copilot-instructions.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 5f0b613..3ea1810 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -252,6 +252,7 @@ triangle_area_perim(a::Float64, b::Float64, c::Float64) -> Tuple{Float64, Float6 ## Documentation Patterns - Use LaTeX for all mathematical notation +- Use LaTeX syntax for mathematical symbols not Unicode e.g. "^\circ" instead of "°" - Use Markdown for explanations - After creating or editing a markdown document always review and fix all linting issues, unless the document is a configuration file of some kind - Follow the pattern of existing function documentation in src directory From 798b0954bf638bdc9b7794bf6c01528b5c2cf69f Mon Sep 17 00:00:00 2001 From: Aron T Date: Sun, 24 Aug 2025 19:44:36 +0300 Subject: [PATCH 2/5] Enhance: uuse of Trigonometric functions: - Add to documentation how Cosine law is extension of Pythagorean function - Add example in notebook of two sides and an angle --- .../02 Trigonometric Functions.md | 4 +- notebooks/Basics.ipynb | 693 ++++++++---------- 2 files changed, 294 insertions(+), 403 deletions(-) diff --git a/docs/src/Trigonometry/02 Trigonometric Functions.md b/docs/src/Trigonometry/02 Trigonometric Functions.md index d80f803..604491e 100644 --- a/docs/src/Trigonometry/02 Trigonometric Functions.md +++ b/docs/src/Trigonometry/02 Trigonometric Functions.md @@ -215,7 +215,9 @@ This law is particularly useful when you know: For any triangle with sides $a$, $b$, $c$ and angle $C$ opposite side $c$: $$c^2 = a^2 + b^2 - 2ab\cos C$$ -This generalizes the Pythagorean theorem and is useful when you know: +This generalizes the Pythagorean theorem: If the special case of a right triangle with vertices $A$, $B$, and $C$ is present – for example, if $C = 90^\circ$, then $\cos(C) = \cos(90^\circ) = 0$, and the term $2ab \cos(C)$ will also be 0. So in this case, the cosine theorem gives $c^2 = a^2 + b^2$, which is nothing more than the statement of Pythagoras’ theorem for right triangles. + +The Cosine Law is useful when you know: - Three sides (SSS) - Two sides and the included angle (SAS) diff --git a/notebooks/Basics.ipynb b/notebooks/Basics.ipynb index 05249a0..ee9724d 100644 --- a/notebooks/Basics.ipynb +++ b/notebooks/Basics.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -35,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -50,7 +50,7 @@ "-3b + 12a*(b^2) + 18(b^3) - 12(a^2)*(b^2) - 18a*(b^3)" ] }, - "execution_count": 2, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -78,8 +78,9 @@ "-3b + 12a*(b^2) + 18(b^3) - 12(a^2)*(b^2) - 18a*(b^3)" ] }, + "execution_count": 35, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -97,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -106,8 +107,9 @@ "1//108" ] }, + "execution_count": 36, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -116,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -125,8 +127,9 @@ "169//361" ] }, + "execution_count": 37, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -135,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -144,8 +147,9 @@ "13//2" ] }, + "execution_count": 38, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -161,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -170,8 +174,9 @@ "1.14729 + 0.18171im" ] }, + "execution_count": 39, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -180,7 +185,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -189,8 +194,9 @@ "-20.0 + 0.0im" ] }, + "execution_count": 40, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -199,7 +205,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -214,8 +220,9 @@ "-3b + 12a*(b^2) + 18(b^3) - 12(a^2)*(b^2) - 18a*(b^3)" ] }, + "execution_count": 41, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -232,23 +239,18 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "1 * x * a * (b*x + y) * y" - ], - "text/latex": [ - "1 \\cdot x \\cdot a \\cdot \\left(b x + y\\right) \\cdot y" - ], "text/plain": [ "1 * x * a * (b*x + y) * y" ] }, + "execution_count": 42, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -260,7 +262,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -272,8 +274,9 @@ "L\"$\\begin{equation}1 * x * a * (b*x + y) * y\\end{equation}$\"" ] }, + "execution_count": 43, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -288,23 +291,18 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 44, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "a*x*y" - ], - "text/latex": [ - "a x y" - ], "text/plain": [ "a*x*y" ] }, + "execution_count": 44, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -313,23 +311,18 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 45, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "-1 * 3 * (2*a*x - 2*b*x^2 - 4*b - x) * a" - ], - "text/latex": [ - "-1 \\cdot 3 \\cdot \\left(2 a x - 2 b x^{2} - 4 b - x\\right) \\cdot a" - ], "text/plain": [ "-1 * 3 * (2*a*x - 2*b*x^2 - 4*b - x) * a" ] }, + "execution_count": 45, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -338,23 +331,18 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 46, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "3*a" - ], - "text/latex": [ - "3 a" - ], "text/plain": [ "3*a" ] }, + "execution_count": 46, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -363,23 +351,18 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 47, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "17*y" - ], - "text/latex": [ - "17 y" - ], "text/plain": [ "17*y" ] }, + "execution_count": 47, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -388,23 +371,18 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 48, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "1 * b * 2 * a * (a - 2*b + 4*c) * c" - ], - "text/latex": [ - "1 \\cdot b \\cdot 2 \\cdot a \\cdot \\left(a - 2 b + 4 c\\right) \\cdot c" - ], "text/plain": [ "1 * b * 2 * a * (a - 2*b + 4*c) * c" ] }, + "execution_count": 48, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -413,23 +391,18 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 49, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "2*a*b*c" - ], - "text/latex": [ - "2 a b c" - ], "text/plain": [ "2*a*b*c" ] }, + "execution_count": 49, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -438,23 +411,18 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 50, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "(4*x - 2*y)//y" - ], - "text/latex": [ - "\\frac{4 x - 2 y}{y}" - ], "text/plain": [ "(4*x - 2*y)//y" ] }, + "execution_count": 50, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -463,23 +431,18 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 51, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "1 * (2*x - y) * 2" - ], - "text/latex": [ - "1 \\cdot \\left(2 x - y\\right) \\cdot 2" - ], "text/plain": [ "1 * (2*x - y) * 2" ] }, + "execution_count": 51, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -488,23 +451,18 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 52, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "(-2*a*x + 2*b*x^2 + 4*b + x)//(2*a*x - 4*x^2 + 2*x*y^2)" - ], - "text/latex": [ - "\\frac{-2 a x + 2 b x^{2} + 4 b + x}{2 a x - 4 x^{2} + 2 x y^{2}}" - ], "text/plain": [ "(-2*a*x + 2*b*x^2 + 4*b + x)//(2*a*x - 4*x^2 + 2*x*y^2)" ] }, + "execution_count": 52, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -518,23 +476,18 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 53, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "1 * (a - 2*x + y^2) * x * 2" - ], - "text/latex": [ - "1 \\cdot \\left(a - 2 x + y^{2}\\right) \\cdot x \\cdot 2" - ], "text/plain": [ "1 * (a - 2*x + y^2) * x * 2" ] }, + "execution_count": 53, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -543,23 +496,18 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 54, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "(2*b*c^2)//(c - 2)" - ], - "text/latex": [ - "\\frac{2 b c^{2}}{c - 2}" - ], "text/plain": [ "(2*b*c^2)//(c - 2)" ] }, + "execution_count": 54, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -568,23 +516,18 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 55, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "(3*x^3)//y^3" - ], - "text/latex": [ - "\\frac{3 x^{3}}{y^{3}}" - ], "text/plain": [ "(3*x^3)//y^3" ] }, + "execution_count": 55, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -601,7 +544,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 56, "metadata": {}, "outputs": [ { @@ -610,8 +553,9 @@ "-2.0" ] }, + "execution_count": 56, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -622,7 +566,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -631,8 +575,9 @@ "0.0 + 2.8284271247461903im" ] }, + "execution_count": 57, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -643,7 +588,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 58, "metadata": {}, "outputs": [ { @@ -674,7 +619,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 59, "metadata": {}, "outputs": [], "source": [ @@ -699,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 60, "metadata": {}, "outputs": [ { @@ -717,109 +662,61 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ], "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "" ] }, + "execution_count": 60, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -833,7 +730,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 61, "metadata": {}, "outputs": [ { @@ -852,7 +749,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 62, "metadata": {}, "outputs": [ { @@ -862,103 +759,58 @@ "\n", "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", + "\n", "\n", - " \n", + " \n", " \n", " \n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", "\n" ], "text/html": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "" ] }, + "execution_count": 62, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -972,19 +824,20 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2-element Vector{Float64}:\n", - " -0.4142135623730951\n", - " 2.414213562373095" + " 2.414213562373095\n", + " -0.4142135623730951" ] }, + "execution_count": 63, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -993,41 +846,26 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 64, "metadata": {}, "outputs": [ { - "data": { - "image/png": "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", - "text/html": [ - "" - ], - "text/plain": [ - "400×600 Matrix{RGB{FixedPointNumbers.N0f8}}:\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) … RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) … RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " ⋮ ⋱ \n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) … RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)\n", - " RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0) RGB(1.0, 1.0, 1.0)" - ] - }, - "metadata": {}, - "output_type": "display_data" + "ename": "LoadError", + "evalue": "ArgumentError: No file exists at given path: plots/20250522-183753parabolaAMRVW.png", + "output_type": "error", + "traceback": [ + "ArgumentError: No file exists at given path: plots/20250522-183753parabolaAMRVW.png", + "", + "Stacktrace:", + " [1] \u001b[0m\u001b[1mcheckpath_load\u001b[22m\u001b[0m\u001b[1m(\u001b[22m\u001b[90mfile\u001b[39m::\u001b[0mString\u001b[0m\u001b[1m)\u001b[22m", + "\u001b[90m @\u001b[39m \u001b[35mFileIO\u001b[39m \u001b[90m~/.julia/packages/FileIO/ePyCW/src/\u001b[39m\u001b[90m\u001b[4mloadsave.jl:167\u001b[24m\u001b[39m", + " [2] \u001b[0m\u001b[1mload\u001b[22m\u001b[0m\u001b[1m(\u001b[22m::\u001b[0mString; \u001b[90moptions\u001b[39m::\u001b[0m@Kwargs\u001b[90m{}\u001b[39m\u001b[0m\u001b[1m)\u001b[22m", + "\u001b[90m @\u001b[39m \u001b[35mFileIO\u001b[39m \u001b[90m~/.julia/packages/FileIO/ePyCW/src/\u001b[39m\u001b[90m\u001b[4mloadsave.jl:110\u001b[24m\u001b[39m", + " [3] \u001b[0m\u001b[1mload\u001b[22m\u001b[0m\u001b[1m(\u001b[22m::\u001b[0mString\u001b[0m\u001b[1m)\u001b[22m", + "\u001b[90m @\u001b[39m \u001b[35mFileIO\u001b[39m \u001b[90m~/.julia/packages/FileIO/ePyCW/src/\u001b[39m\u001b[90m\u001b[4mloadsave.jl:109\u001b[24m\u001b[39m", + " [4] top-level scope", + "\u001b[90m @\u001b[39m \u001b[90m\u001b[4mIn[64]:2\u001b[24m\u001b[39m" + ] } ], "source": [ @@ -1037,7 +875,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1058,7 +896,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1102,7 +940,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1123,7 +961,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1181,7 +1019,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1212,7 +1050,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1330,7 +1168,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1526,7 +1364,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1629,7 +1467,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1703,7 +1541,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1808,7 +1646,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1857,7 +1695,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1962,7 +1800,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2020,7 +1858,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2064,7 +1902,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2090,7 +1928,7 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2130,7 +1968,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2164,7 +2002,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2189,7 +2027,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2210,7 +2048,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2231,7 +2069,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2259,7 +2097,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2281,7 +2119,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2303,7 +2141,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2324,7 +2162,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2346,7 +2184,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2368,7 +2206,7 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2387,7 +2225,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2408,7 +2246,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2429,7 +2267,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2448,7 +2286,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2467,7 +2305,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2487,7 +2325,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2526,7 +2364,7 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2592,7 +2430,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2625,9 +2463,34 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[36m\u001b[1m[ \u001b[22m\u001b[39m\u001b[36m\u001b[1mInfo: \u001b[22m\u001b[39mPrecompiling Math_Foundations [60a1b6a0-5642-50e0-92f2-3fdeb326bb73] (cache misses: wrong dep version loaded (2), incompatible header (2), mismatched flags (2))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Welcome to Nemo version 0.49.5\n", + "\n", + "Nemo comes with absolutely no warranty whatsoever\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[36m\u001b[1m[ \u001b[22m\u001b[39m\u001b[36m\u001b[1mInfo: \u001b[22m\u001b[39mPrecompiling FileIOExt [f5f51d8f-5827-5d2e-939b-192fcd6ec70c] (cache misses: wrong dep version loaded (4), incompatible header (14))\n" + ] + } + ], "source": [ "# Set up Revise.jl for automatic code reloading\n", "# This only needs to be run once at the beginning of your notebook session\n", @@ -2657,17 +2520,9 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": null, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: using Meshes.simplify in module Main conflicts with an existing identifier.\n", - "WARNING: using Makie.plot in module Main conflicts with an existing identifier.\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -2682,8 +2537,9 @@ "" ] }, + "execution_count": 3, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -2700,7 +2556,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2717,8 +2573,9 @@ "" ] }, + "execution_count": 4, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -2729,7 +2586,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2746,8 +2603,9 @@ "" ] }, + "execution_count": 5, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -2758,7 +2616,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2779,7 +2637,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2809,7 +2667,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2840,7 +2698,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2857,8 +2715,9 @@ "" ] }, + "execution_count": 9, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -2877,7 +2736,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2947,7 +2806,7 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -2975,7 +2834,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3037,7 +2896,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3079,7 +2938,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3109,7 +2968,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3149,7 +3008,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3180,7 +3039,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -3205,13 +3064,43 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Trigonometric Functions\n" + "### Using Trigonometric Laws with non-Right Triangles\n" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 14, "metadata": {}, - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cosine Law:\n", + "side b: 2\n", + "side c: 3\n", + "angle α: 30\n", + "side a is b^2 + c^2 - 2 * cos(α) * b * c: 1.61484\n", + "angle β is acos((a^2 + c^2 - b^2) / (2 * a * c)): 38.26197 degrees\n", + "angle γ is 180 - α - β: 111.73803 degrees\n" + ] + } + ], + "source": [ + "println(\"Cosine Law:\")\n", + "b = 2\n", + "println(\"side b: \", b)\n", + "c = 3\n", + "println(\"side c: \", c)\n", + "α = 30\n", + "println(\"angle α: \", α)\n", + "a = sqrt(b^2 + c^2 - (2 * cosd(α) * b * c))\n", + "println(\"side a is b^2 + c^2 - 2 * cos(α) * b * c: \", round(a; digits=5))\n", + "β = acosd((a^2 + c^2 - b^2) / (2 * a * c))\n", + "println(\"angle β is acos((a^2 + c^2 - b^2) / (2 * a * c)): \", round(β; digits=5), \" degrees\")\n", + "γ = 180 - α - β\n", + "println(\"angle γ is 180 - α - β: \", round(γ; digits=5), \" degrees\")" + ] } ], "metadata": { From 4a5923ae8d67e6370f5f87ea1e7ce7006c2f48e8 Mon Sep 17 00:00:00 2001 From: Aron T Date: Sun, 31 Aug 2025 17:18:54 +0300 Subject: [PATCH 3/5] Enhance: use of Trigonometric functions: - Add to documentation alternative forms of the Sine Law - Add to documenation of Cosine law information about isosceles triangles and equilateral triangles - Add examples in notebook of the Cosine Law --- .../02 Trigonometric Functions.md | 49 ++++++++++++ notebooks/Basics.ipynb | 77 ++++++++++++------- 2 files changed, 99 insertions(+), 27 deletions(-) diff --git a/docs/src/Trigonometry/02 Trigonometric Functions.md b/docs/src/Trigonometry/02 Trigonometric Functions.md index 604491e..b8e5c33 100644 --- a/docs/src/Trigonometry/02 Trigonometric Functions.md +++ b/docs/src/Trigonometry/02 Trigonometric Functions.md @@ -181,6 +181,12 @@ The [Sine Law](https://mathworld.wolfram.com/LawofSines.html) and [Cosine Law](h For any triangle with sides $a$, $b$, $c$ and opposite angles $A$, $B$, $C$: $$\frac{a}{\sin A} = \frac{b}{\sin B} = \frac{c}{\sin C}$$ +In other words, the sine law states that the quotient of two side lengths of a triangle +gives the same value as the quotient of the sines of the opposite interior angles (also: +opposite angles): + +$$\frac{a}{b} = \frac{\sin A}{\sin B}, \quad \frac{b}{c} = \frac{\sin B}{\sin C}, \quad \frac{c}{a} = \frac{\sin C}{\sin A}$$ + This law is particularly useful when you know: - Two angles and one side (AAS or ASA) @@ -192,6 +198,7 @@ This law is particularly useful when you know: **Find:** Side $b$. **Solution:** + 1. First find angle $C$: $C = 180^\circ - A - B = 180^\circ - 30^\circ - 45^\circ = 105^\circ$ 2. Apply the Sine Law: $\frac{a}{\sin A} = \frac{b}{\sin B}$ 3. Substitute: $\frac{10}{\sin 30^\circ} = \frac{b}{\sin 45^\circ}$ @@ -203,6 +210,7 @@ This law is particularly useful when you know: **Find:** Angle $B$. **Solution:** + 1. Apply the Sine Law: $\frac{a}{\sin A} = \frac{b}{\sin B}$ 2. Rearrange: $\sin B = \frac{b \sin A}{a}$ 3. Substitute: $\sin B = \frac{10 \times \sin 30^\circ}{8} = \frac{10 \times \frac{1}{2}}{8} = \frac{5}{8} = 0.625$ @@ -228,6 +236,7 @@ The Cosine Law is useful when you know: **Find:** Side $c$. **Solution:** + 1. Apply the Cosine Law: $c^2 = a^2 + b^2 - 2ab\cos C$ 2. Substitute: $c^2 = 8^2 + 6^2 - 2(8)(6)\cos 60^\circ$ 3. Calculate: $c^2 = 64 + 36 - 96 \times \frac{1}{2} = 100 - 48 = 52$ @@ -239,10 +248,50 @@ The Cosine Law is useful when you know: **Find:** Angle $C$. **Solution:** + 1. Rearrange the Cosine Law: $\cos C = \frac{a^2 + b^2 - c^2}{2ab}$ 2. Substitute: $\cos C = \frac{5^2 + 7^2 - 9^2}{2(5)(7)} = \frac{25 + 49 - 81}{70} = \frac{-7}{70} = -0.1$ 3. Solve: $C = \arccos(-0.1) \approx 95.74^\circ$ +#### Cosine Law and Isosceles Triangles + +In isosceles triangles, where two sides are equal (say $a = b$), the Cosine Law simplifies significantly. + +For angle $A$ opposite side $a$, we have: + +$$\begin{aligned} +\cos A &= \frac{b^2 + c^2 - a^2}{2bc} \\ +&= \frac{a^2 + c^2 - a^2}{2ac} \\ +&= \frac{c^2}{2ac} \\ +&= \frac{c}{2a} +\end{aligned}$$ + +For angle $B$ opposite side $b$, we have: + +$$\begin{aligned} +\cos B &= \frac{a^2 + c^2 - b^2}{2ac} \\ +&= \frac{a^2 + c^2 - a^2}{2ac} \\ +&= \frac{c^2}{2ac} \\ +&= \frac{c}{2a} +\end{aligned}$$ + +So the adjacent interior angles $A$ and $B$ are equal. + +For the apex angle $C$ opposite the base $c$, we have: $C = 180 - 2A$. + +This relationship can be particularly useful for finding angles or sides in isosceles triangles. + +#### Cosine Law and Equilateral Triangles + +In equilateral triangles, all sides are equal (say $a = b = c$), and all angles are equal ($A = B = C = 60^\circ$). The Cosine Law simplifies significantly: + +$$\begin{aligned} +\cos A &= \frac{b^2 + c^2 - a^2}{2bc} \\ +&= \frac{a^2 + a^2 - a^2}{2a^2} \\ +&= \frac{a^2}{2a^2} \\ +&= \frac{1}{2} +\end{aligned}$$ + ## Hyperbolic Functions Mathematical [hyperbolic functions](https://en.wikipedia.org/wiki/Hyperbolic_functions) are analogs of trigonometric functions based on the hyperbola $x^2 - y^2 = 1$. While trigonometric functions are defined using the unit circle, hyperbolic functions are defined using the unit hyperbola. diff --git a/notebooks/Basics.ipynb b/notebooks/Basics.ipynb index ee9724d..344dcda 100644 --- a/notebooks/Basics.ipynb +++ b/notebooks/Basics.ipynb @@ -2463,34 +2463,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[36m\u001b[1m[ \u001b[22m\u001b[39m\u001b[36m\u001b[1mInfo: \u001b[22m\u001b[39mPrecompiling Math_Foundations [60a1b6a0-5642-50e0-92f2-3fdeb326bb73] (cache misses: wrong dep version loaded (2), incompatible header (2), mismatched flags (2))\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Welcome to Nemo version 0.49.5\n", - "\n", - "Nemo comes with absolutely no warranty whatsoever\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[36m\u001b[1m[ \u001b[22m\u001b[39m\u001b[36m\u001b[1mInfo: \u001b[22m\u001b[39mPrecompiling FileIOExt [f5f51d8f-5827-5d2e-939b-192fcd6ec70c] (cache misses: wrong dep version loaded (4), incompatible header (14))\n" - ] - } - ], + "outputs": [], "source": [ "# Set up Revise.jl for automatic code reloading\n", "# This only needs to be run once at the beginning of your notebook session\n", @@ -3101,6 +3076,54 @@ "γ = 180 - α - β\n", "println(\"angle γ is 180 - α - β: \", round(γ; digits=5), \" degrees\")" ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cosine Law:\n", + "side a: 5\n", + "side b: 3\n", + "side c: 4\n", + "cosine α: 0.0\n", + "angle α: 90.0°\n", + "cosine β: 0.8\n", + "angle β: 36.87°\n", + "angle γ: 53.13°\n" + ] + } + ], + "source": [ + "println(\"Cosine Law:\")\n", + "a = 5\n", + "println(\"side a: \", a)\n", + "b = 3\n", + "println(\"side b: \", b)\n", + "c = 4\n", + "println(\"side c: \", c)\n", + "cosα = (b^2 + c^2 - a^2) / (2 * b * c)\n", + "println(\"cosine α: \", cosα)\n", + "α = round(acosd(cosα); digits=3)\n", + "println(\"angle α: \", α, \"°\")\n", + "cosβ = (a^2 + c^2 - b^2) / (2 * a * c)\n", + "println(\"cosine β: \", cosβ)\n", + "β = round(acosd(cosβ); digits=3)\n", + "println(\"angle β: \", β, \"°\")\n", + "γ = round(180 - α - β; digits=3)\n", + "println(\"angle γ: \", γ, \"°\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From f75b69042fd8ce8ad306cd5f2526cb713fe38d8d Mon Sep 17 00:00:00 2001 From: Aron T Date: Wed, 3 Sep 2025 13:12:30 +0300 Subject: [PATCH 4/5] Enhance: Sine Law - alternate angle characters - add general note about SSA cases. - add Sine Law example --- .../02 Trigonometric Functions.md | 11 ++- notebooks/Basics.ipynb | 81 ++++++++++++++++--- 2 files changed, 81 insertions(+), 11 deletions(-) diff --git a/docs/src/Trigonometry/02 Trigonometric Functions.md b/docs/src/Trigonometry/02 Trigonometric Functions.md index b8e5c33..106bd82 100644 --- a/docs/src/Trigonometry/02 Trigonometric Functions.md +++ b/docs/src/Trigonometry/02 Trigonometric Functions.md @@ -178,7 +178,8 @@ The [Sine Law](https://mathworld.wolfram.com/LawofSines.html) and [Cosine Law](h ### Sine Law -For any triangle with sides $a$, $b$, $c$ and opposite angles $A$, $B$, $C$: +For any triangle with sides $a$, $b$, $c$ and opposite angles $A$, $B$, $C$ (alternatively given as opposite angles $\alpha$, $\beta$, $\gamma$): + $$\frac{a}{\sin A} = \frac{b}{\sin B} = \frac{c}{\sin C}$$ In other words, the sine law states that the quotient of two side lengths of a triangle @@ -216,7 +217,13 @@ This law is particularly useful when you know: 3. Substitute: $\sin B = \frac{10 \times \sin 30^\circ}{8} = \frac{10 \times \frac{1}{2}}{8} = \frac{5}{8} = 0.625$ 4. Solve: $B = \arcsin(0.625) \approx 38.68^\circ$ -**Note:** In SSA cases, check if a second solution exists: $B' = 180^\circ - 38.68^\circ = 141.32^\circ$. Verify which solution(s) create valid triangles by checking that all angles sum to 180^\circ. +**Note:** In SSA cases, check if a second solution exists: $B' = 180^\circ - 38.68^\circ = 141.32^\circ$. Verify which solution(s) create valid triangles by checking that all angles sum to $180^\circ$. + +**General Note:** If the lengths of the sides $a$ and b and $A$, the angle opposite the side with length a, _are_ given, then it is _not_ necessary that: + +$$|sin(A)\frac{b}{a}| \leq 1$$ + +hold. But since this should always be satisfied because it is necessary that $|\sin(B)| \leq 1$, we can see that something goes wrong for certain specifications of $a$, $b$ and $A$, that is, a triangle cannot be constructed for some choices of these quantities. ### Cosine Law diff --git a/notebooks/Basics.ipynb b/notebooks/Basics.ipynb index 344dcda..33e70ae 100644 --- a/notebooks/Basics.ipynb +++ b/notebooks/Basics.ipynb @@ -3044,14 +3044,14 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Cosine Law:\n", + "Cosine Law given SSS:\n", "side b: 2\n", "side c: 3\n", "angle α: 30\n", @@ -3062,7 +3062,7 @@ } ], "source": [ - "println(\"Cosine Law:\")\n", + "println(\"Cosine Law given SSS:\")\n", "b = 2\n", "println(\"side b: \", b)\n", "c = 3\n", @@ -3079,14 +3079,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Cosine Law:\n", + "Cosine Law given SSS:\n", "side a: 5\n", "side b: 3\n", "side c: 4\n", @@ -3099,7 +3099,7 @@ } ], "source": [ - "println(\"Cosine Law:\")\n", + "println(\"Cosine Law given SSS:\")\n", "a = 5\n", "println(\"side a: \", a)\n", "b = 3\n", @@ -3120,10 +3120,73 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sine Law given AAS:\n", + "side a: 3\n", + "angle α: 40°\n", + "angle β: 120°\n", + "angle γ: 20°\n", + "side b: 4.0419\n", + "side c: 1.5963\n" + ] + } + ], + "source": [ + "println(\"Sine Law given AAS:\")\n", + "a = 3\n", + "println(\"side a: \", a)\n", + "β = 120\n", + "γ = 20\n", + "α = 180 - β - γ\n", + "println(\"angle α: \", α, \"°\")\n", + "println(\"angle β: \", β, \"°\")\n", + "println(\"angle γ: \", γ, \"°\")\n", + "b = a * sind(β) / sind(α)\n", + "println(\"side b: \", round(b; digits=4))\n", + "c = a * sind(γ) / sind(α)\n", + "println(\"side c: \", round(c; digits=4))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sine Law given AAS:\n", + "side a: 3\n", + "side b: 1\n", + "angle α: 50°\n", + "angle β: 14.79°\n", + "angle γ: 115.21°\n", + "side c: 3.5432\n" + ] + } + ], + "source": [ + "println(\"Sine Law given AAS:\")\n", + "a = 3\n", + "println(\"side a: \", a)\n", + "b = 1\n", + "println(\"side b: \", b)\n", + "α = 50\n", + "println(\"angle α: \", α, \"°\")\n", + "β = round(asind(b * sind(α) / a); digits=2)\n", + "println(\"angle β: \", β, \"°\")\n", + "γ = round(180 - α - β; digits=2)\n", + "println(\"angle γ: \", γ, \"°\")\n", + "c = round(a * sind(γ) / sind(α); digits=4)\n", + "println(\"side c: \", c)" + ] } ], "metadata": { From e88b0195f77c7c5bcfca2a849b7de6cedde52e89 Mon Sep 17 00:00:00 2001 From: Aron T Date: Thu, 4 Sep 2025 20:50:47 +0300 Subject: [PATCH 5/5] Add last examples odf Sine Law for SSA which also shows wrong choice of angle makes impossible triangle --- notebooks/Basics.ipynb | 55 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/notebooks/Basics.ipynb b/notebooks/Basics.ipynb index 33e70ae..b32c850 100644 --- a/notebooks/Basics.ipynb +++ b/notebooks/Basics.ipynb @@ -3173,7 +3173,7 @@ } ], "source": [ - "println(\"Sine Law given AAS:\")\n", + "println(\"Sine Law given by SSA:\")\n", "a = 3\n", "println(\"side a: \", a)\n", "b = 1\n", @@ -3187,6 +3187,59 @@ "c = round(a * sind(γ) / sind(α); digits=4)\n", "println(\"side c: \", c)" ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sine Law given by SSA\n", + "a = 2\n", + "b = 8\n", + "angle α: 10°\n", + "angle β: 43.99°\n", + "angle γ: 126.01°\n", + "side c: 9.3167\n", + "change angle α to 40°\n", + "Calculating sin(β) = b * sind(α) / a we get: 2.5711504387461575\n", + "but sin(β) must be ≤ 1 so there is no triangle possible with these dimensions\n", + "If we try the calculation anyway we get an error: \n", + "Error: DomainError(2.5711504387461575, \"asin(x) is not defined for |x| > 1.\")\n", + "(2.5711504387461575, \"asin(x) is not defined for |x| > 1.\")\n" + ] + } + ], + "source": [ + "println(\"Sine Law given by SSA\")\n", + "a = 2\n", + "println(\"a = \", a)\n", + "b = 8\n", + "println(\"b = \", b)\n", + "α = 10\n", + "println(\"angle α: \", α, \"°\")\n", + "β = round(asind(b * sind(α) / a); digits=2)\n", + "println(\"angle β: \", β, \"°\")\n", + "γ = round(180 - α - β; digits=2)\n", + "println(\"angle γ: \", γ, \"°\")\n", + "c = round(a * sind(γ) / sind(α); digits=4)\n", + "println(\"side c: \", c)\n", + "α = 40\n", + "println(\"change angle α to \", α, \"°\")\n", + "sinβ = b * sind(α) / a\n", + "println(\"Calculating sin(β) = b * sind(α) / a we get: \", sinβ)\n", + "println(\"but sin(β) must be ≤ 1 so there is no triangle possible with these dimensions\")\n", + "println(\"If we try the calculation anyway we get an error: \")\n", + "try\n", + " result = asind(b * sind(α) / a)\n", + " println(\"Result: \", result)\n", + "catch e\n", + " println(\"Error: \", e)\n", + "end" + ] } ], "metadata": {