裏 RjpWiki

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

算額(その245)

2023年05月25日 | Julia

算額(その245)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額3(228)
長野県諏訪市下諏訪 諏訪大社下社 慶応4年(1868)

長方形内に大円 1 個,小円 2個が長方形に接して入っている。長方形の長辺と短辺はそれぞれ 15寸,8寸である。大円と片方の小円の共通接線(界斜)があるとき界斜の長さはいかほどか。

長方形の左下角を原点とする。
大円の半径,中心座標を r2, (r2, r2) とする。r2 = 4 である。
小円の半径,中心座標を r1, (15 - r1, r1), (15 - r1, 8 - r1) とする。r1 = 2 である。
界斜と長方形の下辺,上辺の交点座標を (x1, 0), (x2, 8) とする。

大円と下側の小円の中心から界斜までの距離に関する以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r1::positive, r2::positive, x1::positive, x2::positive;

r1 = 2
r2 = 4
eq1 = distance(x1, 0, x2, 8, 15 - r1, r1) - r1^2;
eq2 = distance(x1, 0, x2, 8, r2, r2) - r2^2;

res = solve([eq1, eq2], (x1, x2))

   3-element Vector{Tuple{Sym, Sym}}:
    (5, 20)
    (12, 6)
    (22, 44/9)

二番目の解が適切である。すなわち,界斜は座標 (12, 0), (6, 8) を結ぶ線分。
長さは sqrt((12 - 6)^2 + (8 - 0)^2) = 10 寸である。

sqrt((12 - 6)^2 + (8 - 0)^2)

   10.0

using Plots
using Printf

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x1, x2) = res[2]
   @printf("x1 = %.2f;  x2 = %.2f;  界斜の長さ = %.2f\n", x1, x2, sqrt((x2 - x1)^2 + 8^2))
   plot([0, 15, 15, 0, 0], [0, 0, 8, 8, 0], color=:black, lw=0.5)
   circle(15 - r1, r1, r1)
   circle(15 - r1, 8 - r1, r1)
   circle(r2, r2, r2, :green)
   segment(x1, 0, x2, 8, :blue)
   if more == true
       point(15 - r1, 1.2r1, "小円", :red, :center, :bottom, mark=false)
       point(15 - r1, r1, "\n(15-r1,r1)", :red, :center, :top)
       point(15 - r1, 8 - r1, "\n(15-r1,8-r1)", :red, :center, :top)
       point(r2, 1.1r2, "大円", :green, :center, :bottom, mark=false)
       point(r2, r2, "\n(r2,r2)", :green, :center, :top)
       point(x1, 0, "x1  ", :blue, :right, :bottom)
       point(x2, 8, "  x2", :blue, :left, :top)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その244)

2023年05月25日 | Julia

算額(その244)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額3(228)
長野県諏訪市下諏訪 諏訪大社下社 慶応4年(1868)

外円の中に大円,小円が 4 個ずつと正方形が入っている。大円の径を知って小円の径を求めよ。

外円の半径,中心座標を R, (0, 0)
大円の半径,中心座標を r2, (x2, x2)
右側の小円の半径,中心座標を r1, (r1, 0)

以下の連立方程式を解く。R は任意なので,R を含む式で求まる。

include("julia-source.txt");

using SymPy

@syms R::positive, r1::positive, r2::positive, x2::positive;

eq1 = (R - r1 - x2)^2 + x2^2 - (r1 + r2)^2
eq2 = 2x2^2 - (R - r2)^2
eq3 = 4(R - 2r2)^2 - 2(R - 2r1)^2 |> expand;

res = solve([eq1, eq2, eq3], (r1, r2, x2))

   2-element Vector{Tuple{Sym, Sym, Sym}}:
    (R*(-13 - sqrt(467 - 326*sqrt(2)) + 11*sqrt(2))/4, R*(-18 + sqrt(934 - 652*sqrt(2)) + 15*sqrt(2))/8, R*(-15/8 - sqrt(467/64 - 163*sqrt(2)/32) + 13*sqrt(2)/8))
    (R*(-3*sqrt(2) + sqrt(19 - 10*sqrt(2)) + 3)/4, R*(-2 + sqrt(2) + sqrt(38 - 20*sqrt(2)))/8, R*(-sqrt(19 - 10*sqrt(2))/8 - 1/8 + 5*sqrt(2)/8))

二番目の解が適切である。

(R*(-13 - sqrt(467 - 326*sqrt(2)) + 11*sqrt(2))/4,
R*(-18 + sqrt(934 - 652*sqrt(2)) + 15*sqrt(2))/8,
R*(-15/8 - sqrt(467/64 - 163*sqrt(2)/32) + 13*sqrt(2)/8)) |> println

