裏 RjpWiki

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

算額(その346)

2023年07月24日 | Julia

算額(その346)

岐阜県大垣市赤坂町 金生山明星輪寺 元治2年(1865)http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

扇の中に赤円,緑円,白円を入れる。扇の半径を与えて,白円が最大となるとき,赤円と白円との直径の和を求めよ。

扇の要を原点とし,扇の半径を R
赤円の直径を r1, (0, R - r1)
白円の直径を r2, (x2, y2)あ
緑円の直径を r3, (x3, y3)
とする。

include("julia-source.txt");

using SymPy

R = 1 とおき,赤円,白円,緑円の半径を決める。

緑円の半径は R - 2r1 + 2r2 + 2r3 = R なので,r3 = r1 - r2 である。

@syms R::positive, x::positive, r1::positive, r2::positive, x2::positive, y2::positive,
     r3::positive, x3::positive, y3::positive

solve(R - 2r1 + 2r2 + 2r3 - R, r3);
r3 = r1 - r2

白円と緑円の中心は原点を通る直線上にある。この直線と扇の右端の直線のなす角を θ とする。
原点から白円と緑円中心までの距離はそれぞれ 1 - 2r1 + r2, 1 - 2r1 + 2r2 + r3 である。
よって
r2 = (1 - 2r1 + r2)sin(θ)
r3 = (1 - 2r1 + 2r2 + r3)sin(θ) である(つまり,r2, r3 を一辺とする直角三角形は相似である)。
これより,r2/r3 = (1 - 2r1 + r2)/(1 - r3) である。

eq0 = r2/r3 - (1 - 2r1 + r2)/(1 - r3) |> expand
eq0 |> println

   2*r1/(-r1 + r2 + 1) - r2/(-r1 + r2 + 1) + r2/(r1 - r2) - 1/(-r1 + r2 + 1)

この式を r2 について解くと,2つの解が得られるが 2 番目のもの r1 + sqrt(1 -2r1)/2 -1/2 が適解である。

solve(eq0, r2)
r2 = r1 + sqrt(1 -2r1)/2 - 1//2

これを r1 の関数とみて,極大値・最大値を求めるには,まず r1 について微分し,微分係数 = 0 となる r1 を求める。

plot(r2, xlims=(0, 0.5), ylims=(0, 0.15), xlabel="r1", ylabel="r2", aspectratio=:none)

diff(r2)
d = 1 - 1/2sqrt(1 - 2r1)
plot(d, xlims=(0, 0.5), ylims=(-0.1, 0.5), xlabel="r1", ylabel="r2'", aspectratio=:none)
hline!([0])
plot!()

d = 1 - 1/2sqrt(1 - 2r1) = 0 を解いて,r1 = 3/8 のときに r2 が最大値 1/8 をとる

r1 = 3/8 のとき極大かつ最大値をとる。

solve(eq0(r1 => 3//8))[1] |> println  # r2

   1/8

赤円の直径と白円の直径の和は 2\*3/8 + 2\*1/8 = 1。つまり,白円が最大となるとき,赤円と白円の直径の和は扇の半径に等しい。

また,r3 = r1 - r2 なので,r3 = 2/8 である。

次に,各円の中心座標と扇の右端の点の座標を求める。

using SymPy

@syms R::positive, x::positive, x2::positive, y2::positive,
     r3::positive, x3::positive, y3::positive

R = 1
(r1, r2) = (3//8, 1//8)
r3 = r1 - r2
eq1 = x2^2 + (R - r1 - y2)^2 - (r1 + r2)^2
eq2 = x3^2 + (R - r1 - y3)^2 - (r1 + r3)^2
eq4 = x2^2 + y2^2 - (r2 + R - 2r1)^2
eq5 = x3^2 + y3^2 - (R - r3)^2
eq6 = distance(0, 0, x, sqrt(R^2 - x^2), x2, y2) - r2^2;
eq7 = distance(0, 0, x, sqrt(R^2 - x^2), x3, y3) - r3^2;

solve([eq1, eq2, eq4, eq5, eq6], (x, x2, y2, x3, y3))

   2-element Vector{NTuple{5, Sym}}:
    (-1/5 + 8*sqrt(2)/15, 3/10, 9/40, 3/5, 9/20)
    (1/5 + 8*sqrt(2)/15, 3/10, 9/40, 3/5, 9/20)

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

扇の中心角 = 145.203°
赤円半径 = 0.375;  白円半径 = 0.125;  緑円半径 = 0.25
x = 0.954247;  x2 = 0.3;  x3 = 0.225;  x3 = 0.6;  y4 = 0.45
赤円直径 + 白円直径 = 1 すなわち,赤円の直径と白円の直径の和は扇の半径に等しい

以上の結果に基づき図を描く。

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   R = 1
   (r1, r2) = (3//8, 1//8)
   r3 = r1 - r2
   (x, x2, y2, x3, y3) = (1/5 + 8*sqrt(2)/15, 3/10, 9/40, 3/5, 9/20)
   y = sqrt(R^2 - x^2)
   r3 = r1 - r2
   θ = atand(y, x)
   @printf("扇の中心角 = %g°\n", 180 - 2θ)
   @printf("赤円半径 = %g;  白円半径 = %g;  緑円半径 = %g\n", r1, r2, r3)
   @printf("x = %g;  x2 = %g;  x3 = %g;  x3 = %g;  y4 = %g\n", x, x2, y2, x3, y3)
   @printf("赤円直径 + 白円直径 = %g\n", 2r1 + 2r2)
   plot()
   circle(0, 0, R, :black, beginangle=θ, endangle=180 - θ)
   circle(0, 0, R - 2r1, :black, beginangle=θ, endangle=180 - θ)
   segment(0, 0, x, y, :black)
   segment(0, 0, -x, y, :black)
   circle(0, R - r1, r1, :red)
   circle(x2, y2, r2, :blue)
   circle(-x2, y2, r2, :blue)
   circle(x3, y3, r3, :green)
   circle(-x3, y3, r3, :green)
   if more
       point(0, R, " R", :black)
       point(x, y, "(x,y)", :black)
       point(0, R - r1, " 赤円:r1\n R-r1", :red, :left, :vcenter)
       point(0, R - 2r1, " R-2r1", :red, :center, :bottom)
       point(x3, y3, " 緑円:r3,(x3,y3)", :green, :center)
       point(x2, y2, " 白円:r2,(x2, y2)", :blue)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 

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

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

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