裏 RjpWiki

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

算額(その627)

2024年01月10日 | Julia

算額(その627)

和算図形問題あれこれ
令和4年9月の問題-No.2

https://gunmawasan.web.fc2.com/kongetu-no-mondai.html

大球の中に甲球 2 個と乙球 5 個が入っている。甲球は交差しており,乙球の 1 個が交差部分に内接している。残りの 4 個の乙球は甲球と外接し大球に内接している。
甲球の直径が 987 寸のとき,乙球の直径はいかほどか。

図は,3次元空間を Z 軸方向上方から見たものであり,中央の乙球は手前と奥を含めて 3 個が一直線上に並んでいる。図の上下の乙球と甲球は x-y 平面上(z = 0)に中心を持つ。

大球の半径と中心座標を R, (0, 0)
甲球の半径と中心座標を r1, (R - r1, 0)
乙球の半径と中心座標を r2, (0, R - r2)
とおき,以下の連立方程式を解き,大球,乙球の半径を求める。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy

@syms R, r1, r2

r1 = 987//2
eq1 = (2r1 - r2) - R
eq2 = (R - r1)^2 + (R - r2)^2 - (r1 + r2)^2
res = solve([eq1, eq2], (R, r2))

   2-element Vector{Tuple{Sym, Sym}}:
    (987/4 - 987*sqrt(5)/4, 987*sqrt(5)/4 + 2961/4)
    (987/4 + 987*sqrt(5)/4, 2961/4 - 987*sqrt(5)/4)

2 番目のものが適解である。

R = 987/4 + 987*sqrt(5)/4
r2 = 2961/4 - 987*sqrt(5)/4
(R, r2)

   (798.4997734480731, 188.50022655192686)

r2 はほんの少しだけ簡約化できる。

res[2][2] |> factor |> println

   -987*(-3 + sqrt(5))/4

987(3 - √5)/4, 987(3 - √5)/2

   (188.50022655192686, 377.0004531038537)

乙球の直径は 987(3 - √5)/2 = 377.0004531038537 である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = 987//2
   R = 987/4 + 987*sqrt(5)/4
   r2 = 2961/4 - 987*sqrt(5)/4
   @printf("乙球の直径 = %g;  R = %g; r2 = %g;  r1 = %g\n", 2r2, R, r2, r1)
   plot()
   circle(0, 0, R, :black)
   circle(R - r1, 0, r1, :blue)
   circle(r1 - R, 0, r1, :blue)
   circle(0, 0, r2)
   circle(0, R - r2, r2)
   circle(0, r2 - R, r2)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
       point(R - r1, 0, "甲球:r1", :blue, :center, delta=-delta/2)
       point(0, R - r2, "乙球:r2", :red, :left, :vcenter)
       point(R, 0, "R ", :black, :right, delta=-delta/2)
   end
end;

 

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

算額(その626)

2024年01月10日 | Julia

算額(その626)

和算図形問題あれこれ
令和4年9月の問題-No.1

https://gunmawasan.web.fc2.com/kongetu-no-mondai.html

左右対称の四角形の中に,正方形と 2 斜線がある。赤,黃,黒の面積が 12 平方寸, 24 平方寸,16 平方寸のとき,正方形の一辺の長さはいかほどか。

頂点などの座標を図のように定義する。直線の上にある(ように見える)点はまさに直線上にある(傾きの同じ直線上にある)という 4 条件と,赤,黃,黒の面積の 3 条件についての連立方程式を解く。

SymPy での計算は分数式で行われるので,誤差が含まれるおそれはない。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy

@syms a::positive, b::positive, c::positive,
     d::positive, e::positive,
     x::positive, y::positive
     R::positive, Y::positive, K::positive

(R, Y, K) = (12, 24, 16)
eq1 = (y - c)/x - ((d + 2a) - c)/a
eq2 = (y - b)/x - (y - e)/(x - a)
eq3 = (y - e)/(x - a) - (y - (d + 2a))/(x + a)
eq4 = y/x - (y - d)/(x - a)
eq5 = ((d + 2a) - e)a - R
eq6 = (e - d) * (x - a) - Y
eq7 = (c - (d + 2a))a - K;

res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7])

   1-element Vector{Dict{Any, Any}}:
    Dict(x => 44/5, y => 88/15, b => 55/6, d => 8/3, e => 23/3, c => 44/3, a => 4)

a = 4 になるので,正方形の一辺の長さは 2a = 8 である。

その他のパラメータは以下の通り。

a = 4//1;  b = 55//6;  c = 44//3;  d = 8//3;  e = 23//3;  x = 44//5; y = 44//5

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   x = 44//5; y = 88//15; b = 55//6; d = 8//3; e = 23//3; c = 44//3; a = 4//1
   println("a = $a;  b = $b;  c = $c;  d = $d;  e = $e;  x = $x; y = $x")
   println("赤: $((d + 2a - e)a)")
   println("黃: $((e - d)*(x - a))")
   println("黒: $((c - (d + 2a))a)")
   plot([x, 0, -x, 0, x],  [y, c, y, 0, y], color=:black, lw=0.5)
   plot!([a, a, -a, -a, a], [d, d + 2a, d + 2a, d, d], color=:black, lw=0.5)
   plot!([0, a, a, 0], [b, d + 2a, e, b], color=:red, seriestype=:shape, alpha=0.4)
   plot!([0, -a, -a, 0], [b, d + 2a, e, b], color=:red, seriestype=:shape, alpha=0.4)
   plot!([a, x, a, a], [e, y, d, e], color=:yellow, seriestype=:shape, alpha=0.4)
   plot!([-a, -x, -a, -a], [e, y, d, e], color=:yellow, seriestype=:shape, alpha=0.4)
   plot!([0, a, -a, 0], [c, d + 2a, d + 2a, c], color=:black, seriestype=:shape, alpha=0.2)
   segment(x, y, -a, d + 2a)
   segment(-x, y, a, d + 2a)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
       point(a, d + 2a, " (a,d+2a)", :black, :left, :vcenter)
       point(a, e, " (a,e)", :black, :left, :bottom, delta=delta/2)
       point(x, y, " (x,y)", :black, :left, :vcenter)
       point(a, d, " (a,d)", :black, :left, delta=-delta/2)
       point(0, b, " b", :black, :left, delta=-delta)
       point(0, c, " c", :black, :left, :vcenter)
       point(0, d, " d", :black, :left, delta=-delta)
   end
