裏 RjpWiki

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

算額(その1425)

2024年11月27日 | Julia

算額(その1425)

八十九 陸前高田市小友町 常膳寺観音堂 天保13年(1842)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円6個,外円,弦3本
#Julia, #SymPy, #算額, #和算

全円の中に 3 本の弦を引き,区画された領域に甲円 3 個,乙円 2 個を容れる。乙円の直径が 1 寸のとき,甲円の直径はいかほどか。

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

注1:左右にある乙円と甲円の x 座標値は同じになる。x2 = x1
注2:eq1, eq2 は甲円,乙円が全円に内接するという条件を記述したものである。
注3:コメントアウトした eq3, eq4は斜線と甲円,乙円の中心の距離を記述したものであるが,連立方程式を解くことができないほど複雑になる。図に灰色で示した 2 つの円は甲円と乙円と合同なものである。この位置にある甲円,乙円についての式が有効な eq3, eq4 である。これを使えば,連立方程式は容易に解くことができる

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms R::positive, r1::positive, r2::positive, x1::positive, x2, x0::positive
x2 = x1
eq1 = x1^2 + (R - 3r1)^2 - (R - r1)^2
eq2 = x2^2 + (R - 2r1 + r2)^2 - (R - r2)^2
# eq3 = dist2(0, -R, x0, sqrt(R^2 - x0^2), x1, R - 3r1, r1)
# eq4 = dist2(0, -R, x0, sqrt(R^2 - x0^2), x2, R - 2r1 + r2, r2)
eq3 = 2R*r1 - sqrt(x0^2 + (R - sqrt(R^2 - x0^2))^2)*(2R - r1)
eq4 = r2*(2R - r1) - r1*R
res = solve([eq1, eq2, eq3, eq4], (R, r1, x1, x0))[1];

# R
res[1] |> println

    r2*(2 + sqrt(5))

# r1
res[2] |> println

    r2*(1 + sqrt(5))/2

# x1
res[3] |> println

    r2*sqrt(2 + 2*sqrt(5))

# x0
res[4] |> sympy.sqrtdenest |> println

    2*r2*sqrt(-8 + 4*sqrt(5))

甲円の半径 r1 は,乙円の半径 r2 の (1 + √5)/2 倍である。
乙円の直径が 1 寸のとき,甲円の直径は (1 + √5)/2 = 1.618033988749895 寸である。

全てのパラメータは以下のとおりである

   r2 = 0.5;  R = 2.11803;  r1 = 0.809017;  x1 = 1.27202;  x0 = 0.971737;  y0 = 1.88197;  y = 0.5

