裏 RjpWiki

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

算額(その1673)

2025年03月28日 | Julia

算額(その1673)

長野県山内町 渋医王殿 文化15年(1818)
中村信弥「幻の算額」(319)
http://www.wasan.jp/maborosi/maborosi3-3.pdf
キーワード:整数係数式、係数推定、最小値を取るxの値
#Julia, #SymPy, #算額, #和算,#数学

x についての 3 次整数係数式がある。
f(x) = a + b*x + c*x^2 + d*x^3
f(1)= 58,f(3)= 42,f(5) = 10, f(9) = 90
このとき,各項の係数と f(x) が極小値をとるときの x をもとめよ。

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

using SymPy

@syms a, b, c, d, x
f = a + b*x + c*x^2 + d*x^3
eq1 = f(x => 1) - 58
eq2 = f(x => 3) - 42
eq3 = f(x => 5) - 10
eq4 = f(x => 9) - 90;

res1 = solve([eq1, eq2, eq3, eq4], (a, b, c, d))

係数は a = 45,b = 23,c = -11,d = 1 である。

極小値をとる x は,f の導関数をとり,導関数 = 0 を解く。2番目のものが適解である。

res2 = solve(diff(f, x), x)[2]

b, c, d に実値を入れれば x =6.07036751697599 を得る。

res2(b => 23, c => -11, d => 1).evalf() |> println

6.07036751697599

ちなみにそのときの f の値は 2.96464202605517 である。

(x^3 - 11*x^2 + 23*x + 45)(x => 6.07036751697599).evalf() |> println

2.96464202605517

plot(x^3 - 11*x^2 + 23*x + 45, xlims=(0, 10), label="f(x)")
plot!(23 + -22x + 3x^2, xlims=(0, 10), label="g(x)")
vline!([6.07036751697599], label="")

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

はなまるうどん 発祥の地 木太町店

2025年03月26日 | さぬきうどん

高松市木田町 セルフ はなまるうどん
香川県内の1号店。最寄り駅は林道だが,はなまるうどん駅になった。







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

算額(その1672)

2025年03月26日 | Julia

算額(その1672)

和算で遊ぼう!! 「三春まちなか寺子屋」2017レポート
9月 狐田稲荷神社 

https://miharukoma.com/wp-content/uploads/2018/01/%E4%B8%89%E6%98%A5%E3%81%BE%E3%81%A1%E3%81%AA%E3%81%8B%E5%AF%BA%E5%AD%90%E5%B1%8B2017%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88.pdf
キーワード:中国剰余定理
#Julia, #SymPy, #算額, #和算,#数学

狐が田植えをする。苗の束数はわからないが,5 把ずつ植えると 1 把余り,7
 把ずつ植えると 2 把余るという。総束数をもとめよ。

using SymPy

#from sympy.ntheory.modular import crt

# 剰余の条件
moduli = [5, 7]   # 除数のセット
remainders = [1, 2]  # 剰余のセット

# 中国剰余定理を使用して解を求める
solution = sympy.ntheory.modular.crt(moduli, remainders)  # 最小解と周期が返される

    (16, 35)

総束数は 16 把である。

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

算額(その1671)

2025年03月25日 | Julia

算額(その1671)

長野県錯視臼田町広河原 禅昌寺 文政9年(1826)
中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
キーワード:球7個,減弧円錐,3次元
#Julia, #SymPy, #算額, #和算,#数学

減弧円錐の中に甲球 3 個,乙球 1 個,丙球 3 個を容れる。甲球は互いに外接し,底面と側面に接し,乙球とも外接する。丙球は乙球と外接し,側面とも接している。乙球は甲球,丙球と外接し,側面にも接している。
丙球の直径が甲球の直径の 1/5(2 分)のとき,乙球の直径の最小値を求めよ。

減弧円錐とは,左側の図において,赤で描いた 2 個の円を z 軸を中心として回転させたときにできる先の尖った円錐状の立体である。

