裏 RjpWiki

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

算額(その154)

2023年03月10日 | Julia

算額(その154)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第5問: 円の中に 1 本の弦を隔てて赤,青,黒の円を入れる。青円,黒円の直径を知って赤円の直径を求めよ。

図のように記号を定め,連立方程式を解く。

using SymPy

@syms r1::positive, r2::positive, r3::positive, x3::positive, y3::positive;

eq1 = 2r2 - y3 - r3                                 # 赤円の中心の y 座標
eq2 = x3^2 + (y3 - r2)^2 - (r2 + r3)^2              # 赤円が青円に外接
eq3 = x3^2 + (y3 - (r1 + r2))^2 - (r1 + r2 - r3)^2  # 赤円が外円に内接

res = solve([eq1, eq2, eq3], (r3, x3, y3))          # 赤円の半径,中心座標を求める

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (r1*r2/(r1 + r2), 2*sqrt(r1)*r2/sqrt(r1 + r2), r2*(r1 + 2*r2)/(r1 + r2))

r3 = r1*r2/(r1 + r2)
赤円の半径は,黒円と青円の半径の積を,黒円と青円の半径の和で割ると得られる。

黒円と青円の半径を与えて,赤円の半径と中心座標を返す関数

f(r1, r2) = (r1*r2/(r1 + r2), 2*sqrt(r1)*r2/sqrt(r1 + r2), r2*(r1 + 2*r2)/(r1 + r2));

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
   plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(r1, r2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = (r1, r2) ./ 2
   (r3, x3, y3) = f(r1, r2)
   plot()
   circle(0, r1 + r2, r1 + r2, :black)
   circle(0, r1 + 2r2, r1, :black, fill=true)
   circle(0, r2, r2, :blue, fill=true)
   circle(x3, y3, r3, :red, fill=true)
   circle(-x3, y3, r3, :red, fill=true)
   x0 = 2sqrt(r1*r2)
   segment(x0, 2r2, -x0, 2r2)
   println("黒円の直径 = $(2r1), 青円の直径 = $(2r2), 赤円の直径 = $(2r3)")
   if more == true
       point(0, r1 + 2r2, " r1", :white)
       point(0, r2, " r2", :white)
       point(0, r1 + r2, " r1+r2", :white)
       point(0, 2r2, " 2r2", :white)
       point(x3, y3, "(x3,y3,r3)", :white, :center)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(4, 12)

   黒円の直径 = 4.0, 青円の直径 = 12.0, 赤円の直径 = 3.0

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

算額(その153)

2023年03月10日 | Julia

算額(その153)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第4問: 萌黄の正方形に,黒の正方形を作り,その一辺に頂点を持つ赤の正方形を描く。萌黄と黒の正方形の一辺の長さを知って,赤の一辺の長さを求めよ。

図の左下 1/4 を見ればよい。SymPy を使わなくても,図の AB の長さ(黒の正方形の一辺の長さの半分)を c,萌黄の正方形の一辺の長さの半分を b, 赤の正方形の一辺の長さを a とすれば,c = (b - a)*√2 である。a で解くと a = b - c/√2 である。
つまり,赤の正方形の一辺の長さは「萌黄の正方形の一辺の長さの半分から,黒の正方形の一辺の長さの半分を √2 で割ったものを引く

using SymPy

@syms a::positive, b::positive, c::positive;

eq = (b - a)sqrt(Sym(2)) - c
solve(eq, a)[1] |>  println


   b - sqrt(2)*c/2

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
   plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function rect(x1, y1, x2, y2, color=:pink; fill=true)
   if fill
       plot!([x1, x2, x2, x1, x1], [y1, y1, y2,  y2, y1], color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!([x1, x2, x2, x1, x1], [y1, y1, y2,  y2, y1], color=color, linewidth=0.5)
   end
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, b) = (3, 5)
   plot()
   rect(0, 0, 2b, 2b, :olivedrab1)
   rect(0, 0, a, a, :tomato1)
   rect(0, 2b - a, a, 2b, :tomato1)
   rect(2b - a, 0, 2b, a, :tomato1)
   rect(2b - a, 2b - a, 2b, 2b, :tomato1)
   plot!([b, 3b - 2a, b, 2a - b, b], [2a - b, b, 3b - 2a, b, 2a - b],
       color=:black, linewidth=0.25, seriestype=:shape, fillcolor=:black)
   if more == true
       plot!([0, b, b], [b, b, 0], color=:blue)
       point(2a - b, b, "  A(2a-b,b)", :white, :left, :bottom)
       point(a, a, " B(a,a)", :white, :left, :bottom)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その152)

