裏 RjpWiki

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

算額(その1136)

2024年07月10日 | Julia

算額(その1136)

一七 大里郡岡部村岡 稲荷社 文化14年(1817)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円2個,等脚台形,正五角形

等脚台形の中に,倒立した正五角形を容れ,隙間に 2 個の等円を容れる。等円の直径が 0.318 寸のとき,上頭と下頭(上底と下底)の積はいかほどか。

上頭(正五角形の一辺の長さ)を 2a とする。
このとき,図に示すように上頭を対称軸に正五角形を描くとき,その頂点と下頭頂点を結ぶ直線は等脚台形の斜辺に一致し,また,2 つの三角形は相似で相似比が 1:2 なので,下頭は上頭の2倍すなわち 4a である。
正五角形を内包する円の半径を R,正五角形の高さを h
等円の半径と中心座標を r, (x, r)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy

@syms a::positive, r::positive, x::positive
eq1 = dist2(2a, 0, 2a*cosd(Sym(36)), 2a*sind(Sym(36)), x, r, r)
eq2 = dist2( 0, 0, 2a*cosd(Sym(36)), 2a*sind(Sym(36)), x, r, r);
res = solve([eq1, eq2], (a, x))[4]  # 4 of 4

   ((sqrt(2)*r + (r*(sqrt(2) + sqrt(10))/(2*sqrt(5 - sqrt(5))) + 2*sqrt(2)*r/sqrt(5 - sqrt(5)))*(sqrt(25 - 5*sqrt(5))/2 + 3*sqrt(5 - sqrt(5))/2))/(sqrt(5 - sqrt(5))*(sqrt(5) + 3)) + sqrt(5)*sqrt(-sqrt(5)*r^2 + 3*r^2 + (-2*sqrt(10)*r*sqrt(5 - sqrt(5)) - 4*sqrt(2)*r*sqrt(5 - sqrt(5)))*(r*(sqrt(2) + sqrt(10))/(2*sqrt(5 - sqrt(5))) + 2*sqrt(2)*r/sqrt(5 - sqrt(5))) + (sqrt(5) + 5)*(r*(sqrt(2) + sqrt(10))/(2*sqrt(5 - sqrt(5))) + 2*sqrt(2)*r/sqrt(5 - sqrt(5)))^2)/(sqrt(5 - sqrt(5))*(sqrt(5) + 5)), r*(sqrt(2) + sqrt(10))/(2*sqrt(5 - sqrt(5))) + 2*sqrt(2)*r/sqrt(5 - sqrt(5)))

a はさほど簡単な式にはならない.

ans_a = res[1] |> simplify |> factor
ans_a |> println

   r*sqrt(5 - sqrt(5))*(2*sqrt(10) + 5*sqrt(2))/10

ところが,上頭 = 2a,下頭 = 4a で,上頭*下頭 = 8a^2 を計算すると極めて簡潔な式になる。

res3 = 2ans_a * 4ans_a |> simplify
res3 |> println

   r^2*(44*sqrt(5)/5 + 20)

この式に,問で与えられた「等円の直径が 0.318 寸」を代入すると 1.00308430394472 になり,「答」にあるように,「1.00寸有奇」ときれいな数値になる。

res3(r => 0.318/2).evalf() |> println

   1.00308430394472

r がいくつのときに正確に 1 になるかを求めるには以下のようにすればよい。

solve(res3 - 1, r)[1] |> println
solve(res3 - 1, r)[1].evalf() |> println

   sqrt(5)/(2*sqrt(11*sqrt(5) + 25))
   0.158755363590950

r が sqrt(5)/(2*sqrt(11*sqrt(5) + 25)) = 0.158755363590950 のとき,上頭 2a,下頭 4a はそれぞれ,sqrt(2)/2, sqrt(2) となり,かけ合わせれば正確に 1 になることがわかる。

@syms d
apart(2ans_a(r => sqrt(Sym(5))/(2*sqrt(11*sqrt(Sym(5)) + 25))), d)|> simplify |> println
apart(4ans_a(r => sqrt(Sym(5))/(2*sqrt(11*sqrt(Sym(5)) + 25))), d)|> simplify |> println

   sqrt(2)/2
   sqrt(2)

解を求めるうえでは重要ではないが,図を描くために x も求めておこう。

@syms d
ans_x = res[2] |> simplify
ans_x = apart(ans_x) |> simplify
ans_x |> println

   r*sqrt(5 - sqrt(5))*(sqrt(10) + 3*sqrt(2))/4