(R*(-3*sqrt(2) + sqrt(19 - 10*sqrt(2)) + 3)/4,
R*(-2 + sqrt(2) + sqrt(38 - 20*sqrt(2)))/8,
R*(-sqrt(19 - 10*sqrt(2))/8 - 1/8 + 5*sqrt(2)/8)) |>  println

   (0.0284330026344626*R, 0.833448221620951*R, 0.117769891910505*R)
   (0.240353914715992*R, 0.316402492387137*R, 0.483376433235278*R)

大円の径を知って小円の径を求めるには,比「小円の径 / 大円の径」が分かればよい。

f = res[2][1] / res[2][2] |> expand |> simplify
f |> println

   2*(-3*sqrt(2) + sqrt(19 - 10*sqrt(2)) + 3)/(-2 + sqrt(2) + sqrt(2)*sqrt(19 - 10*sqrt(2)))

f |> N

   0.7596460852840080105563473006875416586766810646113255778335329777680921720071803

式が複雑なので,f の分母を有理化する。

@syms dummy
f2 = apart(f, dummy)
f2 |> println

   -sqrt(19 - 10*sqrt(2))/4 + 1/4 + 3*sqrt(2)/4

有理化後の式 f2 が元の式 f と等しいことを確認する。

f - f2 |> expand |> simplify

   0

大円の径が分かれば,0.759646 倍すれば,小円の径になる。

   0.949207 * 0.759646 ≒ 0.721062

using Plots
using Printf

function draw(R, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2, x2) =  (R*(-3*sqrt(2) + sqrt(19 - 10*sqrt(2)) + 3)/4, R*(-2 + sqrt(2) + sqrt(38 - 20*sqrt(2)))/8, R*(-sqrt(19 - 10*sqrt(2))/8 - 1/8 + 5*sqrt(2)/8))
   @printf("r1 = %.6f;  r2 = %.6f;  x2 = %.6f;  r1/r2 = %.6f\n", r1, r2, x2, r1/r2)
   #@printf("x1 = %.5f;  y1 = %.5f\n", x1, y1)
   plot([R - 2r1, 0, 2r1 - R, 0, R - 2r1], [0, R - 2r1, 0, 2r1 - R, 0], color=:black, lw=0.5)
   circle(0, 0, R)
   circle(R - r1, 0, r1, :green)
   circle(r1 - R, 0, r1, :green)
   circle(0, R - r1, r1, :green)
   circle(0, r1 - R, r1, :green)
   circle4(x2, x2, r2, :blue)
   if more == true
       point(0, R - 0.9r1, " 小円", :green, :left, :bottom, mark=false)
       point(0, R - r1, " R-r1")
       point(R - r1, 0.1r1, " 小円", :green, :left, :bottom, mark=false)
       point(R - r1, 0, " R-r1")
       point(x2, x2 + 0.1r2, " 大円", :blue, :left, :bottom, mark=false)
       point(x2, x2, " (x2,x2)", :blue)
       point(R, 0, " R")
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 

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

分母が複雑な場合の有理化

2023年05月25日 | Julia

今まで

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

算額(その243)

2023年05月25日 | Julia

算額(その243)

中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額3(227)
長野県諏訪市下諏訪 諏訪大社下社 慶応4年(1868)

正三角形とそれに内接する円 2 本の(左右対称な)斜線に接する貞円 3 個,元円,亨円,利円が 1 個ずつある。貞円の径を知って亨円の径を求めよ。

正三角形の一辺の長さを 1 とする。
右側の貞円の半径,中心座標を r1, (x1, y1)
下側の貞円の半径,中心座標を r1, (-r1, 0)
内接円の半径,中心座標を r2, (0, r2)
元円の半径,中心座標を r3, (0, r3)
利円の半径,中心座標を r4, (0, -2r1-r4)
亨円の半径,中心座標を r5, (0, -2r1-2r4-r5)
とする。
2 本の斜線の狭角の 1/2 を θとすると,sinθ= (√3 - r2) / (r2 - 2r1) である。
また,r2 = 1/√3,x1 = (r1 + r2)cos(π/6), y1 = (r1 + r2)sin(π/6) + r2 である。
以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r1::positive, x1::positive, y1::positive, r2::positive, r3::positive, r4::positive, r5::positive;

r2 = 1/√Sym(3)
sinθ = (r2 - 2r1) / (√Sym(3) - r2)
cosθ = sqrt(1 - sinθ^2);

