裏 RjpWiki

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

算額(その1498)

2024年12月27日 | Julia

算額(その1498)

二十五 一関市萩荘 萩荘春日神社 弘化4年(1847)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html

今有如図 3032
https://w.atwiki.jp/sangaku/pages/192.html

意訳:長方形の中に,等円 2 個を容れる。長方形の対角線を 2 本引き,その延長線と長方形の上辺に 3 箇所で接する楕円を置く。楕円の短径と等円の直径が与えられたとき,楕円の長径を求める術を述べよ。

山村の図では何がなんだかわからないが,「今有如図」で解決策が見えてくる。

算法助術の公式97 を用いる。
公式の記述中では変数は大文字で書き(eq97),変数が取る実際の値(定数とは限らない)は小文字で代入する(eq)。
その後 eq を方程式として解く。eq で大文字のものが求めるものである(今の場合は P すなわち楕円の長軸)。
公式を用いるに当たり,図に補助線として長方形内の対角線の延長と楕円に接する水平線を描く。対角線の延長と水平線は二等辺三角形を作り,楕円は二等辺三角形に内接する。これが公式97が対象とする図形である。
この二等辺三角形は長方形内の二等辺三角形と相似で,相似比は r:(2b + r) である。

include("julia-source.txt");

using SymPy

@syms A::positive, B::positive, C::positive, H::positive,
      P::positive, Q::positive
eq97 = -(B^2 - C^2)^2*H*Q^2 + (B^2 - C^2)^2*Q^3 + A^4*H*(2H - Q)^2 - A^4*Q*(2H - Q)^2 - A^2*H*P^2*(2H -  Q)^2
eq97 |> println

    A^4*H*(2*H - Q)^2 - A^4*Q*(2*H - Q)^2 - A^2*H*P^2*(2*H - Q)^2 - H*Q^2*(B^2 - C^2)^2 + Q^3*(B^2 - C^2)^2

@syms b, r
eq = eq97(A => 4(2b + r), B => sqrt((2b + r)^2 + 4(2b + r)^2), C => sqrt((2b + r)^2 + 4(2b + r)^2), H => 2b + r, Q => 2b)
eq = eq |> simplify
eq |> println

    64*(b + r)^2*(2*b + r)^3*(-P^2 - 32*b*(2*b + r) + 16*(2*b + r)^2)

# P:楕円の長軸
ans_P = solve(eq, P)[2]
ans_P |> println

    4*sqrt(r*(2*b + r))

等円の直径が 2,楕円の短径が 3 のとき,楕円の長径は

ans_P(r => 2/2, b => 3/2).evalf() |> println

    8.00000000000000

術は「長径 = sqrt(等円径*(2短径 + 等円径))」となっているが,術のとおりだと 4 になってしまう(山村はさらに間違えている)。
これを 2 倍しないと正しくない。

短径 = 3
等円径 = 2
sqrt(等円径*(2短径 + 等円径))

    4.0

function draw(b, r, more=false)  # b:楕円の短半径と,r:円の半径
    pyplot(size=(500, 500), showaxis=true, grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    a = 4*sqrt(r*(2*b + r))/2  # 長半径
    @printf("短径 = %g,等円径 = %g のとき,長径は %g である。\n", 2b, 2r, 2a)
    plot(r.*[2, 2, -2, -2, 2], r.*[-1, 1, 1, -1, -1], color=:blue, lw=0.5)
    plot!([-2r, 2(2b+r), -2(2b + r), 2r], [-r, 2b + r, 2b + r, -r], color=:blue, lw=0.5)
    circle2(r, 0, r)
    ellipse(0, r + b, a, b, color=:green)
    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)
    end
end;

draw(3/2, 2/2, true)

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

算額(その857)改訂版

2024年12月27日 | Julia

算額(その857)改訂版

算額(その857)は依拠した図が不正確なものであったので,改訂版を書くことになった

二十二 岩手県一関市瑞山 駒形根神社 明治41年(1908)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html

今有如図 03091
https://w.atwiki.jp/sangaku/pages/306.html

長方形の中に 2 本の弦と大円 1 個,小円 2 個を入れる。大円の直径が 1 寸のとき,小円の直径を求める術を述べよ。

山村と「今有如図」はまるで異なる図である。術から見ると,今有如図の方が正しい図である。

そこで,以下のように改訂版を書くことになった。

長方形の長辺と短辺を 2a, 2b
大円の半径と中心座標を r1, (0, r1); r1 = b
小円の半径と中心座標を r2, (a - r2, b - r2)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive, r2::positive
eq1 = dist2(a, -b, 0, b, a - r2, b - r2, r2)
eq2 = (a - r2)^2 + (b - r2)^2 - (b + r2)^2
res = solve([eq1, eq2], (r2, a))[1]

    (-sqrt(17)*b/8 + 9*b/8, b*(5/8 + 3*sqrt(17)/8))