パラメータは以下の通りである。

   r = 0.15875536359095;  x = 0.488598768962138;  R = 0.601500955007548;  h = 1.08812544974141
   a = 0.353553390593275;  上頭 = 2a = 0.70710678118655;  下頭 = 4a= 1.4142135623731;  上頭×下頭 = 1.00000000000001

function draw(r, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = r*sqrt(5 - sqrt(5))*(2*sqrt(10) + 5*sqrt(2))/10
   x = r*sqrt(5 - sqrt(5))*(sqrt(10) + 3*sqrt(2))/4
   R = a/sind(36)
   h = R*cosd(36) + R
   @printf("r = %.15g;  x = %.15g;  R = %.15g;  h = %.15g\n", r, x, R, h)
   @printf("a = %.15g;  上頭 = 2a = %.15g;  下頭 = 4a= %.15g;  上頭×下頭 = %.15g\n", a, 2a, 4a, 8a^2)
   plot(showaxis=false)
   circle(0, R, R)
   circle(0, 2h - R, R, :pink1)
   circle(x, r, r, :green)
   θ = -90:72:270
   xa = @. R*cosd(θ)
   ya = @. R*(1 + sind(θ))
   for i = 1:5
       segment(xa[i], ya[i], xa[i + 1], ya[i + 1], :blue)
       segment(xa[i],  2h - ya[i], xa[i + 1], 2h - ya[i + 1], :paleturquoise3)
   end
   plot!([0, 2a, 0, 0], [0, 0, 2h, 0], color=:magenta, lw=0.5)
   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(2a, 0, " 2a", :magenta, :left, :bottom, delta=delta/2)
       point(a, h, "  (a,h)", :magenta, :left, :vcenter)
       point(0, 2h, "(0,2h)", :magenta, :center, :bottom, delta=delta/2)
       point(x, r, " r,(x,r)", :green, :center, delta=-delta/2)
       point(0, R, " R", :blue, :left, :vcenter)
   end
end;

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

算額(その1135)

2024年07月10日 | Julia

算額(その1135)

一七 大里郡岡部村岡 稲荷社 文化13年(1816)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:円4個,外円,弦2本

外円の中に 2 本の垂直な弦を引き,甲円 2 個,乙円 1 個,丙円 1 個を容れる。甲円,乙円の直径がそれぞれ 12 寸,9 寸のとき,丙円の直径はいかほどか。

外円の半径と中心座標を R, (0, 0)
甲円の半径と中心座標を r1, (R - 2r3 - r1, r1)
乙円の半径と中心座標を r2, (r2 - R, 0)
丙円の半径と中心座標を r3, (R - r3)
とおき,以下の連立方程式を解く。

include("julia-source.txt")

using SymPy

@syms R::positive, r1::positive, r2::positive, r3::positive
R = r1 + r2 + r3
eq1 = (R - 2r3 - r1)^2 + r1^2 - (R - r1)^2
r3 = solve(eq1, r3)[1]
r3 |> println

   r1^2/(4*r2)

丙円の直径は,甲円の直径の二乗を乙円の直径の 4 倍で割って得られる。
甲円,乙円の直径がそれぞれ 12 寸,9 寸のとき,丙円の直径は 12^2/(4*9) = 4 寸である。

function draw(r1, r2, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r3 = r1^2/(4*r2)
   R = r1 + r2 + r3
   @printf("甲円,乙円の直径が %g,%g のとき,丙円の直径は %g である。\n", 2r1, 2r2, 2r3)
   plot()
   circle(0, 0, R, :orange)
   circle22(R - 2r3 - r1, r1, r1)
   circle(r2 - R, 0, r2, :blue)
   circle(R - r3, 0, r3, :green)
   x1 = R - 2r3
   y1 = sqrt(R^2 - x1^2)
   segment(x1, y1, x1, -y1, :magenta)
   x2 = 2r2 - R
   y2 = sqrt(R^2 - x2^2)
   segment(x2, y2, x2, -y2, :magenta)
   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(R, 0, " R", :green, :left, :bottom, delta=delta/2)
       point(0, R, " R", :green, :left, :bottom, delta=delta/2)
       point(R - 2r3 - r1, r1, "甲円:r1,(R-2r3-r1,r1)", :red, :center, delta=-delta/2)
       point(r2 - R, 0, "乙円:r2,(r2-R,0)", :blue, :center, delta=-delta/2)
       point(R - r3, 0, "丙円:r3\n(R-r3,0)", :black, :center, :bottom, delta=delta/2)
   end
end;

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

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

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