裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

算額(その71)

2022年12月22日 | Julia

算額(その71)

福島県田村郡三春町山中 田村大元神社 明治34年(1901)5月
http://www.wasan.jp/fukusima/tamuradaigen.html

矩形内に対角線に接して甲円 2 個,乙円 1 個がある。甲円の径が 3 寸のとき,乙円の径はいかほどか。

図のように記号を定め,方程式を解く。

using SymPy
@syms r1::positive, r2::positive;

算額では矩形を「直」と書いているが,これは,鉤 = 3k,股 = 4k,弦 = 5k の直角三角形を 2 つ組み合わせたものである。

大円の半径 r1 は「鉤股弦 ABC と内接円の定理」により,r1*(3 + 4 - 5)/2 = 3 を解けばよい。

r1 = solve(r1*(3 + 4 - 5)//2 - 3)[1]

    3

小円の半径 r2 は,大円と小円が外接することを用いて (x1//2-r1)^2 + (y1-r2-r1)^2 = (r1 + r2)^2 を解けばよい。(x1, y1) は (12, 9) である。

(x1, y1) = (12, 9)
r2 = solve((x1//2-r1)^2 + (y1-r2-r1)^2 - (r1 + r2)^2)[1]

    2

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
  θ = beginangle:0.1:endangle
  x = r.*cosd.(θ)
  y = r.*sind.(θ)
  plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
   plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="")#, fontfamily="IPAMincho")
   # 矩形の左下角を原点,右上角の座標 (x1, y1)として図を描く
    (x1, y1) = (12, 9)
    (r1, r2) = (3, 2)
    plot([0, x1, x1, 0, 0], [0, 0, y1, y1, 0], color=:black, showaxis=false)
    segment(0, 0, x1, y1)
    segment(0, y1, x1, 0)
    circle(r1, r1, r1)
    circle(x1-r1, r1, r1)
    circle(x1/2, y1-r2, r2, :blue)
   if more
       println("r1 = $r1;  r2 = $r2")
       plot!(xlims=(-0.5, x1+0.5), ylims=(-0.5, y1+0.5), showaxis=true)
       point(0, y1, "A ", :black, :right)
       point(0, 0, "B ", :black, :right)
       point(x1, 0, "C ", :black, :right)
       point(r1, r1, "(r1, r1)", :red, :center)
       point(x1/2, y1-r2, "(x1/2, y1-r2)", :blue, :center)
   end
end;

   r1 = 3;  r2 = 2

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その70)

2022年12月22日 | Julia

算額(その70)

東京都府中市 大國魂神社
http://www2.ttcn.ne.jp/~nagai/sangaku/sangakumondai1.htm

直角三角形 ABC 内に正方形,長方形,等円 2 個がある。
AB が 27 寸,BC が 36 寸のとき,等円の直径を求めよ。

図のように記号を定め,方程式を解く。

eq6 が https://blog.goo.ne.jp/r-de-r/e/b63974576ba4fdb13955aa322b1ad901 で示した,「鉤股弦と内接円の径」に基づくものである。

using SymPy
@syms R::positive, AB::positive, AE::positive, AD::positive, ae::positive, ad::positive, de::positive, ae::positive;

DE = ae
BD = ae
AB = 27
eq1 = AE - 3//5*AD;
eq2 = ae - 3//5*ad;
eq3 = de - 4//5*ad;
eq4 = AE - DE/de*ae;
eq5 = AD + BD - AB;
eq6 = ae + de - ad - R;

solve([eq1, eq2, eq3, eq4, eq5, eq6], (R, ae, de, ad, AE, AD))

   1-element Vector{NTuple{6, Sym}}:
    (8, 12, 16, 20, 9, 15)

等円の径は 8 である。また,正方形の一辺は 12,長方形の長辺は 20,短辺は 4.8 である。

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
  θ = beginangle:0.1:endangle
  x = r.*cosd.(θ)
  y = r.*sind.(θ)
  plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
  mark && scatter!([x], [y], color=color, markerstrokewidth=0)
  annotate!(x, y, text(string, 10, position, color, vertical))
end;

function distance(x1, y1, x2, y2, x0, y0)
 p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
 l = sympy.Line(p1, p2)
 l.distance(sympy.Point(x0, y0))
end;

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (R, ae, de, ad, AE, AD) = (8, 12, 16, 20, 9, 15)
   r = R/2
   cosine, sine = (4, 3) ./ 5
   Ax, Ay = (0, 27)
   Bx, By = (0, 0)
   Cx, Cy = (36, 0)
   plot([Ax, Bx, Cx, Ax], [Ay, By, Cy, Ay], lw=0.5, showaxis=false)
   Dx, Dy = (0, 27 - AD)
   Ex, Ey = AE*cosine, AB - AE*sine
   DE = AD*cosine
   ex, ey = (Ex + DE*cosine, Ey - DE*sine)
   ax, ay = (ex - DE*sine, ey - DE*cosine)
   dx, dy = (ex + de*cosine, ey - de*sine)
   plot!([Ex, Dx, ax, ex, Ex], [Ey, Dy, ay, ey, Ey], color=:black, lw=0.5)
   plot!([ax, ax, dx, dx, ax], [ay, 0, 0, ay, ay], color=:black, lw=0.5)
   circle(r, r, r)
   # 右の等円の中心座標 -- 2辺までの距離が等しいとの方程式を解く
   @syms Ox, Oy
   eq1 = distance(ax, ay, ex, ey, Ox, Oy) - r
   eq2 = distance(dx, dy, ex, ey, Ox, Oy) - r
   res = solve([eq1, eq2])[3]
   circle(res[Ox], res[Oy], r)
   if more
       println("正方形の一辺 = $DE")
       println("長方形の辺 = $ad, $dy")
       println("等円の径と中心座標 = $R, $((res[Ox], res[Oy]))")
       point(Ax, Ay, "A ", :black, :right)
       point(Bx, By, "B ", :black, :right)
       point(Cx, Cy, " C", :black)
       point(Dx, Dy, "  D", :black)
       point(Ex, Ey, "  E", :black)
       point(ex, ey, "  e", :black)
       point(ax, ay, " a", :black)
       point(dx, dy, "  d", :black)
       point(r, r, "(r,r)", :red, :center)
       point(res[Ox], res[Oy], "(Ox,Oy)", :red, :center)
       point((Dx + ex)/2, (Dy + ey)/2, "正方形", :center, mark=false)
       point((ax + dx)/2, dy/2, "長方形", :center, mark=false)
       point(r, 1.5r, "等円", :center, mark=false)
       point(res[Ox], 0.5r + res[Oy], "等円", :center, mark=false)
   end
end;

   正方形の一辺 = 12.0
   長方形の辺 = 20, 4.8000000000000025
   等円の径と中心座標 = 8, (17.6000000000000, 8.80000000000000)

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

和算の心(その001)

2022年12月22日 | Julia

和算の心(その001)

算額の問題を解くための定石をまとめておく。

直角三角形において,直角を挟む短い辺(鉤:こう)と長い辺(股:こ)と直角に対する辺(弦:げん)をいう(鉤は勾とも書かれる)。また「鉤股弦」は直角三角形のこと。ちなみに,「鉤股弦の定理」は三平方の定理(ピタゴラスの定理)のこと。

この直角三角形に内接する円の径(直径)は,鉤,股,弦を用いて以下のように表される。

径 = 鉤 + 股 - 弦

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
   plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end

function kou_ko_gen(鉤, 股, 弦)
   println("鉤 = $鉤;  股 = $股;  弦 = $弦")
   isapprox(鉤^2 + 股^2, 弦^2) || (println("鉤,股,弦の直角三角形ではない"); return)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   径 = 鉤 + 股 - 弦
   println("径 = $径")
   r = 径/2
   plot(showaxis=false)
   ox, oy = 股-r, r
   x, y = (股 - r) .* ([股, 鉤] ./ 弦)
   circle(股-r, r, r, :cyan)
   # 内接円の中心から,鉤,股,弦への垂線
   segment(ox, oy, ox, 0, :blue)
   segment(ox, oy, 股, oy, :blue)
   segment(ox, oy, x, y, :blue)
   # 鉤,股,弦
   segment(0, 0, x, y, :green)
   segment(0, 0, 股-r, 0, :green)
   segment(股, 0, 股-r, 0, :blue)
   segment(股, 0, 股, r, :blue)
   segment(股, 鉤, 股, r, :red)
   segment(股, 鉤, x, y, :red)
   point(0.2, 鉤, "鉤 = 赤 + 青\n股 = 緑 + 青\n弦 = 緑 + 赤\n" *
       "辺々足して\n鉤 + 股 + 弦\n = 2赤 + 2緑 + 2青\n" *
       " = 2(鉤 - 半径) + 2(股 - 半径) + 2半径\n" *
       "移項,整理して,\n鉤 + 股 - 弦 = 直径\n", :black, mark=false)
end;

kou_ko_gen(3, 8, sqrt(9+64))

   鉤 = 3;  股 = 8;  弦 = 8.54400374531753
   径 = 2.4559962546824696

kou_ko_gen(3, 4, 6)

   鉤 = 3;  股 = 4;  弦 = 6
   鉤,股,弦の直角三角形ではない

 

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村