大球の半径と中心座標を R, (R, 0, R)
甲球の半径と中心座標を r1, (2r1/√3, 0, r1)
乙球の半径と中心座標を r2, (0, 0, z2)
丙球の半径と中心座標を r3, ((2r3/√3, 0, z3)
とおき,以下の連立方程式を解く。

r1, r2, z2, r3, z3 は R の関数として得られる。

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

using SymPy

@syms R, r1, r2, z2, r3, z3
eq1 = (R -2r1/√Sym(3))^2 + (R - r1)^2 - (R + r1)^2
eq2 = R^2 + (R - z2)^2 - (R + r2)^2
eq3 = (2r1/√Sym(3))^2 + (z2 - r1)^2 - (r1 + r2)^2
eq4 = (R - 2r3/√Sym(3))^2 + (R - z3)^2 - (R + r3)^2
eq5 = (2r3/√Sym(3))^2 + (z3 - z2)^2 - (r2 + r3)^2;

ans_r1 = solve(eq1, r1)[2]  # 2 of 2
ans_r1 |> println

    R*(-sqrt(9 + 6*sqrt(3)) + sqrt(3) + 3)/2

eq12 = eq2(r1 => ans_r1)
eq13 = eq3(r1 => ans_r1);
res = solve([eq12, eq13], (r2, z2))[1]

    (R*(-1940*sqrt(3 + 2*sqrt(3)) - 1120*sqrt(9 + 6*sqrt(3)) + 2848*sqrt(3) + 4933)/(4*(-277*sqrt(3)*sqrt(3 + 2*sqrt(3)) - 478*sqrt(3 + 2*sqrt(3)) + 1218 + 704*sqrt(3))), R*(-427*sqrt(9 + 6*sqrt(3)) - 736*sqrt(3 + 2*sqrt(3)) + 1081*sqrt(3) + 1877)/(4*(-39*sqrt(3)*sqrt(3 + 2*sqrt(3)) - 67*sqrt(3 + 2*sqrt(3)) + 98*sqrt(3) + 171)))

# r2
@syms d
ans_r2 = apart(res[1]/R, d) |> simplify |> sympy.sqrtdenest |> simplify |> x -> x*R
ans_r2 |> println

    R*(-37*sqrt(2)*3^(3/4)/552 - 21*sqrt(2)*3^(1/4)/184 + 13/46 + 4*sqrt(3)/23)

# z2
ans_z2 = apart(res[2]/R, d) |> simplify |> sympy.sqrtdenest |> simplify |> x -> x*R
ans_z2 |> println

    R*(-67*sqrt(2)*3^(1/4)/184 - 83*sqrt(2)*3^(3/4)/552 + 4*sqrt(3)/23 + 59/46)

eq15 = eq5(r2 => ans_r2, z2 => ans_z2) |> simplify
eq14 = eq4 |> expand
res2 = solve([eq14, eq15], (r3, z3))[2]  # 2 of 2

    ((-192*sqrt(3)*R - 312*R + 120*sqrt(2)*3^(3/4)*R + 264*sqrt(2)*3^(1/4)*R + (3*R*sqrt(-133695296*sqrt(2)*3^(3/4) - 231566928*sqrt(2)*3^(1/4) + 497992069 + 287516218*sqrt(3))/(2*(2630*sqrt(2)*3^(3/4) + 4590*sqrt(2)*3^(1/4) + 17642*sqrt(3) + 30675)) + 3*R*(-5537*sqrt(2)*3^(3/4) - 9587*sqrt(2)*3^(1/4) + 16095*sqrt(3) + 27957)/(2*(2630*sqrt(2)*3^(3/4) + 4590*sqrt(2)*3^(1/4) + 17642*sqrt(3) + 30675)))*(-201*sqrt(2)*3^(1/4) - 83*sqrt(2)*3^(3/4) + 156 + 96*sqrt(3)))/(63*sqrt(2)*3^(1/4) + 37*sqrt(2)*3^(3/4) + 396 + 272*sqrt(3)), 3*R*sqrt(-133695296*sqrt(2)*3^(3/4) - 231566928*sqrt(2)*3^(1/4) + 497992069 + 287516218*sqrt(3))/(2*(2630*sqrt(2)*3^(3/4) + 4590*sqrt(2)*3^(1/4) + 17642*sqrt(3) + 30675)) + 3*R*(-5537*sqrt(2)*3^(3/4) - 9587*sqrt(2)*3^(1/4) + 16095*sqrt(3) + 27957)/(2*(2630*sqrt(2)*3^(3/4) + 4590*sqrt(2)*3^(1/4) + 17642*sqrt(3) + 30675)))

# r3
@syms d
ans_r3 = apart(res2[1]/R, d) |> simplify |> sympy.sqrtdenest |> simplify |> x -> x*R
ans_r3 |> println

    R*(-1457609*sqrt(2)*3^(3/4) - 2524500*sqrt(2)*3^(1/4) + 3^(1/4)*(-201 - 83*sqrt(3))*sqrt(-267390592*sqrt(2)*3^(3/4) - 463133856*sqrt(2)*3^(1/4) + 995984138 + 575032436*sqrt(3))/2 + 78*sqrt(-133695296*sqrt(2)*3^(3/4) - 231566928*sqrt(2)*3^(1/4) + 497992069 + 287516218*sqrt(3)) + 48*sqrt(-401085888*sqrt(2)*3^(3/4) - 694700784*sqrt(2)*3^(1/4) + 1493976207 + 862548654*sqrt(3)) + 6137076 + 3544118*sqrt(3))/(2618169*sqrt(2)*3^(1/4) + 1512127*sqrt(2)*3^(3/4) + 9518764 + 5497344*sqrt(3))

# z3
ans_z3 = apart(res2[2]/R, d) |> simplify |> sympy.sqrtdenest |> simplify |> x -> x*R
ans_z3 |> println

    3*R*(-5537*sqrt(2)*3^(3/4) - 9587*sqrt(2)*3^(1/4) + sqrt(-133695296*sqrt(2)*3^(3/4) - 231566928*sqrt(2)*3^(1/4) + 497992069 + 287516218*sqrt(3)) + 16095*sqrt(3) + 27957)/(2*(2630*sqrt(2)*3^(3/4) + 4590*sqrt(2)*3^(1/4) + 17642*sqrt(3) + 30675))

R = 1 のとき,r1 = 0.164191;  r2 = 0.155332;  z2 = 0.421387;  r3 = 0.0357628;  z3 = 0.607967 となる。

r3/r1 = 0.2178121821537112 である。
答えは,乙球径 = 1.32678 である。なぜこのような答えになるのか??

function draw(R)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    r1 = R*(-sqrt(9 + 6*sqrt(3)) + sqrt(3) + 3)/2
    r2 = R*(-37*sqrt(2)*3^(3/4)/552 - 21*sqrt(2)*3^(1/4)/184 + 13/46 + 4*sqrt(3)/23)
    z2 = R*(-67*sqrt(2)*3^(1/4)/184 - 83*sqrt(2)*3^(3/4)/552 + 4*sqrt(3)/23 + 59/46)
    r3 = R*(-1457609*sqrt(2)*3^(3/4) - 2524500*sqrt(2)*3^(1/4) + 3^(1/4)*(-201 - 83*sqrt(3))*sqrt(-267390592*sqrt(2)*3^(3/4) - 463133856*sqrt(2)*3^(1/4) + 995984138 + 575032436*sqrt(3))/2 + 78*sqrt(-133695296*sqrt(2)*3^(3/4) - 231566928*sqrt(2)*3^(1/4) + 497992069 + 287516218*sqrt(3)) + 48*sqrt(-401085888*sqrt(2)*3^(3/4) - 694700784*sqrt(2)*3^(1/4) + 1493976207 + 862548654*sqrt(3)) + 6137076 + 3544118*sqrt(3))/(2618169*sqrt(2)*3^(1/4) + 1512127*sqrt(2)*3^(3/4) + 9518764 + 5497344*sqrt(3))
    z3 = 3*R*(-5537*sqrt(2)*3^(3/4) - 9587*sqrt(2)*3^(1/4) + sqrt(-133695296*sqrt(2)*3^(3/4) - 231566928*sqrt(2)*3^(1/4) + 497992069 + 287516218*sqrt(3)) + 16095*sqrt(3) + 27957)/(2*(2630*sqrt(2)*3^(3/4) + 4590*sqrt(2)*3^(1/4) + 17642*sqrt(3) + 30675))
    @printf("R = %g;  r1 = %g;  r2 = %g;  z2 = %g;  r3 = %g;  z3 = %g\n", R, r1, r2, z2, r3, z3)
    p1 = plot(xlabel="x-axis", ylabel="z-axis")
    circle2(R, R, R)
    circle(2r1/√3, r1, r1, :blue)
    circle(-r1/√3, r1, r1, :blue)
    circle(0, z2, r2, :green)
    circle(2r3/√3, z3, r3, :magenta)
    circle(-r3/√3, z3, r3, :magenta)
    point(0.8, 0.9, "甲円:r2,(2r1/√3,0,r1)", :blue, :right, :bottom, delta=0.1R, mark=false)
    point(0.8, 1.1, "乙円:r2,(0,0,z2)", :green, :right, :bottom, delta=0.1R, mark=false)
    point(0.8, 1.3, "丙円:r3,(2r3/√3,0,z3)", :magenta, :right, :bottom, delta=0.08R, mark=false)
    point(R, R, "大円:R,(R,R)", :red, :right, delta=-0.1R)
    plot!(xlims=(-1, 1), ylims = (0, 1))
p2 = plot(xlabel="x-axis", ylabel="y-axis")
    circle2(R, 0, R)
    rotate(2r1/√3, 0, r1, :blue)
    circle(0, 0, r2, :green)
    rotate(2r3/√3, 0, r3, :magenta)
    plot!(xlims=(-0.5, 0.5), ylims = (-0.5, 0.5))
    plot(p1, p2)
end;

draw(1)

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

讃岐うどん ぼっこ屋

2025年03月23日 | さぬきうどん

高松市三谷町 ぼっこ屋 三谷店
やや太麺。
特筆すべきは,「しっかり噛もうと思わなければ噛めない太麺」... 今までなかった(少ない経験ながら)


 

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

算額(その1670) 改訂版

2025年03月23日 | Julia

算額(その1670)

直接連立方程式を解くようにした

長野県小諸市八幡町 八幡神社 寛政11年(1799)
中村信弥「改訂増補 長野県の算額」

http://www.wasan.jp/zoho/zoho.html
キーワード:等差数列,数列の一般項,部分和
#Julia, #SymPy, #算額, #和算,#数学

n 個の立方体がある。各立方体の 1 辺は等差級数をなし,公差が r とする。
n 個の立方体の 1 辺の長さの和が A,体積の和が B のとき,立方体の個数を求める術を述べよ。

注:A, B だけではなく r(または a) も与えないと解は求まらない。

using SymPy

@syms x, r, a, n, A, B

    (x, r, a, n, A, B)

各立方体の 1 辺の長さは,初項 a, 公差 r の等差数列である。
summation() は,一般項と,変数,範囲を与えると和の公式を返す。
和が A であるという方程式 eq1 を立てる。

eq1 = A - summation(a + r*(x - 1), (x, 1, n));

各立方体の体積の一般項は (a + r*(x - 1))^3 である。
体積の和が B であるという方程式 eq2 を立てる。

eq2 = B - summation((a + (x - 1)r)^3, (x, 1, n));

連立方程式を解き,n, a を求める。

res = solve([eq1, eq2], (n, a))[4]

    (-sqrt(A*(-4*A^2*r + A*r^2 + 4*B))/(2*A*r) + sqrt(A*(4*A^2*r + A*r^2 + 4*B))/(2*A*r), r/2 + sqrt(A*(-4*A^2*r + A*r^2 + 4*B))/(2*A))

# n
res[1] |> simplify

res[1](A => 33, B => 2775.96, r => 2.6).evalf() |> println

    5.00000000000000

# a
res[2] |> simplify

res[2](A => 33, B => 2775.96, r => 2.6).evalf() |> println

    1.40000000000000

末尾に示すテストデータを作るプログラムにより,初項 a = 1.4, 公差 r = 2.6 での結果,第 5 項までで A = 33, B = 2775.96 を代入すると確かに n = 5 になる。
また,初項は a = 1.4 であることもわかる。

A, B, a を与えて n, r を求める

連立方程式による方法は,何を未知数とするかを選ぶことができることである。

同じ連立方程式で,A, B, a を与えて n, r を求める解を求めることも簡単に指定できる。

res2 = solve([eq1, eq2], (n, r))[1]

    (-(-2*A^2*a + A*a^2 + B)/(2*(A*a^2 - B)) - sqrt(-4*A^4*a^2 + 8*A^3*B + 4*A^3*a^3 - 12*A^2*B*a + A^2*a^4 + 2*A*B*a^2 + B^2)/(2*(A*a^2 - B)), (A*a^2 - B)/(A*(-A + a)))

# n
res2[1] |> simplify

# r
res2[1](A => 33, B => 2775.96, a => 1.4).evalf() |> println

    5.00000000000000

res2[2] |> simplify

res2[2](A => 33, B => 2775.96, a => 1.4).evalf() |> println

    2.60000000000000

初項 a = 1.4, 公差 r = 2.6 での結果,第 5 項までで A = 33, B = 2775.96 を代入すると確かに n = 5,a = 1.4 であることがわかる。

テストデータ生成プログラム(チェック付き)

function example(a, r, n = 10)
    setprecision(BigFloat, 120)
    println("a = $a\nr = $r\n")
    A = big"0"
    B = big"0"
    for i = 1:n
        ai = a + (i - 1)r
        A += ai
        B += ai^3
        個数 = sqrt(big"2")*sqrt(1 + 4*B/(A*r^2) - sqrt(-16*A^4*r^2 + A^2*r^4 + 8*A*B*r^2 + 16*B^2)/(A*r^2))/2
        println("i = $i\nai = $ai\nA = $A\nB = $B\n個数 = $個数\n")
    end
    setprecision(BigFloat, 256)
    return  # return nothing
end;
example(big"1.4", big"2.6")

    a = 1.399999999999999999999999999999999999999999999999999999999999999999999999999997
    r = 2.599999999999999999999999999999999999999999999999999999999999999999999999999986

    i = 1
    ai = 1.3999999999999999999999999999999999997
    A = 1.3999999999999999999999999999999999997
    B = 2.7439999999999999999999999999999999996
    個数 = 0.9999999999999999999999999999999999985

    i = 2
    ai = 4.0
    A = 5.4000000000000000000000000000000000012
    B = 66.744000000000000000000000000000000015
    個数 = 2.000000000000000000000000000000000003

    i = 3
    ai = 6.5999999999999999999999999999999999988
    A = 12.0
    B = 354.2399999999999999999999999999999998
    個数 = 3.0000000000000000000000000000000000451

    i = 4
    ai = 9.1999999999999999999999999999999999976
    A = 21.20000000000000000000000000000000001
    B = 1132.9279999999999999999999999999999998
    個数 = 4.0000000000000000000000000000000002106

    i = 5
    ai = 11.79999999999999999999999999999999999
    A = 33.0
    B = 2775.9599999999999999999999999999999946
    個数 = 5.0000000000000000000000000000000002407

    i = 6
    ai = 14.399999999999999999999999999999999995
    A = 47.400000000000000000000000000000000019
    B = 5761.9439999999999999999999999999999949
    個数 = 6.0000000000000000000000000000000004815

    i = 7
    ai = 17.0
    A = 64.400000000000000000000000000000000019
    B = 10674.943999999999999999999999999999995
    個数 = 7.0000000000000000000000000000000005657

    i = 8
    ai = 19.600000000000000000000000000000000005
    A = 84.0
    B = 18204.480000000000000000000000000000016
    個数 = 7.9999999999999999999999999999999995727

    i = 9
    ai = 22.199999999999999999999999999999999986
    A = 106.19999999999999999999999999999999996
    B = 29145.527999999999999999999999999999978
    個数 = 9.0

    i = 10
    ai = 24.79999999999999999999999999999999999
    A = 131.0
    B = 44398.519999999999999999999999999999984
    個数 = 10.000000000000000000000000000000000373

 

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

算額(その1669)

2025年03月22日 | Julia

算額(その1669)

百十一 高崎市倉賀野町 倉賀野神社 慶応3年(1867)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.

群馬の和算 111(2/2) 倉賀野神社
http://takasakiwasan.web.fc2.com/gunnsann/g111_1.html

キーワード:円弧,弦,矢,弧背
#Julia, #SymPy, #算額, #和算,#数学

矢が 1 寸,弦が 4 寸の円弧がある。円弧の周長(弧背)を求めよ。

矢,弦はそのまま変数名とする。
円弧の半径と中心座標を R, (0, 0) とおき,以下の方程式を解く。

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

using SymPy

@syms 矢, 弦, R
eq = (R - 矢)^2 + (弦/2)^2 - R^2
ans_R = solve(eq, R)[1]
ans_R |> println

    弦^2/(8*矢) + 矢/2

円弧の中心角を θ とすると θ = acosd((R - 1)/R) である。
弧背は直径 2R の円の円周の 2θ/360 である。

弧背 = 2(弦^2/(8*矢) + 矢/2)*pi*2acosd((ans_R - 1)/ans_R)/360 |> simplify
弧背 |> println

    (弦^2 + 4*矢^2)*acos((弦^2 + 4*矢*(矢 - 2))/(弦^2 + 4*矢^2))/(4*矢)

矢が 1,弦が 4 のとき,弧背は 4.63647609000806 である。

注:復元算額の答の中の「□□□」は欠損文字を表したつもりかもしれないが「000」である。欠損文字の表記「◯◯◯」と見間違えたのかもしれない。

弧背(矢 => 1, 弦 => 4).evalf() |> println

    4.63647609000806

function draw(矢, 弦, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    R = 弦^2/(8矢) + 矢/2
    θ = acosd((R - 1)/R)
    弧背 = 2R*pi*2θ/360
    @printf("矢が %g,弦が %g のとき,弧背は %.15g である。\n", 矢, 弦, 弧背)
    plot()
    circle(0, 0, R, beginangle=90 - θ, endangle=90 + θ)
    y = R - 1
    x = sqrt(R^2 - y^2)
    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)
        dimension_line(0, R - 1, 0, R, "矢", :green, :left, length=10delta)
        dimension_line(-x, y, x, y, "弦", :blue, :center, delta=-5delta, length=10delta)
        point(0, R, "R", :red, :center, :bottom, delta=2delta)
        plot!([-x, 0, x], [y, 0, y], color=:black, lw=0.5)
        circle(0, 0, 0.08R, :magenta, beginangle=90 - θ, endangle=90 + θ)
        circle(0, 0, 0.09R, :magenta, beginangle=90 - θ, endangle=90 + θ)
        point(0, 0.1R, "2θ", :magenta, :center, :bottom, delta=delta, mark=false)
        
    end
end;

draw(1, 4, true)

 

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

算額(その1668)

2025年03月22日 | Julia

算額(その1668)

栃木県佐野市 星宮神社 天和3年(1683) 現存するもので一番古い算額
山口正義:やまぶき 第 47 号
https://yamabukiwasan.sakura.ne.jp/ymbk47.pdf
山口正義:やまぶき 第 48 号
https://yamabukiwasan.sakura.ne.jp/ymbk48.pdf
キーワード:直角三角形,鈎,股,弦,内接円,外積
#Julia #SymPy #算額 #和算 #数学

直角三角形において,
(1) A = ((弦 - 鈎)^(1//7) + (弦 - 股)^(1//5) + 円径^(1//3))^9 + 外積
(2) B = 股 - 鈎
の 2 つが与えられたときに,各長さ,面積(鈎,股,弦,円径,外積)はいかほどか。

以下は山口による説明

これを解析的に解くのは相当に難しい。

数値的に解こう。与えられる A, B から「鈎」,「股」を求める。
なお,普通の直角三角形(?)において,A は B の数万〜数十万倍である。

A には,「円径」,「外積」が含まれるが,いずれも「鈎」と「股」で計算されるものである。
「鈎」,「股」の初期値は実験により得られるデータ対の解析に基づいて,A, B の関数として与える。

まず,A, B の連立方程式を記述する。

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

using SymPy

@syms A, B, 鈎, 股, 弦, 円径, 外積
弦 = sqrt(鈎^2 + 股^2)
円径 = 鈎 + 股 - 弦
外積 = 鈎*股/2 - π*(円径/2)^2
eq1 = A - (((弦 - 鈎)^(1//7) + (弦 - 股)^(1//5) + 円径^(1//3))^9 + 外積)
eq2 = B - (股 - 鈎);

A, B から「鈎」,「股」を求める関数を定義する。

「鈎」,「股」の初期値「pred_鈎」,「pred_股」については後述する。

function driver(A, B)
    function H(u)
        (鈎, 股) = u
        return [
            A - 股*鈎/2 + pi*(股/2 + 鈎/2 - sqrt(股^2 + 鈎^2)/2)^2 - ((-股 + sqrt(股^2 + 鈎^2))^(1/5) + (-鈎 + sqrt(股^2 + 鈎^2))^(1/7) + (股 + 鈎 - sqrt(股^2 + 鈎^2))^(1/3))^9,  # eq1
            B - 股 + 鈎,  # eq2
        ]
    end;
    pred_鈎 = 1.497 + 2.337e-05*A - 4.006e-11*A^2
    pred_股 = 4.107397 + 0.934185*B - 0.003609*B^2
    iniv = BigFloat[pred_鈎, pred_股]  # 適当な初期値でも収束することが多い
    return nls(H, ini=iniv)
end;

A = 60000, B = 4 の場合の「鈎」,「股」を求める。

res = driver(60000, 4)

    ([2.6226253736776437, 6.622625373677644], true)

出力項目の最後が true ならば,数値解は正常に収束したものであることを示している。

検算は不要であるが,念の為に検算してみる。
まず,「弦」,「円径」,「外積」を求める。

鈎 = 2.6226253736776437
股 = 6.622625373677644
弦 = sqrt(鈎^2 + 股^2)
円径 = 鈎 + 股 - 弦
外積 = 鈎*股/2 - π*(円径/2)^2
(弦, 円径, 外積)

    (7.123014157695936, 2.1222365896593516, 5.146987197425817)

次いで,A, B が最初に与えた値と同じになることを確認する。

# A
((弦 - 鈎)^(1//7) + (弦 - 股)^(1//5) + 円径^(1//3))^9 + 外積

    60000.0

# B
股 - 鈎

    4.0

「鈎」,「股」の初期値「pred_鈎」,「pred_股」について

以下のようなプログラムで,A, B に対して得られる「鈎」,「股」,「弦」,「円径」,「外積」を記録する。

普通の直角三角形(?)において,A は B の数万〜数十万倍である。

println("A B 鈎 股 弦 円径 外積")
for i = 1:20
    for j = (i+1:20) .* 10000
        res = driver(j, i)
        if res[2]
            鈎 = res[1][1]
            股 = res[1][2]
            弦 = sqrt(鈎^2 + 股^2)
            円径 = 鈎 + 股 - 弦
            外積 = 鈎*股/2 - π*(円径/2)^2
            @printf("%d %d %g %g %g %g %g\n", j, i, 鈎, 股, 弦, 円径, 外積)
        #else
        #    @printf("%d %d NA NA NA NA NA\n", j, i)
        end
    end
end

    A B 鈎 股 弦 円径 外積
    20000 1 1.73963 2.73963 3.24529 1.23398 1.18706
    30000 1 2.16956 3.16956 3.84098 1.49815 1.67551
    40000 1 2.53117 3.53117 4.34464 1.71769 2.1517
    50000 1 2.84865 3.84865 4.7882 1.90909 2.61923
    60000 1 3.13462 4.13462 5.18854 2.0807 3.07999
    70000 1 3.39665 4.39665 5.55588 2.23742 3.53519
    80000 1 3.6397 4.6397 5.89697 2.38243 3.98566
    90000 1 3.86723 4.86723 6.21654 2.51792 4.43199
    100000 1 4.08176 5.08176 6.51806 2.64546 4.87467
     :
    200000 17 4.09938 21.0994 21.4939 3.70483 32.4669
    190000 18 3.94969 21.9497 22.3022 3.59716 33.1845
    200000 18 4.06385 22.0639 22.435 3.69272 34.1223
    200000 19 4.03036 23.0304 23.3804 3.68036 35.7721

変数間の相関係数は以下のようになる。

A は「鈎」と相関が強い。
B は「股」と相関が強い。

相関係数行列

             A           B          鈎        股        弦      円径      外積
A    1.0000000  0.50000000  0.82693238 0.6276680 0.6762419 0.9899246 0.7061528
B    0.5000000  1.00000000 -0.03699511 0.9873807 0.9732902 0.4963393 0.9586976
鈎   0.8269324 -0.03699511  1.00000000 0.1217277 0.1920133 0.8254176 0.2270238
股   0.6276680  0.98738074  0.12172773 1.0000000 0.9971431 0.6237921 0.9881973
弦   0.6762419  0.97329023  0.19201330 0.9971431 1.0000000 0.6706341 0.9940134
円径 0.9899246  0.49633933  0.82541765 0.6237921 0.6706341 1.0000000 0.6897654
外積 0.7061528  0.95869763  0.22702381 0.9881973 0.9940134 0.6897654 1.0000000

「鈎」を A の二次関数で予測する

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept)  1.497e+00  2.100e-01   7.127 2.17e-11
A            2.337e-05  3.497e-06   6.682 2.63e-10
I(A^2)      -4.006e-11  1.354e-11  -2.960  0.00348

「股」を B の二次関数で予測する

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.107397   0.148959  27.574   <2e-16
B           0.934185   0.042244  22.114   <2e-16
I(B^2)      0.003609   0.002447   1.475    0.142

予測式は次のようになる。

pred_鈎 = 1.497 + 2.337e-05*A - 4.006e-11*A^2
pred_股 = 4.107397 + 0.934185*B - 0.003609*B^2

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

算額(その1667)

2025年03月21日 | Julia

算額(その1667)

栃木県佐野市 星宮神社 天和3年(1683) 現存するもので一番古い算額
山口正義:やまぶき 第 47 号
https://yamabukiwasan.sakura.ne.jp/ymbk47.pdf
山口正義:やまぶき 第 48 号
https://yamabukiwasan.sakura.ne.jp/ymbk48.pdf
キーワード:直角三角形,鈎,股,弦,中鈎(弦を底辺としたときの高さ),方面(正方形の一辺)
#Julia #SymPy #算額 #和算 #数学

直角三角形において,
(1) 和 = (鈎 + 弦)^(1/7)
(2) 相乗 = 方面^3 * 中鈎^(1/4)
の 2 つが与えられたときに,各長さ(鈎,股,弦,中鈎,方面)はいかほどか。

以下は山口による説明

これを解析的に解くのは相当に難しい。

数値的に解こう。与えられる「和」と「相乗」から「鈎」,「股」を求める。
「和」と「相乗」には,「弦」,「方面」,「中鈎」が含まれるが,いずれも「鈎」と「股」で計算されるものである。
「鈎」,「股」の初期値は実験により得られるデータ対の解析に基づいて,「和」と「相乗」の関数として与える。

まず,「和」,「相乗」の連立方程式を記述する。

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

using SymPy

@syms 和, 相乗, 鈎, 股, 弦, 方面, 中鈎
弦 = sqrt(鈎^2 + 股^2)
中鈎 = 鈎*股/弦
方面 = 鈎*股/(鈎 + 股)
eq1 = 和 - ((鈎 + 弦)^(1//7) + (股^9)^(1//5))
eq2 = 相乗 - 方面^3 * 中鈎^(1//4);

「和」,「相乗」から「鈎」,「股」を求める関数を定義する。

「鈎」,「股」の初期値「pred_鈎」,「pred_股」については後述する。

function driver(和, 相乗)
    function H(u)
        (鈎, 股) = u
        return [
            和 - (鈎 + sqrt(股^2 + 鈎^2))^(1/7) - (股^9)^(1/5),  # eq1
            相乗 - 股^3*鈎^3*(股*鈎/sqrt(股^2 + 鈎^2))^(1/4)/(股 + 鈎)^3,  # eq2
        ]
    end;
    pred_鈎 = 1.494191 + 0.331818*相乗 - 0.009864*相乗^2
    pred_股 = 0.6073778 + 0.3156569*和 - 0.0046705*和^2
    iniv = BigFloat[pred_鈎, pred_股]  # 適当な初期値でも収束することが多い
    return nls(H, ini=iniv)
end;

和 = 7, 相乗 = 6 の場合の「鈎」,「股」を求める。

res = driver(7, 6)

    ([4.856731010389481, 2.6049699305730556], true)

出力項目の最後が true ならば,数値解は正常に収束したものであることを示している。

検算は不要であるが,念の為に検算してみる。
まず,「弦」,「中鈎」,「方面」を求める。

鈎 = 4.856731010389481
股 = 2.6049699305730556
弦 = sqrt(鈎^2 + 股^2)
中鈎 = 鈎*股/弦
方面 = 鈎*股/(鈎 + 股)
(弦, 中鈎, 方面)

    (5.511234385005651, 2.2956088163057355, 1.6955434616110827)

次いで,「和」,「相乗」が最初に与えた値と同じになることを確認する。

# 和
((鈎 + 弦)^(1//7) + (股^9)^(1//5))

    7.0

# 相乗
方面^3 * 中鈎^(1//4)

    6.0

「鈎」,「股」の初期値「pred_鈎」,「pred_股」について

以下のようなプログラムで,「和」,「相乗」に対して得られる「鈎」,「股」,「弦」,「中鈎」,「方面」を記録する。

println("和 相乗 鈎 股 弦 中鈎 方面")
for i = 1:20
    for j = i+1:20
        res = driver(j, i)
        if res[2]
            鈎 = res[1][1]
            股 = res[1][2]
            弦 = sqrt(鈎^2 + 股^2)
            中鈎 = 鈎*股/弦
            方面 = 鈎*股/(鈎 + 股)
            @printf("%d %d %g %g %g %g %g\n", j, i, 鈎, 股, 弦, 中鈎, 方面)
        #else
        #    @printf("%d %d NA NA NA NA NA\n", j, i)
        end
    end
end

    和 相乗 鈎 股 弦 中鈎 方面
    3 1 3.78904 1.32471 4.01393 1.25049 0.981545
    4 1 2.19561 1.75111 2.8084 1.36902 0.974165
    5 1 1.8266 2.08603 2.77272 1.37422 0.973857
    6 1 1.65184 2.37886 2.89613 1.35681 0.974892
    7 1 1.54747 2.64416 3.0637 1.33556 0.976176
    8 1 1.47713 2.88926 3.24496 1.31522 0.977425
     :
    19 17 4.42182 4.91842 6.61388 3.2883 2.32846
    20 17 4.30577 5.07205 6.65323 3.28248 2.3288
    19 18 4.57333 4.91771 6.71559 3.34897 2.36964
    20 18 4.44892 5.0714 6.74626 3.34441 2.3699
    20 19 4.59103 5.07076 6.84034 3.40335 2.40949

変数間の相関係数は以下のようになる。

「和」は「股」と相関が強い。
「相乗」は「鈎」と相関が強い。

以下は相関係数行列である。

              和      相乗          鈎         股        弦      中鈎      方面
和    1.00000000 0.4881569 -0.08782835  0.9937689 0.6306035 0.4246172 0.4682552
相乗  0.48815686 1.0000000  0.71425887  0.4793127 0.8203931 0.9639511 0.9671184
鈎   -0.08782835 0.7142589  1.00000000 -0.1157736 0.6964043 0.7449299 0.7503883
股    0.99376890 0.4793127 -0.11577358  1.0000000 0.6031550 0.4265652 0.4664547
弦    0.63060351 0.8203931  0.69640434  0.6031550 1.0000000 0.7885511 0.8339510
中鈎  0.42461720 0.9639511  0.74492991  0.4265652 0.7885511 1.0000000 0.9966916
方面  0.46825522 0.9671184  0.75038826  0.4664547 0.8339510 0.9966916 1.0000000

「股」を「和」の二次関数で予測する

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept)  0.6073778  0.0161933   37.51   <2e-16
和           0.3156569  0.0026444  119.37   <2e-16
I(和^2)     -0.0046705  0.0001006  -46.45   <2e-16

縦軸が予測値 「pred_股」,横軸は「股」の実値

「鈎」を「相乗」の二次関数で予測する

Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept)  1.494191   0.150165   9.950  < 2e-16
相乗         0.331818   0.042257   7.852 3.21e-13
I(相乗^2)   -0.009864   0.002438  -4.045 7.67e-05

縦軸が予測値 「pred_鈎」,横軸は「鈎」の実値

予測式は次のようになる。これらを数値解を求める関数 driver 内で初期値として用いる。

pred_鈎 = 1.494191 + 0.331818*相乗 - 0.009864*相乗^2
pred_股 = 0.6073778 + 0.3156569*和 - 0.0046705*和^2

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

手打 うつ海うどん

2025年03月21日 | さぬきうどん

高松市下田井町 手打 うつ海うどん
シッカリした太麺






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

算額(その1666)

2025年03月20日 | Julia

算額(その1666)

栃木県佐野市 星宮神社 天和3年(1683) 現存するもので一番古い算額
山口正義:やまぶき 第 47 号
https://yamabukiwasan.sakura.ne.jp/ymbk47.pdf
山口正義:やまぶき 第 48 号
https://yamabukiwasan.sakura.ne.jp/ymbk48.pdf
キーワード:長方形,面積,分割
#Julia #SymPy #算額 #和算 #数学

縦 120 間,横 21.5 間の土地がある。幅 3 間の道を付けて三箇所(前,左,右)の面積を等しくするとき,それぞれの縦,横はいかほどか。

注:縦横は当時は今と逆であった。すなわち,現代では横が120 間,縦が 21.5 間で,前,左,右の長方形の縦横も同じである。本問においては,縦,横は当時のとおりとする。

当時は難問として知られていたらしいが,連立方程式を解けばいとも簡単。
前,左,右の面積をそのまま変数名とする
土地の縦,横を a, b
左の縦,横を c, d,道幅を w
として以下の連理方程式を解く。

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

using SymPy

@syms a, b, w, c, d, 左, 右, 前
左 = c*d
右 = (a - c - w)*(d + w)
前 = a*(b - d - w)
eq1 = 左 - 右
eq2 = 左 - 前;

res = solve([eq1, eq2], (c, d))[1];  # 1 of 2

# c 左の縦
c = res[1] |> simplify
c |> println

    -a*b/w + a - w/2 + sqrt(4*a^2*b^2 - 4*a^2*b*w + 4*a^2*w^2 - 4*a*w^3 + w^4)/(2*w)

# d 左の横
d = res[2] |> simplify
d |> println

    (2*a*b - 4*a*w + w^2 + sqrt(4*a^2*b^2 - 4*a^2*b*w + 4*a^2*w^2 - 4*a*w^3 + w^4))/(2*(3*a - w))

c(a => 120, b => 21.5, w => 3).evalf() |> println

    64.9999999999999

d(a => 120, b => 21.5, w => 3).evalf() |> println

    12.0000000000000

c = 65, d = 12
左の縦,横は 65, 12 である。
このとき,
右の縦,横は (a - c - w) = 52, (d + w) = 15
前の縦,横は a = 120, (b - d - w) = 6.5

例題は無数に作れる。もう少しきれいな数値例は
縦 = 24,横 = 17,道幅 = 2 のとき
右 = 10 × 12,前 = 24 × 5,左 = 12 × 10 である。

function draw(a, b, w, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    t = sqrt(4a^2*b^2 - 4a^2*b*w + 4a^2*w^2 - 4a*w^3 + w^4)
    c = -a*b/w + a - w/2 + t/(2w)
    d = (2a*b - 4a*w + w^2 + t)/(2(3a - w))
    @printf("縦 = %g,横 = %g,道幅 = %g のとき\n右 = %g × %g,前 = %g × %g,左 = %g × %g である\n",
        a, b, w,
        a - c - w, d + w,
        a, b - d - w,
        c, d)
    plot(showaxis=false)
    rect(0, 0, a, b, :black)
    rect(0, 0, c, d, :aquamarine, fill=true)
    rect(0, d + w, a, b, :salmon, fill=true)
    rect(c + w, 0, a, d + w, :powderblue, fill=true)
    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, 0, "(0,0)", :black, :center, delta=-delta)
        point(a, b, "(a,b)", :black, :right, :bottom, delta=delta)
        point(c, 0, "(c,0)", :black, :right, delta=-delta)
        point(c + w, 0, "(c+w,0)", :black, :left, delta=-delta)
        point(0, d, "(0,d)", :black, :right, :vcenter)
        point(0, d + w, "(0,d+w)", :black, :right, :vcenter)
        point(c/2, d/2, "左", :black, :center, :vcenter, mark=false)
        point((a + c + w)/2, (d + w)/2, "右", :black, :center, :vcenter, mark=false)
        point(a/2, (b + d + w)/2, "前", :black, :center, :vcenter, mark=false)

        xlims!(-12delta, a + 2delta)
    end
end;

draw(120, 21.5, 3, true)

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

算額(その1665)

2025年03月19日 | Julia

算額(その1665)

和国知恵較(わこくちえくらべ) 享保12年(1727)
和算の里みしま_パンフレット_HP.pdf

https://e-mishima.info/wp-content/uploads/2020/02/74a075f30cb806eef4a9a25c4a71608e.pdf
キーワード:魔方陣の一種,順列
#Julia #SymPy #算額 #和算 #数学

図の「い」から「ち」に 2 〜 9 の数字を当てはめ,2 つの円周に書かれている数を足しても,また,中心の 1 を除くどの直径に書かれている数を足しても,皆同じになるように数を並べなさい。

2 〜 9 の数字の並べ替え(順列)を行い,4 方向の和が等しくなるものを列挙する。

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

using Combinatorics

count = 0
a = 2:9
p = collect(1:16)
for i in 1:factorial(length(a))
    (い, ろ, は, に, ほ, へ, と, ち) = b = nthperm(a, i)
    x = い + ろ + は + に
    if x == ほ + へ + と + ち && x == い + ほ + と + は && x == ろ + へ + ち + に
        count += 1
        mod(count, 48) == 1 && println(b)
    end
end

768 通りもある。

function draw(x)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    pos = [0 2; 2 0; 0 -2; -2 0; 0 1; 1 0; 0 -1; -1 0]
    r = 0.4
    p = plot(showaxis=false)#, fontsize=24)
    delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
    circle(0, 0, 1, :gray80)
    circle(0, 0, 2, :gray80)
    segment(0, -2, 0, 2, :gray80)
    segment(-2, 0, 2, 0, :gray80)
    circle(0, 0, r)
    rotate(0, 2, r, angle=90)
    rotate(0, 1, r, angle=90)
    println(x)
    annotate!(0, 0, text("1", 12, :blue, :center, :vcenter))
    for i = 1:8
        annotate!(pos[i, 1], pos[i, 2], text(string(x[i]), 12, :blue, :center, :vcenter))
    end
    return p
end;

draw([2, 3, 8, 9, 5, 4, 7, 6])

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

算額(その1664)

2025年03月19日 | Julia

算額(その1664)

長野県下高井郡木島平村往郷 水穂神社 寛政12年(1800)
中村信弥「改訂増補 長野県の算額」

http://www.wasan.jp/zoho/zoho.html
キーワード:円2個,直角三角形,斜線2本
#Julia #SymPy #算額 #和算 #数学

直角三角形の中に斜線 2 本を引き,区画された領域に等円 2 個を容れる。鈎,股が与えられたとき,等円の直径はいかほどか。

直角三角形の鈎,股,弦をそのまま変数名とする。
斜線と鈎,股の交点座標を (0, a), (b, 0)
等円の半径と中心座標を r, (r, r), (x, y)
とおき,以下の連立方程式を解く。

術で述べられた式は SymPy で自動的に得ることができないので,SymPy の力を借りながら手作業で方程式を解き,解を簡約化する。

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

using SymPy
@syms 鈎::positive, 股::positive, a::positive, b::positive,
      r::positive, x::positive, y::positive
eq1 = dist2(0, a, 股, 0, r, r, r)
eq2 = dist2(0, a, 股, 0, x, y, r)
eq3 = dist2(0, 鈎, b, 0, r, r, r)
eq4 = dist2(0, 鈎, b, 0, x, y, r)
eq5 = dist2(0, 鈎, 股, 0, x, y, r);
# res = solve([eq1, eq2, eq3, eq4, eq5], (r, x, y, a, b))

eq1, eq3 を解き,a, b を求める。

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

    2*r*(r - 股)/(2*r - 股)

ans_b = solve(eq3, b)[1]
ans_b |> println

    2*r*(r - 鈎)/(2*r - 鈎)

eq2, eq4 に ans_a, ans_b を代入し新たな連立方程式 eq12, eq14 を解き x, y を求める

eq12 = eq2(a => ans_a) |> simplify |> numerator 

    4*r^2*(r - 股)^2*(-r^2 + x^2 - 2*x*股 + 股^2) + 4*r*y*股*(r - 股)*(2*r - 股)*(x - 股) + 股^2*(2*r - 股)^2*(-r^2 + y^2)

eq14 = eq4(b => ans_b) |> simplify |> numerator 

    4*r^2*(r - 鈎)^2*(-r^2 + y^2 - 2*y*鈎 + 鈎^2) + 4*r*x*鈎*(r - 鈎)*(2*r - 鈎)*(y - 鈎) + 鈎^2*(2*r - 鈎)^2*(-r^2 + x^2)

res = solve([eq12, eq14], (x, y))[2];  # 4 組の解のうちの 2 番目のものが適解

# x
ans_x = res[1] |> simplify
ans_x |> println

    r*(-2*r^2 + 4*r*股 - 3*股*鈎)/(2*r^2 - 股*鈎)

# y
ans_y = res[2] |> simplify
ans_y |> println

    r*(-2*r^2 + 4*r*鈎 - 3*股*鈎)/(2*r^2 - 股*鈎)

eq5 の x, y に res[1], res[2] を代入して新たな方程式 eq15 とする。
eq15 は因数分解でき,適解は 4*r^4 - 8*r^3*股 - 8*r^3*鈎 + 12*r^2*股*鈎 - 4*r*股^2*鈎 - 4*r*股*鈎^2 + 股^2*鈎^2 を解くことで得られる。

eq15 = eq5(x => ans_x, y => ans_y) |> simplify |> numerator
eq15 |> factor |> println

    股*鈎*(2*r^2 - 2*r*股 - 2*r*鈎 + 股*鈎)*(4*r^4 - 8*r^3*股 - 8*r^3*鈎 + 12*r^2*股*鈎 - 4*r*股^2*鈎 - 4*r*股*鈎^2 + 股^2*鈎^2)

これを eq25 として r を求めると 4 個の解が得られるが,3 番目のものが適解であるが,式は異常に長いものである。

eq25 = 4*r^4 - 8*r^3*股 - 8*r^3*鈎 + 12*r^2*股*鈎 - 4*r*股^2*鈎 - 4*r*股*鈎^2 + 股^2*鈎^2

res2 = solve(eq25, r);
res2[3](鈎 => 3, 股 => 4).evalf()

    0.522774424948339

eq25 の式中の (鈎 + 股),(鈎*股) を,α,βに置き換え eq35 とする。

@syms α, β
eq35 = 4r^4 - 8α*r^3 + 12β*r^2 - 4α*β*r + β^2

    4*r^4 - 8*r^3*α + 12*r^2*β - 4*r*α*β + β^2

res2 = solve(eq35, r);

eq35 を解いて r を求める。

res2[3]

α,βをもとに戻す。

res2[3](α => 鈎 + 股, β => 鈎*股)

最初の根号の中身は (鈎^2 + 股^2) なので,これを (弦^2) とする。

-2*股*鈎 + (股 + 鈎)^2 |> factor |> println

    股^2 + 鈎^2

2番目の根号の中身を因数分解して,sqrt(鈎^2 + 股^2) を 弦 に置き換え,更に因数分解すると,2弦*(股 + 鈎 + 弦) になる。

t = -2*股*鈎 + (股 + 鈎 + sqrt(-2*股*鈎 + (股 + 鈎)^2))^2 |> factor

    2*(股^2 + 股*sqrt(股^2 + 鈎^2) + 鈎^2 + 鈎*sqrt(股^2 + 鈎^2))

@syms 弦
t(sqrt(股^2 + 鈎^2) => 弦) |> factor

    2*(弦*股 + 弦*鈎 + 股^2 + 鈎^2)

以上により,等円の半径の式は以下のようになる。

ans_r = 股/2 + 鈎/2 + 弦/2 - sqrt(2弦*(股 + 鈎 + 弦))/2

更に術に合わせるために 「弦 + 股 + 鈎」を 「法」とすれば,以下のように術と同じ式になる(術は直径を求めるので,2倍すればよい)。

@syms 法
ans_r(弦 + 股 + 鈎 => 法) |> println

    弦/2 + 股/2 + 鈎/2 - sqrt(2)*sqrt(弦*法)/2

2*ans_r(鈎 => 3, 股 => 4, 弦 => 5).evalf() |> println

    1.04554884989668

術は以下の通りである。

@syms 鈎, 股
弦 = sqrt(鈎^2 + 股^2)
極 = 鈎 + 股 + 弦
等円径 = 極 - sqrt(2極*弦)
等円径(鈎 => 3, 股 => 4).evalf() |>  println

    1.04554884989668

function draw(鈎, 股, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    弦 = sqrt(鈎^2 + 股^2)
    法 = 弦 + 股 + 鈎
    r = 弦/2 + 股/2 + 鈎/2 - sqrt(2)*sqrt(弦*法)/2
    a = 2*r*(r - 股)/(2*r - 股)
    b = 2*r*(r - 鈎)/(2*r - 鈎)
    x = r*(-2*r^2 + 4*r*股 - 3*股*鈎)/(2*r^2 - 股*鈎)
    y = r*(-2*r^2 + 4*r*鈎 - 3*股*鈎)/(2*r^2 - 股*鈎)
    plot([0, 股, 0, 0], [0, 0, 鈎, 0], color=:green, lw=0.5)
    circle(r, r, r)
    circle(x, y, r)
    segment(0, a, 股, 0)
    segment(0, 鈎, b, 0)
    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, r, "等円:r,(r,r)", :red, :center, delta=-delta)
        point(x, y, "等円:r,(r,r)", :red, :center, delta=-delta)
        point(0, 鈎, "鈎", :green, :left, :bottom, delta=delta)
        point(股, 0, "股", :green, :left, :bottom, delta=delta)
        point(0, a, " a", :green, :left, :bottom, delta=delta)
        point(b, 0, "b", :green, :left, :bottom, delta=delta)
    end
end;

draw(3, 4, true)

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

算額(その1663)

2025年03月18日 | Julia

算額(その1663)

三一 武蔵国一宮 氷川社 天保6年(1835)

埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.

山口正義:やまぶき 第 20
https://yamabukiwasan.sakura.ne.jp/ymbk20.pdf

キーワード:旁弧円錐,体積
#Julia #SymPy #算額 #和算 #数学

高さが 4 寸で錐径が 2 寸の旁弧円錐の体積を求めよ。

旁弧円錐とは図のようなもので,O, A, B, C, E は 同一平面上にある。AC は BC を直径とする底面と垂直,A, B, D は O を中心とする円弧上にあり,この円弧は点 A で AC と接する。底面に水平な平面で切り取ると断面は円になる。

旁弧円錐の体積は高さ h における円(たとえば E, D を直径とする円)の面積を A から C まで積分したものになる。

図では薄い円盤の体積の合計を求めるという区分求積法を図解している。

C を原点とする。円弧の半径を R とすれば問題文により A, B, O の座標は (0, 0, 4),(2, 0, 0),(R, 0, 4) で,R = 5 であることがわかる。

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

using SymPy
@syms x::positive, z::positive, R::positive
eq1 = (x - R)^2 + (z - 4)^2 - R^2
eq2 = eq1(x => 2, z => 0)
eq2 |> println

    -R^2 + (2 - R)^2 + 16

ans_R = solve(eq2, R)[1]
ans_R |> println

    5

R に 5 を代入し,x について解くと,高さが z のときの円の直径は 5 - sqrt(-z^2 + 8*z + 9) である。

eq3 = eq1(R => 5)
eq3 |> println

    (x - 5)^2 + (z - 4)^2 - 25

ans_x = solve(eq3, x)[1]  # 1 of 2
ans_x |> println

    5 - sqrt(-z^2 + 8*z + 9)

ans_x を z が 0 〜 4 で積分すればよい。

V = integrate(PI*(ans_x/2)^2, (z, 0, 4))

V.evalf() |> println

    2.16358691328436

求める体積は 2.16358691328436 である。

function draw(h, r)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    p1 = plot(xlabel="x-axis", ylabel="z-axis")
    θ = atand(4, 3)
    circle(5, 4, 5, beginangle=180, endangle=180+θ)
    for z in range(0, h, 10)
        segment(0, z, 5 - sqrt(-z^2 + 8*z + 9), z, :blue, lw=3)
    end
    point(5, 4, "(5,4)")
    p2 = plot(xlabel="x-axis", ylabel="y-axis")
    for z in range(0, h, 10)
        r = (5 - sqrt(-z^2 + 8*z + 9))/2
        circle(r, 0, r, :blue, lw=3)
    end
    plot(p1, p2)
end;

draw(4, 2/2)

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

手打ちうどん ひさ枝

2025年03月18日 | さぬきうどん

高松市郷東町 手打ちうどん ひさ枝
特徴のあるハチマキ姿の名物店主がちくわ天を「プレゼント」してくれた(上),下は鶏の竜田揚げ(でかい)


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

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

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