裏 RjpWiki

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

算額(その221)

2023年05月05日 | Julia

算額(その221)

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

半外円内に4本の斜線を引き,大円,中円,小円を入れる。

図のように記号を定め,方程式を解き r3 を求める。
外円の半径を r0 とする。
大円の中心座標,半径を (0, r1), r1
中円の中心座標,半径を (0, r2), r2
小円の中心座標,半径を (0, r0 - r3), r3
斜線と円の交点を (x, y) とおく。

熊野神社の算額では r0 = 100 寸のとき,r2, r3 を求めよというものであるが答えは完全ではない。
同じ問題が
県内の算額3(232)
長野県上田市塩田町五加公民館 絵堂地蔵堂 明治4年(1871)
にあり, r1 = 9 寸のとき r2, r3 を求めよというもので,こちらは正しい答えが与えられている。以下ではこちらの設定で解を求める。

using SymPy

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))^2  # 二乗距離を返す!!
end;

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

r0 = 100
r1 = r0 // 2
r1 = 9
r0 = 2r1
eq1 = x^2 + y^2 - r0^2
eq2 = distance(-r0, 0, x, y, 0, r0 - r3) - r3^2
eq3 = distance(-r0, 0, x, y, 0, r2) - r2^2
eq4 = distance(r0, 0, x, y, 0, r1) - r1^2
res = solve([eq1, eq2, eq3, eq4], (x, y, r2, r3))

   1-element Vector{NTuple{4, Sym}}:
    (126/25, 432/25, 6, 2)

ちなみに上記のようにすると処理時間が長くなる。
res = solve([eq1, eq2, eq3, eq4]) とすると,速い。

solve([eq1, eq2, eq3, eq4])

   1-element Vector{Dict{Any, Any}}:
    Dict(r3 => 2, y => 432/25, x => 126/25, r2 => 6)

外円の半径 = 18.000,  大円の半径 = 9.000;  中円の半径 = 6.000;  小円の半径 = 2.000

大円,中円,小円の径はそれぞれ外円の径の 1/2,1/3, 1/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 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")
   (x, y, r2, r3) = res[1]
   r1 = 9
   r0 = 2r1
   @printf("外円の半径 = %.3f,  大円の半径 = %.3f;  中円の半径 = %.3f;  小円の半径 = %.3f\n", r0, r1, r2, r3)
   plot([r0, -x, -r0, x, r0, -r0], [0, y, 0, y, 0, 0], color=:black, lw=0.5)
   circle(0, 0, r0, :blue, beginangle=0, endangle=180)
   circle(0, r1, r1, :magenta)
   circle(0, r2, r2)
   circle(0, r0 - r3, r3, :green)
   if more == true
       point(0, r1, " r1")
       point(0, r2, " r2")
       point(0, r0 - r3, " r3")
       point(0, r0, " r0", :green, :left, :bottom)
       point(-r0, 0, "  -r0", :green, :left, :bottom)
       point(r0, 0, " r0", :green, :left, :bottom)
       point(x, y, " (x,y)", :green, :left, :bottom)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

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

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