裏 RjpWiki

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

算額(その161)

2023年03月13日 | Julia

算額(その161)

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

第12問: 黒円に外接する 3 個の赤円に 3 個の黃円が外接している。赤円と黒円の直径を知って黃円の直径を求めよ。

黒,赤,黃の円の半径を r1, r2, r3 とする。また,黃円の中心座標を (x3, y3) とし,連立方程式を解く。

using SymPy

@syms r1::positive, r2::positive, r3::positive, x3::positive, y3::positive;
eq1 = x3 - (r1 + r3) * cos(PI/6)
eq2 = y3 - (r1 + r3) * sin(PI/6)
eq3 = x3^2 + (r1 + r2 - y3)^2 - (r2 + r3)^2;  # 赤円と黃円が外接

res = solve([eq1, eq2, eq3], (r3, x3, y3))
res |> println

   Tuple{Sym, Sym, Sym}[(-r1*(r1 + r2)/(r1 - 3*r2), -2*sqrt(3)*r1*r2/(r1 - 3*r2), -2*r1*r2/(r1 - 3*r2))]

黃円の半径は -r1*(r1 + r2)/(r1 - 3*r2) つまり,「黒円の半径の二乗に黒円の半径と赤円の半径をかけたものを加え,赤円の半径の 3 倍から黒円の半径を引いたもので割る」。

using Plots

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 draw(R2, R1, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = (R1, R2) ./ 2
   (r3, x3, y3) = (-r1*(r1 + r2)/(r1 - 3*r2), -2*sqrt(3)*r1*r2/(r1 - 3*r2), -2*r1*r2/(r1 - 3*r2))
   println("r3 = $r3;  x3 = $x3;  y3 = $y3")
   plot()
   println("黃円径 = $(2r3);  黒円径 = $R1;  赤円径 = $R2")
   circle(0, 0, r1, :snow4, fill=true)
   circle(0, r1 + r2, r2, :indianred1, fill=true)
   circle((r1 + r2)√3/2, -(r1 + r2)/2, r2, :indianred1, fill=true)
   circle(-(r1 + r2)√3/2, -(r1 + r2)/2, r2, :indianred1, fill=true)
   circle(x3, y3, r3, :khaki1, fill=true)
   circle(-x3, y3, r3, :khaki1, fill=true)
   circle(0, -r1 - r3, r3, :khaki1, fill=true)
   if more == true
       point(0, r1, " r1", :white)
       point(0, r1 + r2, " r1+r2", :white)
       point(x3, y3, "(x3,y3,r3)", :black)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(2, 2.3, false)

   r3 = 1.3364864864864863;  x3 = 2.153360463464009;  y3 = 1.243243243243243
   黃円径 = 2.6729729729729725;  黒円径 = 2.3;  赤円径 = 2

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

算額(その160)

2023年03月13日 | Julia

算額(その160)

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

第11問: 二等辺三角形とその頂点を通る大円と接する赤円と小円がある。大円と赤円の直径を知って小円の直径を求めよ。

小円,大円,赤円の半径を r1, r2, r3, 大円の中心座標を (x3, y3) とし,方程式を立て解く。

using SymPy

@syms r1::positive, r2::positive, r3::positive;
eq1 = (r2 - 2r3) / r2 - r1 / (r1 + 2r2);
res = solve(eq1, r1)[1] |> expand
res |> println

   r2^2/r3 - 2*r2

小円の直径は「大円の直径の二乗を赤円の直径で割り,大円の直径の2倍を引く」ことで求まる。

その他,図を描くために以下の計算をする。θは二等辺三角形の頂角の半分である。

sinθ = (r2 - 2r3) / r2
cosθ = sqrt(1 - sinθ^2)
x3 = (r2 - r3)*cosθ
y3 = (r2 - r3)*sinθ + r2 + 2r2;

using Plots

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 draw(R2, R3, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r2, r3) = (R2, R3) ./ 2
   r1 = r2^2/r3 - 2*r2
   sinθ = (r2 - 2r3) / r2
   cosθ = sqrt(1 - sinθ^2)
   x3 = (r2 - r3)*cosθ
   y3 = (r2 - r3)*sinθ + r2 + 2r1
   x0 = 2(r1 + r2)*sinθ/cosθ
   plot()
   println("小円径 = $(2r1);  大円径 = $R2;  赤円径 = $R3)")
   circle(0, r2 + 2r1, r2, :black)
   circle(x3, y3, r3, :tomato1, fill=true)
   circle(-x3, y3, r3, :tomato1, fill=true)
   circle(0, r1, r1)
   plot!([x0, 0, -x0, x0], [0, 2(r1 + r2), 0, 0], color=1, lw=0.5)
   if more == true
       point(0, r1, " r1")
       point(0, 2r1 + r2, " 2r1+r2", :black)
       point(x3, y3, "(x3,y3,r3)", :white, :center, :bottom)
       point(x0, 0, "   x0", :black, :center, :bottom)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(4.3, 2, false)

   小円径 = 0.6449999999999996;  大円径 = 4.3;  赤円径 = 2)

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

