裏 RjpWiki

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

算額(その310)

2023年07月02日 | Julia

算額(その310)

「三重県に現存する算額の研究」福島完(2007/2/13)
https://mie-u.repo.nii.ac.jp/?action=repository_uri&item_id=7216
三重県伊賀市 永保寺 弘化4年(1847)

問題文3
正方形の中に順次,長方形,菱形,円を入れる。長方形の縦(長い方の辺)の外に円をいれ,長方形の横(短い方の辺)の外に順次正方形,正三角形を入れる。長方形の面積が 6281.8600 坪あり,長方形の横中径(横を直径とした外接円の半径)が 32.65 尺のとき,各変数の値を求めよ。

現代解法に示されている図とは印象がかなり違う。長方形はかなり太めである。また円の大きさは異なる。

以下の方程式を解く。

include("julia-source.txt");

using SymPy

@syms 長方形の面積::positive,
   長方形の横を直径とした外接円の半径::positive;

長方形の面積 = Sym(6281.8600)
横中径 = Sym(32.65);

# 直平横(長方形の短辺)
直平横 = 横中径 * 2;

# 直平縦(長方形の長辺)
直平縦 = 長方形の面積 / 直平横;

# 菱面(菱形の一辺)
@syms 菱面::positive
eq1 = (直平横/2)^2 + (直平縦/2)^2 - 菱面^2
菱面 = solve(eq1)[1].evalf();

# 外円径
@syms 外円径::positive
eq2 = (外円径/2 + 外円径/2*√2) - 直平縦/2
外円径 = solve(eq2)[1];

# 方平面(正方形の一辺) 右上角の正方形
方平面 = 直平横/2 / √2;

# 三角面(正三角形の一辺)
@syms 三角面::positive
eq3 = 三角面*cos(PI/12) - 方平面
三角面 = solve(eq3)[1];

# 上ノ中径(縦を直径とした外接円の半径)
上ノ中径 = 直平縦 / 2;

# 外方面(外正方形の一辺)
外方面 = 直平横 / √2 + 直平縦 / √2;

@printf("直平横  = %.6f\n直平縦  = %.6f\n菱面   = %.6f\n外円径  = %.6f\n方平面  = %.6f\n三角面  = %.6f\n上ノ中径 = %.6f\n外方面  = %.6f\n",
   直平横, 直平縦, 菱面, 外円径, 方平面, 三角面, 上ノ中径, 外方面)

   直平横  = 65.300000
   直平縦  = 96.200000
   菱面   = 58.134607
   外円径  = 39.847345
   方平面  = 23.087036
   三角面  = 23.901459
   上ノ中径 = 48.100000
   外方面  = 114.197745
   中央の円の半径 = 27.014288

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   plot([0, 外方面, 外方面, 0, 0], [0, 0, 外方面, 外方面, 0], color=:black, lw=0.5)
   a = 直平横/√2
   plot!([a, 外方面, 外方面 - a, 0, a], [0, 外方面 - a, 外方面, a, 0], color=:blue, lw=0.5)
   r = 外円径/2
   circle(外方面 - r, r, r)
   circle(r, 外方面 - r, r)
   b = 上ノ中径/√2
   plot!([方平面, 外方面 - b, 外方面 - 方平面, b, 方平面], [方平面, b, 外方面 - 方平面, 外方面 - b, 方平面], color=:green, lw=0.5)
   rect(0, 0, 方平面, 方平面, :brown)
   rect(外方面, 外方面, 外方面 - 方平面, 外方面 - 方平面, :brown)
   c = 三角面*sin(pi/12)
   plot!([外方面 - 方平面, 外方面, 外方面 - 方平面 + c, 外方面 - 方平面], [外方面 - 方平面, 外方面 - 方平面 + c, 外方面, 外方面 - 方平面], color=:magenta, lw=0.5)
   plot!([方平面, 0, 方平面 - c, 方平面], [方平面, 方平面 - c, 0, 方平面], color=:magenta, lw=0.5)
   # r2(真ん中の円の半径)
   @syms r2::positive
   eq4 = distance(方平面, 方平面, b, 外方面 - b, 外方面/2, 外方面/2) - r2^2
   r2 = solve(eq4)[1].evalf()
   @printf("中央の円の半径 = %.6f\n", r2)
   circle(外方面/2, 外方面/2, r2, :orange)
   if more
       point(外方面, 0, "外方面", :black, :left, :bottom)
       point(0, 外方面, "外方面", :black, :left, :bottom)
       point(方平面, 0, "方平面", :black, :left, :bottom)
       point(0, 方平面, "方平面", :black, :left, :bottom)
       point(外方面 - r, r, "\n(外方面-r,r)", :red, :center)
       point(外方面/2, 外方面/2, "\nr2,(外方面/2,外方面/2)", :orange, :center)
       point(直平横/√2, 0, "  直平横/√2", :blue, :left, :bottom)
       point(外方面-b, b, "\n(外方面-上ノ中径/√2,上ノ中径/√2)", :green, :center)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
       plot!(xlims=(-5, 127))
   else
       plot!(showaxis=false)
   end
end;

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

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

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