2023年03月10日 | Julia

算額(その152)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/kadai13/kadai410.htm

第3問: 萌黄色の 3 個の円が交わり,その間に 4 個の赤円を入れる。萌黄色の円の直径が分かっているときに赤円の直径を求めよ。

計算しなくても,
AB = BC = CD = 赤円の半径
AB + BC + CD = 萌黄円の半径
なので,赤円の径 = 萌黄円の径 / 3 であることがわかる。

3 個の萌黄円が内接する半径 1 の外円を考える。

図のように記号を定め,連立方程式を解く。
右上にある赤円の中心座標,半径を (x2, y2), r2
右下にある萌黄円の中心座標,半径を (x3, y3), r3

using SymPy

@syms r2::positive, r3::positive

x2 = 2r2 * cos(PI/6)
y2 = 2r2 * sin(PI/6)
x3 = (1 - r3) * cos(PI/6)
y3 = (r3 - 1) * sin(PI/6)
eq1 = 2r3 - 1 - r2  # 半径間の関係
eq3 = x2^2 + (1 - r3 - y2)^2 - (r3 - r2)^2;  # 赤円が萌黄円に内接

res = solve([eq3, eq1], (r2, r3))

   1-element Vector{Tuple{Sym, Sym}}:
    (1/5, 3/5)

赤円の径は萌黄円の径の 1/3 である。

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
   plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r2, r3) = res[1]
   r0 = 1
   x2 = 2r2 * cos(PI/6)
   y2 = 2r2 * sin(PI/6)
   x3 = (r0 - r3) * cos(PI/6)
   y3 = (r3 - r0) * sin(PI/6)
   @printf("赤円の半径 = %.3f,  萌黄円の半径 = %.3f\n", r2, r3)
   @printf("x2 = %.3f,  y2 = %.3f,  x3 = %.3f,  y3 = %.3f\n", x2, y2, x3, y3)
   plot()
   circle(0, r0 - r3, r3, :olivedrab1, fill=true)
   circle(x3, y3, r3, :olivedrab1, fill=true)
   circle(-x3, y3, r3, :olivedrab1, fill=true)
   circle(x2, y2, r2, :tomato1, fill=true)
   circle(-x2, y2, r2, :tomato1, fill=true)
   circle(0, -2r2, r2, :tomato1, fill=true)
   circle(0, 0, r2, :tomato1, fill=true)

   circle(0, r0 - r3, r3, :black)
   circle(x3, y3, r3, :black)
   circle(-x3, y3, r3, :black)
   circle(x2, y2, r2, :black)
   circle(-x2, y2, r2, :black)
   circle(0, -2r2, r2, :black)
   circle(0, 0, r2, :black)
   if more == true
       circle(0, 0, 1, :black)
       point(x3, y3, " A:萌黄円(x3,y3,r3)", :blue)
       point(x3, 0, " B", :blue)
       point(x2, y2, " C:赤円(x2,y2,r2)", :blue)
       point(x3, 2r2, " D", :blue)
       segment(x3, y3, x3, 2r2)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

   赤円の半径 = 0.200,  萌黄円の半径 = 0.600
   x2 = 0.346,  y2 = 0.200,  x3 = 0.346,  y3 = -0.200

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

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

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