end;

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

算額(その625)

2024年01月10日 | Julia

算額(その625)

和算図形問題あれこれ
令和4年10月の問題-No.1

https://gunmawasan.web.fc2.com/kongetu-no-mondai.html

直角三角形の面積を縦線で n 等分する。甲の長さが a 寸であるとき,乙の長さを n と a で表わせ。また,n = 10,a = 419 のときの 乙の長さを求めよ。

底辺を n 個に区分する分点を w[1], w[2], ..., w[n-2], w[n-1], w[n] とする。
原点 w[0], からそれぞれの分点までを底辺とする直角三角形の高さ(分点から斜辺までの垂直距離)を h[1], h[2], ..., h[n-2], h[n-1], h[n] とする。
甲の長さは a = w[n] - w[n-1],乙の長さは w[n-1] - w[n-2] である。
(分点 w[n] までの)直角三角形全体の面積は S[n] = 底辺*高さ/2 = w[n]*h[n]/2 である。
分点 w[n-1] までの直角三角形の面積はS[n] の (n-1)/n 倍である。 S[n-1] = w[n-1]*h[n-1]/2 = S[n]*(n - 1)/n である。
分点 w[n-2] までの直角三角形の面積はS[n] の (n-2)/n 倍である。 S[n-2] = w[n-2]*h[n-2]/2 = S[n]*(n - )/n である。
この3つの直角三角形に関して以下の連立方程式を解くと,w[n], b[n], w[n-1], b[n-1], w[n-2], b[n-2] が求まる。
甲の長さは w[n] - w[n-1],乙の長さは w[n-1] - w[n-2] である。
乙の長さは甲の長さの (w[n-1] - w[n-2])/(w[n] - w[n-1]) 倍である。

以下の連立方程式では便宜上 10, 9, 8 を添え字として使っているように見えるが識別のためだけで分割数を n = 10 にしているわけではないことに注意。また,直角三角形の高さは問題を解くに当たっては不要なものである。
このやり方にしたがうと,相似比と面積比の関係などということも考えなくてよい。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy

@syms w8::positive, h8::positive,
     w9::positive, h9::positive,
     w10::positive, h10::positive,
     底辺::positive, 高さ::positive, n::positive
S = 底辺*高さ/2
eq1 = w10*h10/2 - S*(n - 0)/n
eq3 = w9*h9/2 - S*(n - 1)/n
eq5 = w8*h8/2 - S*(n - 2)/n
eq2 = h10/w10 - 高さ/底辺
eq4 = h9/w9 - 高さ/底辺
eq6 = h8/w8 - 高さ/底辺;

res = solve([eq1, eq2, eq3, eq4, eq5, eq6], (w10, w9, w8, h10, h9, h8))

   1-element Vector{NTuple{6, Sym}}:
    (底辺, 底辺*sqrt(n - 1)/sqrt(n), 底辺*sqrt(n - 2)/sqrt(n), 高さ, 高さ*sqrt(n - 1)/sqrt(n), 高さ*sqrt(n - 2)/sqrt(n))

甲の長さは以下のようになる。

res[1][1] - res[1][2] |> println  # w10 - w9

   底辺 - 底辺*sqrt(n - 1)/sqrt(n)

乙の長さは以下のようになる。

res[1][2] - res[1][3] |> println  # w9 - w8

   -底辺*sqrt(n - 2)/sqrt(n) + 底辺*sqrt(n - 1)/sqrt(n)

問題が「甲を与えて乙を求める」なので,「乙/甲」の倍率を求める。
簡約化する前は複雑な式に見えるが,簡約化するときれいな形になる。
f = (√(n - 1) - √(n - 2))/(√n - √(n - 1))

f = (res[1][2] - res[1][3]) / (res[1][1] - res[1][2])
f |> simplify |> println

   (-sqrt(n - 2) + sqrt(n - 1))/(sqrt(n) - sqrt(n - 1))

n = 10, 甲の長さ a = 419 のときの乙の長さ 443.00019273604335 は以下のよう求められる。

n = 10
a = 419
a*(√(n - 1) - √(n - 2))/(√n - √(n - 1))

   443.00019273604335

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (底辺, 高さ) = (10, 4)
   n = 10
   plot([0, 底辺, 底辺, 0], [0, 0, 高さ, 0], color=:blue, lw=0.5, showaxis=false)
   delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
   for i = 1:n
       w = 底辺*sqrt(i)/sqrt(n)
       h = w * 高さ/底辺
       segment(w, 0, w, h, :blue)
       point(w, 0, "w$i", :red, :center, delta=-3delta)
       point(w, h, "h$i", :red, :center, :bottom, delta=3delta)
   end
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       # vline!([0], color=:black, lw=0.5)
       # hline!([0], color=:black, lw=0.5)
       point(0, 0, "w0", :red, :center, delta=-3delta)
   end
end;

 

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

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

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