sqrt3 = sqrt(Sym(3))
eq1 = (sqrt3 + r1)sinθ - r1 |> expand
eq2 = (sqrt3 - r3)sinθ - r3 |> expand
eq3 = (sqrt3 + 2r1 + r4)sinθ - r4 |> expand
eq4 = (sqrt3 + 2r1 + 2r4 + r5)sinθ - r5 |> expand;

(r1, r3, r4, r5) = solve([eq1, eq2, eq3, eq4], (r1, r3, r4, r5))[1]

   (-7*sqrt(3)/12 + sqrt(219)/12, -sqrt(219)/24 + 11*sqrt(3)/24, -sqrt(219)/9 + 10*sqrt(3)/9, -83*sqrt(3)/54 + 11*sqrt(219)/54)

   r1 = 0.22286;  r2 = 0.57735;  r3 = 0.17725;  r4 = 0.28021; r5 = 0.35231
   x1 = 0.35218;  y1 = 0.61776

亨円と貞円の半径(直径)の比を求める。

(r5 / r1) |> simplify |> println

   37/18 - sqrt(73)/18

術では「74 から 292 の平方根を引き,貞円の径を掛け,36 で割れば亨円の径を得る」と言っている。分子分母を2倍しているだけで,同じである。

(74 - sqrt(Sym(292)))/36 |> simplify |> println

   37/18 - sqrt(73)/18

新しい術「37 から 73 の平方根を引き,貞円の径を掛け,18 で割れば亨円の径を得る

(r5 / r1) * 0.22286 |> N

   0.352316851406585282011764975423176304679348938046109770889125810268254317780704

ついでに,利円,元円,内接円の半径(直径)と貞円の半径(直径)の関係を求めておく。

r4 / r1 |> simplify |> println  # 利円

   -1/6 + sqrt(73)/6

r3 / r1 |> simplify |> println  # 元円

   1/12 + sqrt(73)/12

r2 / r1 |> simplify |> println  # 内接円

   7/6 + sqrt(73)/6

using Plots
using Printf
function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   sqrt3 = sqrt(3)
   r2 = 1/sqrt3
   (x1, r1, r3, r4, r5) = (5/24 + sqrt(2)*sqrt(61 - 7*sqrt(73))/6 + sqrt(73)/24, -7*sqrt(3)/12 + sqrt(219)/12, -sqrt(219)/24 + 11*sqrt(3)/24, -sqrt(219)/9 + 10*sqrt(3)/9, -83*sqrt(3)/54 + 11*sqrt(219)/54)
   sinθ = (r2 - 2r1) / (sqrt3 - r2)
   cosθ = sqrt(1 - sinθ^2)
   tanθ = sinθ / cosθ
   x1 = (r2 - r1)cosθ
   y1 = (r2 - r1)sinθ + r2
   @printf("r1 = %.5f;  r2 = %.5f;  r3 = %.5f;  r4 = %.5f; r5 = %.5f\n", r1, r2, r3, r4, r5)
   @printf("x1 = %.5f;  y1 = %.5f\n", x1, y1)
   plot([1, 0, -1, 1], [0, sqrt3, 0, 0], color=:black, lw=0.5)
   circle(0, r2, r2)
   circle(0, r3, r3, :green)
   circle(0, -r1, r1, :blue)
   circle(x1, y1, r1, :blue)
   circle(-x1, y1, r1, :blue)
   circle(0, -2r1-r4, r4, :brown)
   circle(0, -2r1-2r4-r5, r5, :gold)
   segment(0, sqrt3, 3.5tanθ, sqrt3 - 3.5)
   segment(0, sqrt3, -3.5tanθ, sqrt3 - 3.5)
   if more == true
       point(0, 1/sqrt3, "1/√3 ", :red, :right)
       point(x1, y1, "(x1,y1)")
       point(x1, y1, " 貞円", :blue, :left, :bottom, mark=false)
       point(1, 0, " 1")
       point(0, sqrt3, " √3")
       point(0, r3, " r3")
       point(0, r3, " 元円", :green, :left, :bottom, mark=false)
       point(0, -r1, " -r1")
       point(0, -r1, " 貞円", :blue, :left, :bottom, mark=false)
       point(0, -2r1-r4, " -2r1-r4", :brown)
       point(0, -2r1-r4, " 利円", :brown, :left, :bottom, mark=false)
       point(0, -2r1-2r4-r5, " -2r1-2r4-r5", :gold)
       point(0, -2r1-2r4-r5, " 円", :gold, :left, :bottom, mark=false)
       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アクセスランキング にほんブログ村