裏 RjpWiki

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

算額(その1125)

2024年07月06日 | Julia

算額(その1125)

三十四 岩手県一関市舞川相川 菅原神社後額 嘉永3年(1850)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円1個,正三角形,正方形,斜線,黒積

正方形の中に円,正三角形,斜線を容れる。円の直径が 1 寸のとき,図で示した灰色の部分の面積(黒積)を求めよ。

正方形(正三角形)の一辺の長さを a
円の半径と中心座標を r, (r, a - r)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy
@syms r::positive, a::positive,
     A::positive, B::positive, C::positive
A = 2(a - √Sym(3)a/2)
B = a
C = sqrt(A^2 + B^2)
eq = A + B - C - 2r
ans_a = solve(eq, a)[1] |> simplify
ans_a |> println

   -2*r/(-3 + 2*sqrt(2 - sqrt(3)) + sqrt(3))

黒積 = ((a - A)*(B/2)/2)(a => ans_a) |> simplify;

分子の r^2 がついていると SymPy では簡約化できないので,一旦外して(係数のみにして)簡約化を試みる。

temp = 黒積/r^2
temp |> println

   (-1 + sqrt(3))/(-3 + 2*sqrt(2 - sqrt(3)) + sqrt(3))^2

@syms d
temp2 = apart(temp, d) |> sympy.sqrtdenest |> factor
黒積2 = temp2*r^2
黒積2 |> println
黒積2(r => 1/2).evalf() |> println

   r^2*(2*sqrt(6) + 5 + 6*sqrt(2) + 5*sqrt(3))/2
   3.38056436220616

黒積は 等円の半径の二乗に,(2√6 + 5 + 6√2 +5√3)/2 を掛けることで得られる。

「答」は「三歩三分」と正解と異なる印象を受けるが,「術」は正しく,正確な結果を与えるあ。
なお,山村の解説は計算ミス・転記ミス・近似計算で正しい答えを示していない。

円径 = 1
位 = √3 - 1
A = (1 - sqrt(1 - 位))^2
黒積 = (円径/A)^2*位/4

   3.380564362206166

function draw(r, more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = -2*r/(-3 + 2*sqrt(2 - sqrt(3)) + sqrt(3))
   黒積 = r^2*(2√6 + 5 + 6√2 +5√3)/2
   @printf("円の直径が %g のとき,黒積は %g である。\n", 2r, 黒積)
   plot([0, a, a, 0, 0,  a, a/2, 0], [0, 0, a, a, 0,  0, √3a/2, 0], color=:blue, lw=0.5)
   plot!([0, a/2, 0, 0], [0, √3a/2, (√3 - 1)a, 0], seriestype=:shape, fillcolor=:gray90)
   segment(0, a - 2(a - √3a/2), a, a, :black)
   circle(r, a - r, r)
   if more
       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(a, 0, " a", :black, :left, :bottom, delta=delta/2)
       point(0, a, "a", :black, :left, :bottom, delta=delta/2)
       point(r, a - r, "r,(r,a-r)", :red, :center, delta=-delta/2)
       point(a/2, √3a/2, "(a/2,√3a/2)", :blue, :right, :bottom, delta=delta/2)
       point(0, (√3 - 1)a, " (√3 - 1)a", :blue, :left, delta=-delta/2)
   end
end;

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

算額(その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でシェアする

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

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