裏 RjpWiki

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

算額(その1124)

2024年07月06日 | Julia

算額(その1124)

三十一 岩手県一関市舞川 観福寺内地蔵堂前額 明治34年(1901)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:等球6個,円錐,3次元

円錐の側面に 6 個の等球が接している。等球はの中心は全て円錐の底面に平行な水平面にあり,中は互いに接し合っている。円錐の底面の(円の)直径と高さが与えられているとき等球の直径はいかほどか。
なお,「問」には書かれていないが(術には書かれている),等球の中心がある水平面と円錐の底面との距離も「答」に必要である。

左上は,真横から見た図。6 個の球の中心は同じ平面上にある。

右上は,やや上から見た図

左下は,円錐の頂点 H と底面の円の縁が重なるように見える位置からの図。このとき,上にある球が底面の円に接しているように見えているが,それはその球が円錐の側面に接していることを意味する。

右下は,真上から見た図。6個の球は互いに外接。している。

円錐の底面の円の半径を r,円錐の高さを h,水平面と底面の距離を z
等球の半径 を r,円錐の軸から等球の中心までの距離を x
とおき,以下の連立方程式を解く。
条件1. 円錐の側面から等球の中心までの距離は等球の直径に等しい
条件2. 円錐の軸から等球の中心までの距離の sin(π/6) = 1/2 倍が等球の半径である

include("julia-source.txt")

using SymPy
@syms a::positive, h::positive, z::positive,
     x::positive, r::positive
eq1 = dist2(0, h, a, 0, x, z, r)  # 円錐の側面から等球の中心までの距離は等球の直径に等しい
eq2 = x/2 - r; # 2 つの等球の半径感の距離の関係
res = solve([eq1, eq2], (r, x))[2]

   (2*a*h*(-h + z)/(a^2 - 3*h^2) + a*sqrt(a^2 + h^2)*(-h + z)/(a^2 - 3*h^2), 4*a*h*(-h + z)/(a^2 - 3*h^2) + 2*a*sqrt(a^2 + h^2)*(-h + z)/(a^2 - 3*h^2))

等球の半径

res[1] |> simplify |> println

   a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2)

円錐の軸から等球の中心までの距離
全ての等球は,この距離を半径とする円の上にある。

res[2] |> simplify |> println

   2*a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2)

底面の円の半径が 10,高さが 18 の円錐で,等球の中心までの距離が 9 の場合の,パラメータの実際の数値

式を見ればわかるが,x = 2r である(6 個の等球なので,eq2 より)。

(a, h, z) = (10, 18, 9)
#= r =#   a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2) |> println
#= x =# 2*a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2) |> println

   5.840841084148692
   11.681682168297383

底面の直径が 20,高さが 18,水平面の高さが 9 のとき,等球の直径は 11.6817 である。

「術」,および山村の解説は,わたしには理解できない。

function plot1(r, x)
   p1 = plot()
   circle(0, 0, x)
   circle(0, 0, r, :gray80)
   rotate(x, 0, r, :blue, angle=60)
   delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
   hline!([0], color=:gray80, lw=0.5)
   vline!([0], color=:gray80, lw=0.5)
   point(x, 0, " x", :red, :left, :bottom, delta=delta/2)
   point(x + r, 0, " x+r", :red, :left, :bottom, delta=delta/2)
   xlims!(-x - r - 5delta, x + r + 15delta)
   title!("真上から見た図", titlefontsize=10)
   return p1
end;

function plot2(r, x, z)
   p2 = plot([a, 0, -a, a], [0, h, 0, 0], color=:green, lw=0.5)
   circle2(x, z, r, :blue)
   delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
   hline!([0], color=:gray80, lw=0.5)
   vline!([0], color=:gray80, lw=0.5)
   xlims!(-x - r -10delta, x + r + 5delta)
   point(x, z, "r,(x, z)", :blue, :center, delta=-delta/2)
   point(a, 0, " a", :green, :left, :bottom, delta=delta/2)
   point(0, h, "h", :green, :center, :bottom, delta=3delta)
   title!("真横から見た図\n\n", titlefontsize=10)
   return p2
end;

function draw(a, h, z, more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r =   a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2)
   x = 2*a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2)
   @printf("底面の直径が %g,高さが %g,水平面の高さが %g のとき,等球の直径は %g である。\n", 2a, h, z, 2r)
   p1 = plot1(r, x)
   p2 = plot2(r, x, z)
   plot(p1, p2)
end;


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

コメントを投稿

Julia」カテゴリの最新記事