res[1] |> simplify |> println

    b*(9 - sqrt(17))/8

小円の半径 r2 は 大円の半径 b の (√17 - 9)/8 倍である。
大円の直径が 1 寸のとき,小円の直径は (9 - √17)/8 = 0.6096117967977924 寸である。

術は記載されていないが,答えは一致した。

function draw(b, more=false)
    pyplot(size=(500, 500), showaxis=true, grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    r1 = b
    (r2, a) = (-sqrt(17)*b/8 + 9*b/8, b*(5/8 + 3*sqrt(17)/8))
    println(2r2)
    plot([a, a, -a, -a, a], [-b, b, b, -b, -b], color=:blue, lw=0.5)
    circle(0, 0, b)
    circle2(a - r2, b - r2, r2, :green)
    plot!([-a, 0, a], [-b, b, -b], color=:orange, 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", :blue, :left, :bottom, delta=delta/2)
        point(0, b, " b", :blue, :left, :bottom, delta=delta/2)
        point(0, 0, "大円:r1,(0,0)", :red, :center, delta=-delta)
        point(a - r2, b - r2, "小円:r2\n(a-r2,b-r2)", :green, :center, delta=-delta)
    end
end;

draw(1/2, true)

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

算額(その856)改訂版

2024年12月27日 | Julia

算額(その856)改訂版

算額(その856)は依拠した図が不正確なものであったので,改訂版を書くことになった

二十二 岩手県一関市瑞山 駒形根神社 明治41年(1908)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html

今有如図 03091
https://w.atwiki.jp/sangaku/pages/306.html

キーワード:円9個,外円
#Julia, #SymPy, #算額, #和算

外円内に大円 2 個,小円 6 個が入っている。外円の直径が 10 寸のとき,小円の直径を得る術を問う。

「今有如図」では,上下の 3 連の小円の中心は水平線に載っている。山村の解説図にはそれを伺わせる図があるが,積極的に水平線上にあるとは描いておらず,筆写はむしろ「3 個の小円は外円に内接しているのではないか」と疑ったわけである。

水平線上にあるとなれば話は別だ。解も簡単なものになる。術とも一致する。

外円の半径と中心座標を R, (0, 0)
大円の半径と中心座標を r1, (r1, 0)
小円の半径と中心座標を r2, (0, R - r2), (x2, y2)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms R, r1, r2, x2, y2
r1 = R/2
x2 = 2r2  # 中心が水平線上にあるとすればこれが成り立つ
eq1 = x2^2 + y2^2 - (R - r2)^2
eq2 = (r1 - x2)^2 + y2^2 - (r1 + r2)^2
res = solve([eq1, eq2], (r2, y2))[2]  # 2 of 2

    (R/5, 2*sqrt(3)*R/5)

小円の直径は外円の直径の 1/5 である。
外円の直径が 10 寸のとき,小円の直径は 2 寸である。

function draw(R, more=false)
    pyplot(size=(500, 500), showaxis=true, grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    R = 10/2
    r1 = R/2
    (r2, y2) = R.*(1/5, 2√3/5)
    plot()
    circle(0, 0, R)
    circle2(r1, 0, r1, :blue)
    circle22(0, y2, r2, :magenta)
    circle4(2r2, y2, r2, :magenta)
    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(R, 0, " R", :red, :left, :bottom, delta=delta/2)
        point(r1, 0, "大円:r1,(r1,0)", :blue, :center, delta=-delta/2)
        point(0, y2, "小円:r2\n(0,y2)", :magenta, :center, delta=-delta/2)
        point(2r2, y2, "小円:r2\n(2r2,y2)", :magenta, :center, delta=-delta/2)
    end
end;

draw(10/2, true)

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

算額(その1497)

2024年12月27日 | Julia

算額(その1497)

三戸郡五戸町 江渡家 天明6年(1786)

http://www.wasan.jp/aomori/eto.html
http://www.wasan.jp/aomori/eto3.png

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

今有如図 02001
https://w.atwiki.jp/sangaku/pages/53.html

意訳:正三角形の中に頂点から引かれる斜線が作る小さな正三角形の「空」がある。
頂点から引かれる斜線は,頂点から空の正三角形の頂点までの線分(矢:青)と空の正三角形の一辺(空方面:緑)からなる(矢と空方面は一直線上にある)。

以下の条件を満たすとき,空方面を求める術を述べよ。
(1) 空方面の 3 乗(空方面再自乗冪)と矢の 3 乗(矢再自乗)の和を外側の正三角形の一辺(赤)で割ったもの(外方面除之得商)と,空方面と矢の和(空方面矢和)が等しい(適等)
(2) 空方面の自乗(空方冪),矢,および外方面の三和は 14 である。

外方面(赤)を a,矢(青)を b,空方面(緑)を c とおき,以下の連立方程式を解く。

using SymPy

@syms a::positive, b::positive, c::positive
eq1 = (c^3 + b^3)/a - (c + b)  # 条件(1)
eq2 = c^2 + b + a - 14         # 条件(2)
eq3 = b^2 + (b + c)^2 - 2b*(b + c)*cosd(Sym(120)) - a^2  # 第二余弦定理
solve([eq1, eq2, eq3], (a, b, c))[1]

    (7, 3, 2)

外側の正三角形の一辺の長さ(外方面)は 7
矢は 3
内側の正三角形の一辺の長さ(空方面)は 2
である。

上の図は,コンパスと定規だけで製図できる。

 

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

手打ちうどん 清水屋

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

高松市成合町 手打ちうどん 清水屋
坂出の方にあるところてんの清水屋さんとは違うのでご注意

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

算額(その861)改訂版

2024年12月27日 | Julia

算額(その861)改訂版

算額(その861)は,そもそも問と図が一致していないので,改訂版を書く。

参考文献

1).  二十四 岩手県一関萩荘 達古袋八幡神社 弘化3年(1846)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html

2).  今有如図 03030
https://w.atwiki.jp/sangaku/pages/289.html

キーワード:円3個,円弧,正三角形2個
#Julia, #SymPy, #算額, #和算

円弧(弓形)の中に,正三角形 2 個,小円 2 個,大円 1 個を容れる。正三角形の一辺の長さ,小円の直径が与えられたとき,大円の直径を求める術を述べよ。

山村は「小円 2 個,大円 1 個を容れる」と言っているのに,中央に小円 1 個のみ描いている。

筆者も,問題文をよく確認せずに誤った解釈で「算額(その861)」を書いてしまった。痛恨の極みである。

「今有如図」ではちゃんと,小円 2 個,大円 1 個 が描かれている。

よって,「算額(その861)改訂版」を書くことになった。

しかしなお,この場合も,「正三角形の一辺の長さと,任意の小円の直径の両方が与えられた場合には図を描くことができない」ことに変わりはない。そこで,「正三角形の一辺の長さのみが与えられる」ものとして解を求めることにする。

正三角形の一辺の長さを a
円弧の半径と中心座標を R, (0, 0)
大円の半径と中心座標を r1, (0, R - r1)
小円の半径と中心座標を r2, (x2, R - 2r1 + r2)
とおき,a を既知として以下の連立方程式を解き (R, r1, r2, x2) を求める。

条件式が 4 個あるのだから,未知数は 4 個でなければならない。a, r2 が与えられてしまうと条件式が余る。使われない条件式を満たさない解になるということである。(今更こんなことを書く必要はないのだが)

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

using SymPy

@syms R, a, r1, r2, x2
y = R - 2r1
b = y/sqrt(Sym(3))
eq1 = dist(b, y, b + a/2, y + sqrt(Sym(3))*a/2, 0, R - r1) - r1^2
eq2 = dist(b + a, y, b + a/2, y + sqrt(Sym(3))*a/2, x2, y + r2) - r2^2
eq1 = dist2(b, y, b + a/2, y + sqrt(Sym(3))*a/2, 0, R - r1, r1)
eq2 = dist2(b + a, y, b + a/2, y + sqrt(Sym(3))*a/2, x2, y + r2, r2)
eq3 = x2^2 + (y + r2)^2 - (R - r2)^2
eq4 = (b + a/2)^2 + (y + sqrt(Sym(3))*a/2)^2 - R^2;
#res = solve([eq1, eq3, eq4], (R, r1, r2, x2))

res = solve([eq1, eq4], (R, r1))[4]  # 4 of 4

    ((-669*sqrt(3)*a^3*(-24*sqrt(3)/23 - 16/23)^2/32 + 81*sqrt(3)*a^3*(-24*sqrt(3)/23 - 16/23)/8 + 18*sqrt(3)*a^3 - 5313*sqrt(3)*a^3*(-24*sqrt(3)/23 - 16/23)^3/512)/(26*a^2), -sqrt(3)*a*(-24*sqrt(3)/23 - 16/23)/8)

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

    3*a*(2*sqrt(3) + 9)/23

円弧の直径は,正三角形の一辺の長さの 6(2√3 + 9)/23 倍である。

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

    a*(2*sqrt(3) + 9)/23

大円の直径は,正三角形の一辺の長さの 2(2√3 + 9)/23 倍である。

大円の直径は,正三角形の一辺の長さのみで決定される。そして,このあと判明するが,小円の直径も正三角形の一辺の長さのみで決定される。小円の直径として任意の値を設定すると,そのような図形は描けないということになる。

引き続き,eq2, eq3 から x2, r2 を求める。

eq12 = eq2(R => res[1], r1 => res[2]) |> simplify;

# x2
ans_x2 = solve(eq12, x2)[2] |> factor  # of 2
ans_x2 |> println

    (9*sqrt(3)*a + 75*a + 23*sqrt(3)*r2)/69

eq13 = eq3(R => res[1], r1 => res[2], x2 => ans_x2) |> simplify;

# r2
ans_r2 = solve(eq13, r2)[1] |> sympy.sqrtdenest |> factor  # of 2
ans_r2 |> println

    a*(-27 + 17*sqrt(3))/23

小円の直径は正三角形の一辺の長さの 2(17√3 - 27)/23 倍である。

なお,a を r2 で表すこともできるので,r2 を与えて r1 を求めることもできる。それは,他のパラメータと r1 の関係にも成り立つ。

eq = r2 - a*(-27 + 17*sqrt(Sym(3)))/23;

ans_a = solve(eq, a)[1] |> factor
ans_a |> println

    r2*(27 + 17*sqrt(3))/6

以前求めた r1 の式中に出てくる a に ans_a を代入すれば,r2 から r1 を求める式になる。

ans_r1 = res[2](a => ans_a) |> simplify
ans_r1 |> println

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

ans_r1(r2 => 0.212596845971384).evalf() |> println

    1.08383492305546

いずれにせよ,r1 を求めるためには,a か r2 のいずれかだけがわかればよいということである。

以上をまとめると,正三角形の一辺の長さが 1 のとき,大円,小円,円弧の直径は 1.08383492305546, 0.212596845971384, 3.25150476916637 である。

a = 1
R = 3*a*(2*sqrt(3) + 9)/23
r1 = a*(2*sqrt(3) + 9)/23
r2 = a*(-27 + 17*sqrt(3))/23
2 .*(r1, r2, R)

    (1.083834923055457, 0.21259684597138379, 3.2515047691663708)

術は「大円直径 = (√12*正三角形の一辺の長さ - 小円直径)/3」ということで,r2 に 0.1062984229856919 以外の値が与えられると成り立たない。

a = 1
r2 = 0.1062984229856919
(√12*a - 2r2)/3 |> println

    1.083834923055457

function draw(a, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    R = 3*a*(2√3 + 9)/23
    r1 = a*(2√3 + 9)/23
    r2 = a*(17√3 - 27)/23
    x2 = (9√3*a + 75*a + 23√3*r2)/69
    @printf("正三角形の一辺の長さが %g のとき,大円,小円,円弧の直径は %.15g, %.15g, %.15g である。\n", a, 2r1, 2r2, 2R)
    @printf("a = %g;  R = %g;  r1 = %g;  r2 = %g;  x2 = %g\n", a, R, r1, r2, x2)
    b = (R - 2r1)/√3
    y = R - 2r1
    x = sqrt(R^2 - y^2)
    θ = atand(y, x)
    plot([b, b + a, b + a/2, b], [y, y, y + √3a/2, y], color=:blue, lw=0.5)
    plot!(-[b, b + a, b + a/2, b], [y, y, y + √3a/2, y], color=:blue, lw=0.5)
    circle(0, 0, R, :magenta, beginangle=θ, endangle=180 - θ)
    circle(0, R - r1, r1)
    circle2(x2, y + r2, r2, :green)
    segment(-x , y, x, y)
    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)
        ylims!(y - 10delta, R + 3delta)
        point(b + a, y, "(b+a,y)", :blue, :center, delta=-delta/2)
        #point(b + a/2, y, "(b+a/2,y)", :blue, :center, delta=-delta/2)
        point(b + a/2, y + √3a/2, "(b+a/2,y+√3a/2)", :blue, :center, :bottom, delta=5delta, deltax=15delta)
        point(b, y, "(b,y)", :blue, :center, delta=-delta/2)
        point(0, y, "(0,y)", :blue, :center, delta=-delta/2)
        point(0, y + r1, "大円:r1,(0, y+r1)", :red, :center, delta=-delta/2)
        point(x2, y + r2, "小円:r2\n(x2, y+r2)", :green, :right, :vcenter, delta=delta, deltax=-13delta)
        point(0, R, "R", :magenta, :center, :bottom, delta=delta)
        point(b + a/2, y + √3a/2)
    end
end;

draw(1, true)

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

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

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