算額(その159)

2023年03月13日 | Julia

算額(その159)

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

第9問: 紫と赤の円 2 個ずつで青円 2 個と黒円を挟む。黒円,青円の直径を知って赤円の直径を求めよ。

黒,青,赤,紫の円の半径を r1, r2, r3, r4 として,紫の円が黒,青,赤の円に外接することについて連立方程式を解く。

using SymPy

@syms r1::positive, r2::positive, r3::positive, r4::positive;
eq1 = (r1 + r4)^2 + (r1 + r2)^2 - (r2 + r4)^2;
eq2 = (r1 + r4)^2 + (r1 + 2r2 + r3)^2 - (r3 + r4)^2;
res = solve([eq1, eq2], (r3, r4))[1]

   (r2^3/(r1^2 + r1*r2 - r2^2), -r1*(r1 + r2)/(r1 - r2))

赤半径= 青半径^3 / (黒半径^2 + 黒半径*青半径 - 青半径^2) である。
十分綺麗な式になっているが術文では「黒径/青径 を極とおき,赤径 = 青径/(極(極+1)-1)」としている。

using Plots

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 draw(R1, R2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = (R1, R2) ./ 2
   (r3, r4) = (r2^3/(r1^2 + r1*r2 - r2^2), -r1*(r1 + r2)/(r1 - r2))
   plot()
   println("黒径 = $R1;  青径 = $R2, 赤径 = $(2r3), 紫径 = $(2r4)")
   circle(0, 0, r1, :black, fill=true)
   circle(0, r1+r2, r2, :deepskyblue, fill=true)
   circle(0, -r1-r2, r2, :deepskyblue, fill=true)
   circle(0, r1+2r2+r3, r3, :tomato1, fill=true)
   circle(0, -r1-2r2-r3, r3, :tomato1, fill=true)
   circle(r1+r4, 0, r4, :violet, fill=true)
   circle(-r1-r4, 0, r4, :violet, fill=true)
   if more == true
       point(0, r1, "r1", :white, :center, :top)
       point(0, r1+r2, "r1+r2", :white, :center, :top)
       point(0, r1+2r2+r3, "r1+2r2+r3", :white, :center, :top)
       point(r1+r4, 0, "r1+r4", :white, :center, :top)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(1, 1.3, false)

   黒径 = 1;  青径 = 1.3, 赤径 = 3.601639344262298, 紫径 = 7.666666666666665

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

算額(その158)

2023年03月13日 | Julia

算額(その158)

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

第10問: 直角三角形内に互いに接する 3 個の円を入れる円の直径を知って直角三角形の直角を挟む長い方の一辺(股)の長さを求めよ。

3 個の円の中心は正三角形を構成する。図において,⊿ADE と ⊿ABC は相似であり BC = 3√3r,BX = 2r, CG = r ゆえ FG = 3(1+√3)r である。したがって,「円の直径を知って」ということであれば,股の長さは円の直径の 3(1+√3)/2 = 4.098076211353316 倍である。術文では √(6.75) + 1.5 倍と書いてあるが。

図を描くためにわざわざ SymPy を使ってみる。

using SymPy

function distance(x1, y1, x2, y2, x0, y0)
   p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
   l = sympy.Line(p1, p2)
   l.distance(sympy.Point(x0, y0))^2  # 二乗距離を返す!!
end;

@syms r::positive, x::positive, y::positive;

eq1 = distance(x, 0, 0, y, r, 3r) - r^2
eq2 = sqrt(Sym(3))y - x;

res = solve([eq1, eq2], (x, y))

   2-element Vector{Tuple{Sym, Sym}}:
    (r*(-1 + 3*sqrt(3)), r*(9 - sqrt(3))/3)
    (3*r*(1 + sqrt(3)), r*(sqrt(3) + 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(R, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = R/2
   (x, y) = (3*r*(1 + sqrt(3)), r*(sqrt(3) + 3))
   println("股の長さ = $x, 円の直径 = $R")
   plot([0, 0, -x, 0], [0, y, 0, 0], color=:black, lw=0.5)
   circle(-r, 3r, r, :blue, fill=true)
   circle(-r, r, r, :blue, fill=true)
   circle(-(1+√3)r, 2r, r, :blue, fill=true)
   if more == true
       point(-r, 3r, " A", :white)
       point(-(1+√3)r, 2r, "D ", :white, :right, :bottom)
       point(-r, r, "", :white)
       point(-(1+3√3)r, 0, "B ", :green, :right, :bottom)
       point(-r, 2r, " E", :white, :left, :bottom)
       point(-3(1+√3)r, 0, "X", :green, :right, :bottom)
       point(-r, 0, " C", :white, :left, :bottom)
       point(0, 0, " G", :black, :left, :bottom)
       point(0, x/√3, " Y", :black, :left)
       segment(-r, 3r, -(3√3+1)r, 0)
       segment(-r, 3r, -r, 0)
       segment(-(1+√3)r, 2r, -r, 2r)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(1, false)

   股の長さ = 4.098076211353316, 円の直径 = 1

 

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

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

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