裏 RjpWiki

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

算額(その87)

2023年01月05日 | Julia

算額(その87)

福島県二本松市杉沢 愛宕神社
http://www.wasan.jp/fukusima/atago.html

外円の中に正三角形が入っている。小さい方の一辺の長さが1寸のとき,大きい方の一辺の長さはいかほどか。

大きい方の一辺の長さを2,小さい方の一辺の長さを x として,以下のように記号を定める。

円の半径は 2/√3,c は AB の中点である。以下順に長さが決まる。

AB = 2
Ac = 1
yc = 1/2
Ay = √3/2
y = 1/(2√3)

(x+1/2, y) が円周上にあるので以下の方程式を解き x を求める。

using SymPy

@syms x::positive, y::positive;
y = 1/(2*sqrt(Sym(3)))
eq = (x + 1//2)^2 + y^2 -(y +sqrt(Sym(3))/2)^2
x = solve(eq)[1];
(x, y) |> println

   (-1/2 + sqrt(5)/2, sqrt(3)/6)

x が 1 寸ならば大きい正三角形の一辺は 2 / (-1/2 + sqrt(5)/2) = 1 + sqrt(5) = 3寸2分3厘6毛である。

2 / (-1//2 + sqrt(Sym(5))/2) |> simplify

   1 + sqrt(5)

1+√5

   3.23606797749979

算額では,「5個を開平し1個を加える」ことで三寸二分三厘を得ている。

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; fontsize=10, mark=true)
  mark && scatter!([x], [y], color=color, markerstrokewidth=0)
  annotate!(x, y, text(string, fontsize, vertical, position, color))
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")
   (x, y) = (-1/2 + sqrt(5)/2, sqrt(3)/6)
   r = 2/sqrt(3)
   (Ax, Ay) = (0, r)
   (Bx, By) = (r*cosd(30), r*sind(-30))
   (Cx, Cy) = (-r*cosd(30), r*sind(-30))
   (ax, ay) = ((1 + x)/2, y + sqrt(3)/2*x)
   (bx, by) = (1/2 + x, y)
   (cx, cy) = (1/2, y)
   plot()
   circle(0, 0, r, :black)
   plot!([Ax, Bx, Cx, Ax], [Ay, By, Cy, Ay])
   plot!([ax, bx, cx, ax], [ay, by, cy, ay])
   plot!(-[ax, bx, cx, ax], [ay, by, cy, ay])
   if more
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(Ax, Ay, "   A", :black, :bottom)
       point(Bx, By, " B", :black)
       point(Cx, Cy, "C ", :black, :right)
       point(ax, ay, "  a", :black, :bottom)
       point(bx, by, " b:(1/2+x, y)", :black)
       point(cx, cy, "c", :black, :right)
       point(0, y, " y", :black)
       point(0, 0, " o", :black)
   end
end;


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« プログラムのお作法 | トップ | 算額(その88) »
最新の画像もっと見る

コメントを投稿

Julia」カテゴリの最新記事