裏 RjpWiki

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

算額(その223)

2023年05月08日 | Julia

算額(その223)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額3(200)
長野県北佐久郡軽井沢町峠 熊野神社 安政4年(1857)

短辺が 240 寸,長辺がその倍の 480 寸の長方形内に円弧を 4 個描き,区切られた領域に大円 4 個,小円 2 個を描く。大円は円弧と長方形の辺に内接し,小円は互いに外接すると同時に円弧にも外接している。このとき,大円と小円の径はいかほどか。

算額の図では「円弧」は楕円の 1/4 のように見えるが,短辺の中点で接する円弧である(長辺の中点で交わる)。

長方形の短辺と長辺の長さの 1/2 を y,2y とおく。
円弧がその一部である外円の中心座標と半径が (2y, r0), r0,
大円の中心座標と半径が (2y - r1, y - r1), r1
小円の中心座標と半径が (r2, 0), r2
とする。
以下の連立方程式を解く。

using SymPy

@syms r0::positive, r1::positive, r2::positive, x::positive, y::positive;

y = 240 // 2
x = 2y
eq1 = x^2 + (r0 - y)^2 - r0^2  # (0, y) が 外円の円周上にあることより
eq2 = r1^2 + (r0 - y + r1)^2 - (r0 - r1)^2  # 大円が外円に内接することより
eq3 = (x - r2)^2 + r0^2 - (r0 +r2)^2;  # 小円が外円に外接することより

res = solve([eq1, eq2, eq3], (r0, r1, r2))

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (300, -480 + 240*sqrt(5), 160/3)

   r0 = 300.000,  x = 240.000;  y = 120.000;  r1 = 56.656;  r2 = 53.333
   大円の径 = 2r1 = 113.313;  小円の径 = 2r2 = 106.667

大円の径は 2\*240\*(sqrt(5)-2) = 113.3126291998991 である。術では sqrt(5)≒2.236 で近似して,113.2800000000001 を 113寸2分8厘としている。

小円の径は 2\*160/3 = 106 + 2/3 である。術では正しく (106と2/3)寸となっている。

y を未知数として解くと,r0 = y*(5/2), r1 = y*(2sqrt(5) - 4), r2 = y*(4/9) である。

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function circle4(x, y, r, color=:red)
  circle(x, y, r, color)
  circle(x, -y, r, color)
  circle(-x, y, r, color)
  circle(-x, -y, r, color)
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 draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r0, r1, r2) = res[1]
   y = 240 / 2
   x = 2y
   @printf("r0 = %.3f,  x = %.3f;  y = %.3f;  r1 = %.3f;  r2 = %.3f\n", r0, x, y, r1, r2)
   @printf("大円の径 = 2r1 = %.3f;  小円の径 = 2r2 = %.3f\n", 2r1, 2r2)
   plot([x, x, -x, -x, x], [-y, y, y, -y, -y], color=:orange, lw=0.5)
   circle4(x, r0, r0, :green)
   circle4(x - r1, y - r1, r1, :blue)
   circle(r2, 0, r2)
   circle(-r2, 0, r2)
   if more == true
       point(x, r0, "(2y,r0)", :green, :left, :bottom)
       point(x - r1, y - r1, "(2y-r1,y-r1)", :blue, :left, :bottom)
       point(x, 0, " 2y", :black, :left, :bottom)
       point(0, x/2, " y", :black, :left, :bottom)
       point(r2, 0, "r2", :red, :left, :bottom)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false, xlims=(-250, 250), ylims=(-130, 130))
   end
end;

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

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

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