function draw(r2, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    R = r2*(√5 + 2)
    r1 = r2*(√5 + 1)/2
    x1 = r2*sqrt(2√5 + 2)
    x0 = 2r2*sqrt(4√5 - 8)
    x2 = x1
    y0 = sqrt(R^2 - x0^2)
    y = R - 2r1
    @printf("乙円の直径が %g のとき,甲円の直径は %g である。\n", 2r2, 2r1)
    @printf("r2 = %g;  R = %g;  r1 = %g;  x1 = %g;  x0 = %g;  y0 = %g;  y = %g\n", r2, R, r1, x1, x0, y0, y)

    plot([x0, 0, -x0], [y0, -R, y0], color=:green, lw=0.5)
    circle(0, 0, R)
    circle(0, R - r1, r1)
    circle2(x1, y - r1, r1)
    circle2(x2, y + r2, r2, :blue)
    circle(0, y - r2, r2, :gray80)
    circle(0, r1 - R, r1, :gray80)
    segment(sqrt(R^2 - y^2), y, -sqrt(R^2 - y^2), y, :magenta)
    if more
        delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
        vline!([0], color=:gray80, lw=0.5)
        hline!([0], color=:gray80, lw=0.5)
        point(0, R, "R", :magenta, :center, :bottom, delta=delta/2)
        point(x1, y + r2, "乙円:r2\n(x2,y+r2)", :blue, :center, delta=-delta/2)
        point(0, R - r1, "甲円:r1,(0,R-r1)", :red, :center, delta=-delta/2)
        point(x1, y - r1, "甲円:r1,(x1,y-r1)", :red, :center, delta=-delta/2)
        point(x0, sqrt(R^2 - x0^2), "(x0,sqrt(R^2-x0^2) ", :green, :left, :bottom, delta=delta/2)
        point(0, y, " y", :magenta, :left, :bottom, delta=delta/2)
    end
end;

draw(1/2, true)

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

さぬきのセルフうどん 愉楽家(ゆらくや) 林店

2024年11月27日 | さぬきうどん

高松市林町 さぬきのセルフうどん 愉楽家(ゆらくや) 林店
ツルツル、やわらか、こしがある
評判通り,麺の量は多め。とり天もでかい

お店の横に,お土産用さぬきうどんの自販機がある。バーコード決済もできる。

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

算額(その1424)

2024年11月27日 | Julia

算額(その1424)

八十九 陸前高田市小友町 常膳寺観音堂 天保13年(1842)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円12個,外円,1/3円3個
#Julia, #SymPy, #算額, #和算

全円の中に正三角形と弦を容れ,区画された領域に 4 個の等円を容れる。等円の等円の直径が 1 寸のとき,全円の直径はいかほどか。

全円の半径と中心座標を R, (0, 0)
等円の半径と中心座標を r, (x1, y1), (x2, y2)
弦と y 軸の交点座標を (0, y)
y1 = y + r,  y2 = y - r
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms R::positive, r::positive, y::positive, x1::positive, y1::positive, x2::positive, y2::positive
y1 = y + r
y2 = y - r
x0 = R*cosd(Sym(30))
y0 = -R*sind(Sym(30))
eq1 = x1^2 + y1^2 - (R - r)^2 |> expand
eq2 = x2^2 + y2^2 - (R - r)^2 |> expand
eq3 = dist2(0, R, x0, y0, x1, y1, r)
# eq4 = dist2(0, R, x0, y0, x2, y2, r)  # これは eq3 と従属
eq4 = (y1 - y2) - √Sym(3)*(x2 - x1);  # これにすべき

res = solve([eq1, eq2, eq3, eq4], (R, y, x1, x2))[1];

# R
res[1] |> println

    2*r*(3 + sqrt(13))/3

# y
res[2] |> println

    r*(sqrt(13) + 6)/6

# x1
res[3] |> println

    r*(sqrt(39) + 4*sqrt(3))/6

# x2
res[4] |> factor |> println

    r*(sqrt(39) + 8*sqrt(3))/6

全円の半径 R は,等円の半径の 2(3+√13)/3 倍である。
等円の直径が 1 寸のとき,全円の直径は 2(3+√13)/3 = 4.403700850309327 寸である。

全てのパラメータは以下のとおりである。

   R = 2.20185042515466;  y = 0.800462606288666;  x1 = 1.09776676905616;  x2 = 1.67511703824578

function draw(r, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    R = 2*r*(3 + √13)/3
    y = r*(√13 + 6)/6
    x1 = r*(√39 + 4√3)/6
    x2 = r*(√39 + 8√3)/6
    x = sqrt(R^2 - y^2)
    y1 = y + r
    y2 = y - r
    x0 = R*cosd(30)
    y0 = -R*sind(30)
    @printf("R = %.15g;  y = %.15g;  x1 = %.15g;  x2 = %.15g\n", R, y, x1, x2)
    plot([-x0, 0, x0, -x0], [y0, R, y0, y0], color=:green, lw=0.5)
    circle(0, 0, R)
    circle2(x1, y1, r, :blue)
    circle2(x2, y2, r, :blue)
    segment(-x, y, x, y, :magenta)
    if more
        delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
        vline!([0], color=:gray80, lw=0.5)
        hline!([0], color=:gray80, lw=0.5)
        point(0, R, "R", :magenta, :center, :bottom, delta=delta/2)
        point(x1, y1, "等円:r,(x1,y1)", :blue, :center, delta=-delta/2)
        point(x2, y2, "等円:r,(x2,y2)", :blue, :center, delta=-delta/2)
        point(x0, y0, "(x0,y0) ", :green, :right, :bottom, delta=delta/2)
        point(0, y, " y", :magenta, :left, :bottom, delta=delta/2)
    end
end;

draw(1/2, true)

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

算額(その1423)

2024年11月26日 | Julia

算額(その1423)

九十七 大船渡市猪川町 雨宝堂 現雨宝山竜宝院 文政7年(1824)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:円12個,外円,1/3円3個
#Julia, #SymPy, #算額, #和算

全円の中に全円と同じ直径の 1/3 円が 6 個と,甲円および乙円を 6 個ずつ容れる。乙円の直径が 1 寸のとき,全円の直径はいかほどか。

全円の半径と中心座標を R, (0, 0)
条件式に使う 1/3 円の中心座標を (0, R)
甲円の半径と中心座標を r1, (R - r1, 0)
乙円の半径と中心座標を r2, (R - 2r1 - r2, 0)
として以下の連立方程式の解を求める。

include("julia-source.txt");

using SymPy
@syms R, r1, r2
eq1 = ( R - r1)^2 + R^2 - (R + r1)^2
eq2 = (R - 2r1 - r2)^2 + R^2 - (R + r2)^2
res = solve([eq1, eq2], (R, r1))[3]

    (12*r2, 3*r2)

全円の半径 R は,乙円の半径 r2 の 12 倍である。
乙円の直径が 1 寸のとき,全円の直径は 12 寸である。

function draw(r2, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    (R, r1) = (12*r2, 3*r2)
    plot()
    circle(0, 0, R, :magenta)
    for i = 90:60:390
        circle(R*cosd(i), R*sind(i), R, :blue, beginangle=i + 120, endangle=i + 240)
    end
    rotate(R - r1, 0, r1, angle=60)
    rotate(R - 2r1 - r2, 0, r2, :green, angle=60)
    if more
        delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
        vline!([0], color=:gray80, lw=0.5)
        hline!([0], color=:gray80, lw=0.5)
        point(R - r1, 0, "甲円:r1\n(R-r1,0)", :red, :center, delta=-delta)
        point(R - 2r1 - r2, 0, "乙円:r2\n(R-2r1-r2,0)", :green, :left, delta=-6delta/2, deltax=-9delta)
        point(0, R, "R", :magenta, :center, :bottom, delta=delta/2)
    end
end;

draw(1/2, true)

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

算額(その1422)

2024年11月26日 | Julia

算額(その1422)

百一 大船渡市猪川町 田茂山神社 奉納年不明 現存せず
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html
キーワード:円16個,外円
#Julia, #SymPy, #算額, #和算

全円の中に中円 1 個,甲円,乙円,丙円を 5 個ずつ入れる。中円の直径が 1 寸のとき,全円の直径はいかほどか。

全円の半径と中心座標を R, (0, 0)
中円の半径と中心座標を r4, (0, 0)
甲円の半径と中心座標を r1, (0, R - r1)
乙円の半径と中心座標を r2, (x2, y2)
丙円の半径と中心座標を r3, (x3, y3)
ただし,
x2 = (R - r2)*cosd(54)
y2 = (R - r2)*sind(54)
x3 = (R - 2r2 - r3)*cosd(54)
y3 = (R - 2r2 - r3)*sind(54)
として以下の連立方程式の解を求める。

include("julia-source.txt");

using SymPy
@syms R, r1, r2, x2, y2, r3, x3, y3, r4
x2 = (R - r2)*cosd(Sym(54))
y2 = (R - r2)*sind(Sym(54))
x3 = (R - 2r2 - r3)*cosd(Sym(54))
y3 = (R - 2r2 - r3)*sind(Sym(54))
eq1 = 2r1 + r4 - R
eq2 = r4 + 2r2 + 2r3 - R
eq3 = x2^2 + (R - r1 - y2)^2 - (r1 + r2)^2
eq4 = x3^2 + (R - r1 - y3)^2 - (r1 + r3)^2;

res = solve([eq1, eq2, eq3, eq4], (R, r1, r2, r3))[3]  # 3 of 3

    (-56*sqrt(5)*r4*sqrt(34 - 10*sqrt(5))/5 - 24*sqrt(5)*r4*sqrt(170 - 50*sqrt(5))/5 - 16*sqrt(5)*r4/5 + 43*r4/5 + 54*r4*sqrt(170 - 50*sqrt(5))/5 + 126*r4*sqrt(34 - 10*sqrt(5))/5, -28*sqrt(5)*r4*sqrt(34 - 10*sqrt(5))/5 - 12*sqrt(5)*r4*sqrt(170 - 50*sqrt(5))/5 - 8*sqrt(5)*r4/5 + 19*r4/5 + 27*r4*sqrt(170 - 50*sqrt(5))/5 + 63*r4*sqrt(34 - 10*sqrt(5))/5, -31*sqrt(5)*r4*sqrt(34 - 10*sqrt(5))/10 - 13*sqrt(5)*r4*sqrt(170 - 50*sqrt(5))/10 - 7*sqrt(5)*r4/5 + 33*r4/10 + 117*r4*sqrt(170 - 50*sqrt(5))/40 + 279*r4*sqrt(34 - 10*sqrt(5))/40, (-sqrt(5)*r4 + 3*r4 + sqrt(2)*r4*sqrt(17 - 5*sqrt(5)))/(2*sqrt(5) + 10))

# R
res[1] |> factor |> println

    -r4*(-43 - 6*sqrt(2)*sqrt(17 - 5*sqrt(5)) + 2*sqrt(10)*sqrt(17 - 5*sqrt(5)) + 16*sqrt(5))/5

全円の半径 R は,中円の半径 r4 の (43 + 6√2sqrt(17 - 5√5) - 2√10*sqrt(17 - 5√5) - 16√5)/5 = 2.487088356114319 倍である。
中円の直径が 1 寸のとき,全円の直径は 2.487088356114319 寸である。

# r1
res[2] |> factor |> println

    -r4*(-19 - 3*sqrt(2)*sqrt(17 - 5*sqrt(5)) + sqrt(10)*sqrt(17 - 5*sqrt(5)) + 8*sqrt(5))/5

# r2
res[3] |> factor |> println

    -r4*(-132 - 19*sqrt(2)*sqrt(17 - 5*sqrt(5)) + 7*sqrt(10)*sqrt(17 - 5*sqrt(5)) + 56*sqrt(5))/40

# r3
@syms d
res[4]/r4 |> factor |> x -> apart(x, d)*r4 |> factor |> println

    -r4*(-20 - 5*sqrt(2)*sqrt(17 - 5*sqrt(5)) + sqrt(10)*sqrt(17 - 5*sqrt(5)) + 8*sqrt(5))/40

R, r1, r2, r3 は,共通部分式 sqrt(17 - 5√5) の括りだしと,r3 については分母の有理化などで,以下のように規則性のある簡潔な計算式になる。

r4 = 1/2
s = sqrt(17 - 5√5)
t = √2s
u = √10s
R  = r4*( 43 +  6t - 2u - 16√5)/5
r1 = r4*( 19 +  3t -  u -  8√5)/5
r2 = r4*(132 + 19t - 7u - 56√5)/40
r3 = r4*( 20 +  5t -  u -  8√5)/40
(R, r1, r2, r3)

    (1.2435441780571594, 0.3717720890285797, 0.22750945795996708, 0.14426263106861265)

function draw(r4, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    (R, r1, r2, r3) = (-56*sqrt(5)*r4*sqrt(34 - 10*sqrt(5))/5 - 24*sqrt(5)*r4*sqrt(170 - 50*sqrt(5))/5 - 16*sqrt(5)*r4/5 + 43*r4/5 + 54*r4*sqrt(170 - 50*sqrt(5))/5 + 126*r4*sqrt(34 - 10*sqrt(5))/5, -28*sqrt(5)*r4*sqrt(34 - 10*sqrt(5))/5 - 12*sqrt(5)*r4*sqrt(170 - 50*sqrt(5))/5 - 8*sqrt(5)*r4/5 + 19*r4/5 + 27*r4*sqrt(170 - 50*sqrt(5))/5 + 63*r4*sqrt(34 - 10*sqrt(5))/5, -31*sqrt(5)*r4*sqrt(34 - 10*sqrt(5))/10 - 13*sqrt(5)*r4*sqrt(170 - 50*sqrt(5))/10 - 7*sqrt(5)*r4/5 + 33*r4/10 + 117*r4*sqrt(170 - 50*sqrt(5))/40 + 279*r4*sqrt(34 - 10*sqrt(5))/40, (-sqrt(5)*r4 + 3*r4 + sqrt(2)*r4*sqrt(17 - 5*sqrt(5)))/(2*sqrt(5) + 10))
    s = sqrt(17 - 5√5)
    t = √2s
    u = √10s
    R  = r4*( 43 +  6t - 2u - 16√5)/5
    r1 = r4*( 19 +  3t -  u -  8√5)/5
    r2 = r4*(132 + 19t - 7u - 56√5)/40
    r3 = r4*( 20 +  5t -  u -  8√5)/40
    x2 = (R - r2)*cosd(54)
    y2 = (R - r2)*sind(54)
    x3 = (R - 2r2 - r3)*cosd(54)
    y3 = (R - 2r2 - r3)*sind(54)
    @printf("外円の直径 = %g\n", 2R)
    @printf("r4 = %g;  R = %g;  r1 = %g;  r2 = %g;  r3 = %g;  x2 = %g;  y2 = %g;  x3 = %g;  y3 = %g\n", r4, R, r1, r2, r3, x2, y2, x3, y3)
    plot()
    circle(0, 0, R, :magenta)
    rotate(0, R - r1, r1, angle=72)
    rotate(x2, y2, r2, :green, angle=72)
    rotate(x3, y3, r3, :blue, angle=72)
    circle(0, 0, r4, :orange)
    if more
        delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
        vline!([0], color=:gray80, lw=0.5)
        hline!([0], color=:gray80, lw=0.5)
        point(0, R - r1, "甲円:r1,(0,R-r1)", :red, :center, delta=-delta/2)
        point(x2, y2, "乙円:r2\n(x2,y2)", :green, :center, delta=-delta/2)
        point(x3, y3, "丙円:r3,(x3,y3)", :green, :left, delta=-delta/2, deltax=-2delta)
        point(0, 0, "中円:r4,(0,0)", :orange, :center, delta=-delta/2)
        point(0, R, "R", :magenta, :center, :bottom, delta=delta/2)
    end
end;

draw(1/2, true)

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

算額(その1421)

2024年11月25日 | Julia

算額(その1421)

算額(その436)では数値解を求めたが,解析解を求めた記事である。

橘田彌曾八元克 天明八年戊申2月
藤田貞資(1789):神壁算法
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf
キーワード:円7個,外円,弦
#Julia, #SymPy, #算額, #和算

外円の中に,甲円 3 個,乙円 2 個,丙円 1 個が入っている。甲円は弦に接している。
外円の直径が 3 寸 6 分 のとき,甲円の直径を求めよ。

外円の半径と中心座標を r0, (0, 0)
甲円の半径と中心座標を r1, (2r1, a + r1)
乙円の半径と中心座標を r2, (r1, y2)
丙円の半径と中心座標を r3, (0, r0 - r3)
として以下の連立方程式の解を求める。

include("julia-source.txt");

using SymPy
@syms r0::positive, a::positive, r1::negative,
      r3::positive, r2::positive, y2::positive;
@syms r0, a, r1, r3, r2, y2
a = r0 - 2r1 - 2r3
eq1 = (2r1)^2 + (a + r1)^2 - (r0 - r1)^2 |> expand
eq2 = r1^2 + (y2 - a - r1)^2 - (r1 + r2)^2 |> expand
eq3 = r1^2 + y2^2 - (r0 - r2)^2 |> expand
eq4 = r1^2 + (r0 - r3 - y2)^2  - (r3 + r2)^2 |> expand;

一度に解けないので,まず eq1, eq2, eq3 から r2, y2, r3 を求める(求める変数の指定順序により,得られる式の複雑さが異なることがある)。
4 組の解が得られるが,最初のものが適解である。

res = solve([eq1, eq2, eq3], (r2, y2, r3))[1];

# r2
res[1] |> println

    (r0^2 - r1^2 - sqrt(r0*(r0 + r1))*sqrt(r0^2 - 2*r0*r1 - 3*r1^2))/(2*(r0 + r1))

# y2
res[2] |> println

    sqrt(r0*(r0 + r1))/2 + sqrt(r0^2 - 2*r0*r1 - 3*r1^2)/2

# r3
res[3] |> println

    r0/2 - r1/2 - sqrt((r0 - 3*r1)*(r0 + r1))/2

得られた解を eq4 に代入した式を eq14 とする。eq14 は既知の r0,未知の r1 のみを含む式になる。

eq14 = eq4(r2 => res[1], y2 => res[2], r3 => res[3]) |> simplify |> numerator
eq14 |> println

    -r0^3 + 3*r0^2*r1 - r0^2*sqrt(r0*(r0 + r1)) + r0^2*sqrt(r0^2 - 2*r0*r1 - 3*r1^2) + 5*r0*r1^2 + r0*sqrt(r0*(r0 + r1))*sqrt(r0^2 - 2*r0*r1 - 3*r1^2) + r1^3 + r1^2*sqrt(r0*(r0 + r1)) - r1^2*sqrt(r0^2 - 2*r0*r1 - 3*r1^2) - r1*sqrt(r0*(r0 + r1))*sqrt(r0^2 - 2*r0*r1 - 3*r1^2)

eq14 を解いて r1 を得る。

res2 = solve(eq14, r1);

5 個の解が得られるが,最後のものが適解である。

# r1
res2[5] |> println

    r0*(-(8 + 24*sqrt(57))^(1/3)/3 + 1/3 + 32/(3*(8 + 24*sqrt(57))^(1/3)))

res2[5](r0 => 3.6/2).evalf() |> println

    0.500028910096869

甲円の半径 r0 は,外円の半径 r0 の (1/3 - (8 + 24√57)^(1/3)/3 + 32/(3*(8 + 24√57)^(1/3))) 倍である。
外円の直径が 3.6 寸のとき,甲円の直径は 1.000057820193738 寸である。

他のパラメータは以下のようにして芋づる式に計算できる。
下のプログラムの draw 関数内では,一時変数を使ってより短い計算式にしている。
計算順序により有効数字14,5桁以降に若干の誤差が含まれる。

r0 = 3.6/2
r1 = r0*(1/3 - (8 + 24√57)^(1/3)/3 + 32/(3*(8 + 24√57)^(1/3)))
r2 = (r0^2 - r1^2 - sqrt(r0*(r0 + r1))*sqrt(r0^2 - 2*r0*r1 - 3*r1^2))/(2*(r0 + r1))
y2 = sqrt(r0*(r0 + r1))/2 + sqrt(r0^2 - 2*r0*r1 - 3*r1^2)/2
r3 = r0/2 - r1/2 - sqrt((r0 - 3*r1)*(r0 + r1))/2
a = r0 - 2r1 - 2r3
(r0, r1, r2, y2, r3, a)

    (1.8, 0.5000289100968703, 0.2826151986125809, 1.4326296536610128, 0.23471178258110315, 0.3305186146440531)

using Plots

function draw(r0, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    s = (1 + 3sqrt(57))^(1/3)
    r1 = -r0*(2s^2 - s - 16)/3s
    t = sqrt(r0*(r0 + r1))
    u = sqrt(r0^2 - 2r0*r1 - 3r1^2)
    r2 = (r0^2 - r1^2 - t*u)/(2r0 + 2r1)
    y2 = (t + u)/2
    r3 = (r0 - r1 - u)/2
    a = r0 - 2r1 - 2r3
    @printf("a = %g;  r1 = %g;  r3 = %g;  r2 = %g;  y2 = %g\n", a, r1, r3, r2, y2)
    @printf("外円の直径 = %g;  甲円の直径 = %g\n", 2r0, 2r1)
    plot()
    circle(0, 0, r0, :brown)
    circle(0, a + r1, r1)
    circle(2r1, a + r1, r1)
    circle(-2r1, a + r1, r1)
    circle(0, r0 - r3, r3, :blue)
    circle(r1, y2, r2, :green)
    circle(-r1, y2, r2, :green)
    b = sqrt(r0^2 - a^2)
    segment(-b, a, b, a, :magenta)
    if more
        delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
        vline!([0], color=:gray80, lw=0.5)
        hline!([0], color=:gray80, lw=0.5)
        point(0, a + r1, " 甲円:r1\n(0,a+r1)", :red, :center, delta=-delta)
        point(2r1, a + r1, " 甲円:r1\n(2r1,a+r1)", :red, :center, delta=-delta)
        point(0, r0 - r3, " 丙円:r3,(0,r0-r3)", :black, :center, :bottom, delta=delta)
        point(r1, y2, " 乙円:r2,(r1,y2)", :black, :left, :vcenter)
        point(0, a, " a", :magenta, :left, :top, delta=-delta/2)
        point(0, r0, " r0", :brown, :left, :bottom, delta=delta/2)
    else
        plot!(showaxis=false)
    end
end;

draw(3.6/2, true)

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

庭の紅葉が見頃です

2024年11月24日 | 雑感

折れた楓

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

算額(その1420)

2024年11月24日 | Julia

算額(その1420)

福島県二本松市亀谷 坂上観音堂 寛政5年(1793)令和3年復元奉納
http://www.wasan.jp/fukusima/sakauekanondo.html
キーワード:円5個,円弧
#Julia, #SymPy, #算額, #和算

円弧(弓形)の中に 5 個の円を入れる。そのうちの甲円,乙円,丙円の直径が 16 寸,25 寸,9 寸のとき,外円の直径はいかほどか。

甲円,乙円,丙円が右から順に一つおきになっているが,残りの円も右から丁円,丙円と名付ける。

外円(円弧,弓形を構成する円)の半径と中心座標を R, (0, 0)
円弧を構成する水平な弦と y 軸の交点座標を (0, y)
甲円の半径と中心座標を r1, (x1, y + r1)
乙円の半径と中心座標を r2, (x2, y + r2)
丙円の半径と中心座標を r3, (x3, y + r3)
丁円の半径と中心座標を r4, (x4, y + r4)
戊円の半径と中心座標を r5, (x5, y + r5)
とおき,以下の連立方程式を解く。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms R, y, r1, x1, r2, x2, r3, x3, r4, x4, r5, x5
eq1 = x1^2 + (y + r1)^2 - (R - r1)^2
eq2 = x2^2 + (y + r2)^2 - (R - r2)^2
eq3 = x3^2 + (y + r3)^2 - (R - r3)^2
eq4 = x4^2 + (y + r4)^2 - (R - r4)^2
eq5 = x5^2 + (y + r5)^2 - (R - r5)^2
eq6 = (x1 - x4)^2 +(r1 - r4)^2 - (r1 + r4)^2
eq7 = (x4 - x2)^2 +(r4 - r2)^2 - (r4 + r2)^2
eq8 = (x2 - x5)^2 +(r2 - r5)^2 - (r2 + r5)^2
eq9 = (x5 - x3)^2 +(r5 - r3)^2 - (r5 + r3)^2;
# solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9], (R, y, x1, x2, x3, r4, x4, r5, x5))

using NLsolve

function nls(func, params...; ini = [0.0])
    if typeof(ini) <: Number
        r = nlsolve((vout, vin) -> vout[1] = func(vin[1], params..., [ini]), ftol=big"1e-40")
        v = r.zero[1]
    else
        r = nlsolve((vout, vin)->vout .= func(vin, params...), ini, ftol=big"1e-40")
        v = r.zero
    end
    return Float64.(v), r.f_converged
end;

function H(u)
    (R, y, x1, x2, x3, r4, x4, r5, x5) = u
    return [
        x1^2 - (R - r1)^2 + (r1 + y)^2,  # eq1
        x2^2 - (R - r2)^2 + (r2 + y)^2,  # eq2
        x3^2 - (R - r3)^2 + (r3 + y)^2,  # eq3
        x4^2 - (R - r4)^2 + (r4 + y)^2,  # eq4
        x5^2 - (R - r5)^2 + (r5 + y)^2,  # eq5
        (r1 - r4)^2 - (r1 + r4)^2 + (x1 - x4)^2,  # eq6
        (-r2 + r4)^2 - (r2 + r4)^2 + (-x2 + x4)^2,  # eq7
        (r2 - r5)^2 - (r2 + r5)^2 + (x2 - x5)^2,  # eq8
        (-r3 + r5)^2 - (r3 + r5)^2 + (-x3 + x5)^2,  # eq9
    ]
end;
(r1, r2, r3) = (16, 25, 9) ./ 2
iniv = BigFloat[70, 45, 33, -12, -43, 12, 13, 8, -31]
res = nls(H, ini=iniv)

    ([69.73157051282051, 43.72996794871795, 33.686751312703706, -10.660364339463198, -43.92070107858837, 12.139917695473251, 13.976922133962859, 8.642578125, -31.448074801416432], true)

# 直径の分数表示
rationalize(2*69.73157051282051)

    87025//624

# 帯分数で表示するための計算 商と余りの計算
divrem(87025,624)

    (139, 289)

外円の直径は 2*69.73157051282051 = 139.46314102564102 であり,分数で表すと 87025//624 である。
帯分数表示というのは小学校以来使うことはないが,139 + 289/624 であり,「答」の「外円径一百三十九寸六百二十四分之二百八十九寸とピタリ一致する(長精度演算のおかげ)。

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    (r1, r2, r3) = (16, 25, 9) ./ 2
    (R, y, x1, x2, x3, r4, x4, r5, x5) = [70, 45, 33, -12, -43, 12, 13, 8, -31]
    (R, y, x1, x2, x3, r4, x4, r5, x5) = [69.73157051282051, 43.72996794871795, 33.686751312703706, -10.660364339463198, -43.92070107858837, 12.139917695473251, 13.976922133962859, 8.642578125, -31.448074801416432]
    x =sqrt( R^2 - y^2)
    θ = atand(y, x)
    plot()
    circle(0, 0, R, beginangle=θ, endangle=180 - θ, n=500)
    circle(x1, y + r1, r1, :blue)
    circle(x2, y + r2, r2, :magenta)
    circle(x3, y + r3, r3, :green)
    circle(x4, y + r4, r4, :orange)
    circle(x5, y + r5, r5, :tomato)
    plot!([-x, 0, x, -x], [y, 0, y, y], color=:gray70, 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(x1, y + r1, "甲円:r1,(x1,y+r1)", :blue, :center, delta=-8.5delta)
        point(x2, y + r2, "乙円:r2\n(x2,y+r2)", :magenta, :center, delta=-delta)
        point(x3, y + r3, "丙円:r3,(x3,y+r3)", :green, :left, delta=-5delta, deltax=-5delta)
        point(x4, y + r4, "丁円:r4\n(x4,y+r4)", :orange, :center, delta=-delta)
        point(x5, y + r5, "戊円:r5\n(x5,y+r5)", :tomato, :center, :bottom, delta=delta)
        point(0, y, " y", :black, :left, delta=-delta)
        point(0, R, "R", :red, :center, :bottom, delta=delta)
    end
end;

draw(true)

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

セルフ こだわり麺や 綾南店

2024年11月24日 | さぬきうどん

綾川町小野 セルフ こだわり麺や 綾南店
県内に十数店舗ある
いつもの冷かけととり天

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

算額(その1419)

2024年11月24日 | Julia

算額(その1419)

本庄市都島 正観寺 享保11年(1126)
https://www.honjo-kanko.jp/sightseeing/shokanji.html

https://tamalotus2.exblog.jp/24658561/

https://yamabukiwasan.sakura.ne.jp/page3.html#shoukan
山口正義:やまぶき 第26号
https://yamabukiwasan.sakura.ne.jp/ymbk26.pdf
山口正義:やまぶき 第40号
https://yamabukiwasan.sakura.ne.jp/ymbk40.pdf

参考古三面
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html

キーワード:立方体,体積,等差数列
#Julia, #SymPy, #算額, #和算

「現在(当時)現存第三古」ということであったが,2024年11月現在では「埼玉県内最古,全国で5番目に古い古額」だそうである。「埼玉の算額」にも出ていない。

甲,乙,丙,丁,戊 の立方体がある。甲,乙の立方体の体積の和は 189,丙,丁,戊の立方体の体積の和は 36 である。各立方体の一辺の長さは等差数列である。それぞれの一辺の長さはいかほどか。

すでに「算額(その388)」で解いたが,補足的な内容も含め新たに記事を立てる。

https://blog.goo.ne.jp/r-de-r/e/0ab004aeda635279911a670ca5ef16ef

各立方体の一辺の長さを,甲, 乙, 丙, 丁 とする。
甲,乙の立方体の体積の和を K1,丙,丁,戊の立方体の体積の和を K2,公差 を d とおき,以下の連立方程式を解く。

K1, K2 を変数のまま解くのは SymPy では無理のようである。

K1, K2 に実際の値を与えれば,簡単に解が求まる。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms 甲::positive, 乙::positive, 丙::positive, 丁::positive, 戊::positive, K1::positive, K2::positive, d::positive
(K1, K2) = (189, 36)
丁 = 戊 + d
丙 = 戊 + 2d
乙 = 戊 + 3d
甲 = 戊 + 4d
eq1 = 甲^3 + 乙^3 - K1 
eq2 = 丙^3 + 丁^3 + 戊^3 - K2;

solve([eq1, eq2], (戊, d))[1]  # 1 of 3

    (1, 1)

戊 = 1,公差 = 1 なので,甲 = 5, 乙 = 4, 丙 = 3, 丁 = 2 である。

---

これではあまりにもあっけないので,SymPy が実際はどのようにして解を求めているのはわからないが,手作業で(SymPy の助けを借りながら)解いてみよう。

まず,eq1, eq2 がどのように表されているのかを見てみる。

eq1 |> expand |> println
eq2 |> expand |> println

    91*d^3 + 75*d^2*戊 + 21*d*戊^2 + 2*戊^3 - 189
    9*d^3 + 15*d^2*戊 + 9*d*戊^2 + 3*戊^3 - 36

d, 戊はともに 3 次式で,これが方程式を解くのを困難にしている一因であろう。そこで,定数倍した式を引き算することで,2 次式に字数を落とす。

eq3 = 9eq1 - 91eq2 として,これを解き d を求める。

eq3 = 9eq1 - 91eq2 |> expand |> factor
eq3 |> println

    -15*(46*d^2*戊 + 42*d*戊^2 + 17*戊^3 - 105)

2 つの解が得られるが,2 つ目のものが適解である。

ans_d = solve(eq3, d)[2]  # 2 of 2
ans_d |> println

    -21*戊/46 + sqrt(4830 - 341*戊^3)/(46*sqrt(戊))

eq1 に d を代入し,eq4 とする。

eq4 = eq1(d => ans_d) |> simplify |> numerator
eq4 |> println

    359359*戊^(9/2) - 14711697*戊^(3/2) - 5551*戊^3*sqrt(4830 - 341*戊^3) + 219765*sqrt(4830 - 341*戊^3)

これを解き 戊 を求める。

res = solve(eq4, 戊)[1]
res |> println

    1

戊は 1 である。
遡って,ans_d の戊に 1 を代入して d = 1 を得る。

ans_d(戊 => 1) |> println

    1

よって,甲,乙,丙,丁,戊は 5, 4, 3, 2, 1 である。

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

算額(その1418)

2024年11月23日 | Julia

算額(その1418)

百五十三 多野郡新町 諏訪神社 年代不明
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:球,体積,定積分
#Julia, #SymPy, #算額, #和算

直径が 80 寸の玉がある。水平に切断し,8 等分に分割する。それぞれの厚み(甲矢,乙矢,丙矢,丁矢)はいかほどか。

切断位置の z 座標を a, b, c とする。
甲矢 = 40 - c
乙矢 = c - b
丙矢 = b - a
丁矢 = a
である。
以下の連立方程式を解く。27組の解が得られるが 14 番目のものが適解である。
とはいっても,形式上は虚数解であるが,虚数部が実質 0 なので,実数部をとればよい。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms R, x, a, b, c
#R = 80/2
eq1 = integrate((R^2 - x^2)*PI, (x, c, R)) - PI*R^3*4/3 / 8
eq2 = integrate((R^2 - x^2)*PI, (x, b, c)) - PI*R^3*4/3 / 8
eq3 = integrate((R^2 - x^2)*PI, (x, a, b)) - PI*R^3*4/3 / 8
eq4 = integrate((R^2 - x^2)*PI, (x, 0, a)) - PI*R^3*4/3 / 8
res = solve([eq1, eq2, eq3], (a, b, c))[14]  # 14 of 27

    (-3*R^2/((-1/2 - sqrt(3)*I/2)*(27*R^3/4 + 27*sqrt(15)*sqrt(-R^6)/4)^(1/3)) - (-1/2 - sqrt(3)*I/2)*(27*R^3/4 + 27*sqrt(15)*sqrt(-R^6)/4)^(1/3)/3, -3*R^2/((-1/2 - sqrt(3)*I/2)*(27*R^3/2 + 27*sqrt(3)*sqrt(-R^6)/2)^(1/3)) - (-1/2 - sqrt(3)*I/2)*(27*R^3/2 + 27*sqrt(3)*sqrt(-R^6)/2)^(1/3)/3, -3*R^2/((-1/2 - sqrt(3)*I/2)*(81*R^3/4 + 27*sqrt(7)*sqrt(-R^6)/4)^(1/3)) - (-1/2 - sqrt(3)*I/2)*(81*R^3/4 + 27*sqrt(7)*sqrt(-R^6)/4)^(1/3)/3)

甲矢 = 17.685;  乙矢 = 8.42313;  丙矢 = 7.16168; 丁矢 = 6.73018 である。

a = res[1](R => 40).evalf() |> real
b = res[2](R => 40).evalf() |> real
c = res[3](R => 40).evalf() |> real
(a, b, c) |> println

    (6.73017607124110, 13.8918542133544, 22.3149879332610)

@printf("甲矢 = %g;  乙矢 = %g;  丙矢 = %g; 丁矢 = %g\n", 40 - c, c - b, b- a, a)

    甲矢 = 17.685;  乙矢 = 8.42313;  丙矢 = 7.16168; 丁矢 = 6.73018

 

 

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

算額(その1417)

2024年11月22日 | Julia

算額(その1417)

百三十八 利根郡月夜野町上津 八幡神社 明治22年(1889)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:数列,和
#Julia, #SymPy, #算額, #和算

蕎麦の実のように(正四面体)積み上げた玉が全部で 1769億7205万8701 個ある。一番上が 1 個のとき,底面(一番下)には何個の玉があるか。

参照:算額(その1402)算額(その1023)

ちょっとした落とし穴がある。単純に4つの球が互いに接し合うようにする場合は,配置法は 1 通りしかないが,2層以上に積み上げる場合には,何通りかあるようだ。

根本的には「六方最密構造」と「面心立方格子」の違いだそうである。
化学の質問から自分の思い込みに気がついた話(結晶構造)

算額(その1402)や算額(その1023)のような配置法は,「六方最密構造」である。上から満たずで黄色で示したものが最上位の球である。

1 層だけの場合:1 層目にある玉の数は 1,総数は 1
2 層ある場合:2 層目にある玉の数は 2+1 = 3,総数は 4
3 層ある場合:3 層目にある玉の数は 4+3+2+1 = 10,総数は 14
4 層ある場合:4 層目にある玉の数は 5+4+3+2+1 = 15,総数は 29
5 層ある場合:5 層目にある玉の数は 6+5+4+3+2+1 = 21,総数は 50
のようになる。

もう一つの配置法は,「面心立方格子」である。

1 層だけの場合:1 層目にある玉の数は 1,総数は 1
2 層ある場合:2 層目にある玉の数は 2+1 = 3,総数は 4
3 層ある場合:3 層目にある玉の数は 3+2+1 = 6,総数は 10
4 層ある場合:4 層目にある玉の数は 4+3+2+1 = 10,総数は 20
5 層ある場合:5 層目にある玉の数は 5+4+3+2+1 = 15,総数は 35
である。後者の場合は各層にある玉の数はいわゆる三角数である。六方最密構造と比べて隙間が少なく,密度が高いことがわかる。

算額は三角数が前提のようで,面心立方格子を指しているようだ。
ということで以下では面心立方格子を採用する。

1. ブルートフォース

ブルートフォース(brute force)とは,問題を解決するために可能な全ての選択肢や組み合わせを網羅的に試す方法のことである。この手法は非常に単純で,特定の問題に対して確実に解を見つけることができるが,効率的ではないことが多い。

以下のようなプログラムにより,「上から 10201 番目の層の玉の数は 52035301 個で,それまでの層にある玉の総数が 176972058701 個である」ことが見つかる。

いい加減にプログラムしたり,長精度数をサポートしていない言語を使用すると,整数オーバーフローで解が求まらないことがあるかもしれないので注意。

# Julia によるプログラム
using Printf
function s(n = 99999)
    t = 0
    for i in 1:n
        a = Int(i*(i + 1)/2)
        t += a
        if t == 176972058701
            println("第 $i 層の玉の数は $a 個,そこまでの玉の総数は $t 個")
            return
        end
    end
end;
s()

    第 10201 層の玉の数は 52035301 個,そこまでの玉の総数は 176972058701 個

Python の場合には以下のようにする。

    >>> def s():
    ...     t = 0
    ...     for i in range(1, 999999):
    ...         a = i*(i + 1)/2
    ...         t += a
    ...         if t == 176972058701:
    ...             print(i, a, t)
    ...             return
    ...    
    ... 
    >>> s()
    10201 52035301.0 176972058701.0

この問題ではブルートフォースでも難なく解を得られるが,多くの場合はブルートフォースだと計算時間がかかりすぎて解が求めにくいということもある。

そんなときには,何らかの法則性を利用することも一法である。

2. 賢い方法

今の場合,上から n 番目の層にある玉の数は a_n = n(n + 1)/2 個,n 番目の層までにある玉の総数は t_n = n(n + 1)(n + 2)/6 個である。
 n   a_n   t_n
 1     1     1
 2     3     4
 3     6    10
 4    10    20
 5    15    35
 6    21    56
 7    28    84
 8    36   120
 9    45   165
10    55   220
 :     :     :

t_n = 176972058701 のときの a_n を求めればよい。
以下の連立方程式を解く。

using SymPy
@syms n, a
eq1 = n*(n + 1)*(n + 2)/6 - 176972058701
eq2 = n*(n + 1)/2 - a
solve([eq1, eq2], (a, n))[1]

    (52035301, 10201)

10201 番目の層には 52035301 個の玉があり,1番目から 10201 番目の層にある玉の総数は 176972058701 個である。

また,SymPy には数列の部分和を求める関数 summation があるので,一般項の公式 a_n があれば部分和の公式 t_n は不要で,以下のようにすることもできる。

@syms i
eq1 = summation(i*(i + 1)/2, (i, 1, n)) - 176972058701
eq2 = n*(n + 1)/2 - a
solve([eq1, eq2], (a, n))[1]

    (52035301, 10201)

summation(i*(i + 1)/2, (i, 1, n)) |> factor |> println

    n*(n + 1)*(n + 2)/6

Python の sympy では以下のようにする。

    >>> from sympy import var, solve, summation
    >>> var('a, n, i')
    (a, n, i)
    >>> eq1 = n*(n + 1)*(n + 2)/6 - 176972058701
    >>> eq2 = n*(n + 1)/2 - a
    >>> solve([eq1, eq2], (a, n))[0]
    (52035301, 10201)

    >>> eq1 = summation(i*(i + 1)/2, (i, 1, n)) - 176972058701
    >>> eq2 = n*(n + 1)/2 - a
    >>> solve([eq1, eq2], (a, n))[0]
    (52035301, 10201)

 

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

さぬきうどん こがね製麺所 勅使店

2024年11月22日 | さぬきうどん

高松市勅使町 さぬきうどん こがね製麺所 勅使店
県内に何店舗かある
ちょっと甘めの出汁。わかめも入れ放題(節度を持って)

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

算額(その1416)

2024年11月22日 | Julia

算額(その1416)

八四 加須市不動岡 総願寺 明治12年(1879)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:正三角形,正方形
#Julia, #SymPy, #算額, #和算

正方形の中に正三角形が入っている。正三角形は,正方形と一つの頂点を共有し,他の 2 つの頂点が正方形の辺の上にある。

問題は判読不能ということであるが,算額(その1413)にも書いたように,どのような問題であるかは何通りか考えることができる。

一案として,「正方形の中に正三角形が入っている。正三角形は,正方形と一つの頂点を共有し,他の 2 つの頂点が正方形の辺の上にある。正方形の一辺の長さが与えられたとき,正三角形の一辺の長さを求める術(すべ)を述べよ。」を吟味しよう。

正方形の一辺の長さを a,正方形の辺の上にある頂点の座標を (b, 0), (a, a - b) とする。
左下の直角三角形の斜辺と右下の直角三角形の斜辺は正三角形の 2 辺なので等しい。よって,a^2 + b^2 = 2(a - b)^2 を b について解けばよい。

また,b が求まった後に正三角形の一辺の長さを自分で計算しなければならないので,それも連立方程式に組み入れておけば手間が省ける。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms a::positive, b::positive, 辺::positive
eq1 = (a^2 + b^2) - 2(a - b)^2
eq2 = sqrt((a^2 + b^2)) - 辺  # a, b から辺を計算する
res = solve([eq1, eq2], (辺, b))[1]
res |> println

    (2*a*sqrt(2 - sqrt(3)), a*(2 - sqrt(3)))

b = a*(2 - √3)である。
正三角形の一辺の長さは sqrt(a^2 + b^2) = sqrt(a^2 + (a*(2 - √3))^2) = 2a*sqrt(2 - √3) である。

正方形の一辺の長さが 652 のとき,正三角形の一辺の長さは 675.0000 有奇である。
なお,b = 174.702873465092 である。

res[1](a => 652).evalf() |>  println
res[2](a => 652).evalf() |>  println

    675.000069627374
    174.702873465092

function draw(a, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho") 
    b = a*(2 - √3)
    println("b = $b")
    @printf("正方形の一辺の長さが %.7g のとき,正三角形の一辺の長さは %.7g である。\n", a, 2*a*sqrt(2 - sqrt(3)))
    plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:green, lw=0.5)
    plot!([0, b, a, 0], [a, 0, a - b, a], color=:blue, 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(a, 0, "a", :green, :center, delta=-delta/2)
        point(0, a, "a ", :green, :right, :vcenter)
        point(b, 0, "b", :blue, :center, delta=-delta/2)
        point(a, a - b, "(a,a-b) ", :green, :right, :vcenter)
        plot!(xlims=(-5delta, a + 5delta), ylims=(-5delta, a + 5delta))
    end
end;

draw(652, true)

 

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

算額(その1415)

2024年11月21日 | Julia

算額(その1415)

八四 加須市不動岡 総願寺 明治12年(1879)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:正方形5個
#Julia, #SymPy, #算額, #和算

外側の正方形の中に,小さな正方形が 4 個連なって入っている。

問題は判読不能ということであるが,算額(その1413)にも書いたように,どのような問題であるかは何通りか考えることができる。一案として,「外側の正方形の中に,小さな正方形が 4 個連なって入っている。外側の正方形の一辺の長さが与えられたとき,小さな正方形の一辺の長さを求める術(すべ)をのべよ。」を吟味しよう。

外側の正方形の一辺の長さを a,中の小さな正方形の一辺の長さを b
とすると左下にある二等辺直角三角形と右下にある二等辺直角三角形が相似で,相似比が 1:4 である。
よって,(a - b/√2) = 4b/√2 を b について解けばよい。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf

using SymPy
@syms a::positive, b::positive
eq1 = a - b/√Sym(2) - 4b/√Sym(2)
res = solve(eq1, b)[1]
res |> println

    sqrt(2)*a/5

小さな正方形の一辺の長さ b は,外側の正方形の一辺の長さ a の √2/5 倍である。
外側の正方形の一辺の長さが a = 746 のとき,小さな正方形の一辺の長さは b = √2a/5 = 211.000有奇である。

function draw(a, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho") 
    b = √2a/5
    @printf("外側の正方形の一辺の長さが %.7g のとき,中にある正方形の一辺の長さは %.7g である。\n", a, b)
    plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:green, lw=0.5)
    plot!([0, b/√2, a, a - b/√2, 0], [b/√2, 0, a - b/√2, a, b/√2], color=:blue, lw=0.5)
    for i in 1:3
        segment(i*b/√2, (i + 1)*b/√2, (i + 1)*b/√2, i*b/√2, :blue)
    end
    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(0, b/√2, "b/√2 ", :blue, :right, :vcenter)
        point(b/√2, 0, "b/√2", :blue, :center, delta=-delta/2)
        point(a, 0, "a", :green, :center, delta=-delta/2)
        point(a, a - b/√2, "(a,a-b/√2) ", :blue, :right, :vcenter)
        plot!(xlims=(-10delta, a + 5delta), ylims=(-5delta, a + 5delta))
    end
end;

draw(746, true)

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

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

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