裏 RjpWiki

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

算額(その455)

2023年10月09日 | Julia

算額(その455)

長野県中野市 田上観音堂 文化6年(1809)

中村信弥「改訂増補 長野県の算額」(p.89)
http://www.wasan.jp/zoho/zoho.html
県内の算額1

鈎股弦内に2個の正方形と,大円,中円,小円が1個ずつ入っている。大円,中円,小円の直径がそれぞれ 280,210,168 寸のとき,弦の長さを求めよ。

結論から先にいうと,小円の直径が 168 寸では,算額に示されているような図が得られない。
そこで,小円の直径は未知ということで解を求める。

補助として,図のように勾股弦に内接する半径 r の円を加える。
大円,中円,小円の半径を r1, r2, r3 として,以下の連立方程式を解く。
なお,一度にすべての解を求めるのは無理なので,鈎,股,弦,r, x2 を先に求め,次いで r3, x1, y1 を求める。

include("julia-source.txt")

using SymPy

@syms 鈎::positive, 股::positive, 弦::positive,
     r::positive,
     x1::positive, x2::positive, y1::positive,
     r1::positive, r2::positive, r3::positive;

(r1, r2) = (280, 210) .// 2
y2 = x2

eq0 = 鈎 + 股 - 弦 - 2r
eq1 = 鈎^2 + 股^2 - 弦^2
eq2 = r*y2 - 鈎*r1
eq3 = r*x2 - 股*r2
eq4 = y2/(股 - x2) - 鈎/股;
res1 = solve([eq0, eq1, eq2, eq3, eq4], (鈎, 股, 弦, r, x2))

   1-element Vector{NTuple{5, Sym}}:
    (735, 980, 1225, 245, 420)

#@syms 鈎::positive, 股::positive, 弦::positive,
     r::positive,
     x1::positive, x2::positive, y1::positive,
     r1::positive, r2::positive, r3::positive;

#(r1, r2) = (280, 210) .// 2
#y2 = x2
(鈎, 股, 弦, r, x2) = (735, 980, 1225, 245, 420)

#eq5 = distance(0, y1, x1, 0, r3, r3) - r3^2
eq5 = sqrt(x1^2 + y1^2)/弦 - r3/r

eq6 = distance(0, 鈎, 股, 0, x1, 0) - (x1^2 + y1^2);
eq7 = y1/x1 - 鈎/股

res2 = solve([eq5, eq6, eq7], (r3, x1, y1))

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (79.4594594594595, 317.837837837838, 238.378378378378)

res = solve([eq0, eq1, eq2, eq3, eq4, eq5, eq6, eq7], (鈎, 股, 弦, r, x2, r3, x1, y1))

   1-element Vector{NTuple{8, Sym}}:
    (735.000000000000, 980.000000000000, 1225.00000000000, 245.000000000000, 420.000000000000, 79.4594594594595, 317.837837837838, 238.378378378378)

   鈎 = 735;  股 = 980;  弦 = 1225;  x1 = 317.838;  x2 = 420;  y1 = 238.378
   r3 = 79.4595;  小円の直径 = 158.919
   傾斜している正方形の一辺の長さ = 397.297
   正立している正方形の一辺の長さ = 420

弦の長さは 1225 寸である。算額の答,術,および中村による現代解も 1295 寸を得ている。この解は,小円の直径が 168 寸であるとして導き出されている。しかし,最初に述べたように直径が 168 寸では正方形が弦と接しない。一般的に,算額の解法では目的とする一つのパラメータ(値)だけを求めるので,他のパラメータがどうなるかについては無頓着なので,矛盾に気づかないのであろう。
いずれにしろ,小円の直径は 2✕79.4594594594595 = 158.918918918919 である。そうすれば,図形の相対位置関係は算額の問にある図と同等になる。

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = (280, 210) .// 2
   (鈎, 股, 弦, r, x2) = res1[1]  # (735, 980, 1225, 245, 420)
   (r3, x1, y1) = res2[1]  # (79.4594594594595, 317.837837837838, 238.378378378378)
   #(鈎, 股, 弦, r, x2, r3, x1, y1) = res[1]
   y2 = x2
   @printf("鈎 = %g;  股 = %g;  弦 = %g;  x1 = %g;  x2 = %g;  y1 = %g\n", 鈎, 股, 弦, x1, x2, y1)
   @printf("r3 = %g;  小円の直径 = %g\n", r3, 2r3)
   @printf("傾斜している正方形の一辺の長さ = %g\n", sqrt(distance(0, 鈎, 股, 0, 0, y1)))
   @printf("正立している正方形の一辺の長さ = %g\n", x2)
   plot([0, 股, 0, 0],[0, 0, 鈎, 0], color=:gray, lw=0.5)
   circle(r, r, r, :gray)
   circle(x2 + r1, r1, r1, :blue)
   circle(r2, y2 + r2, r2, :red)
   circle(r3, r3, r3, :green)
   segment(0, y2, x2, y2)
   segment(x2, 0, x2, y2)
   l = sqrt(x1^2 + y1^2)
   plot!([x1, l*鈎/弦 + x1, l*鈎/弦, 0, x1], [0, l*股/弦, l*股/弦 + y1, y1, 0], color=:orange, lw=0.5)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(0, 鈎, " 鈎", :black, :left, :bottom)
       point(股, 0, " 股", :black , :left, :bottom, delta=delta/2)
       point(x2 + r1, r1, " 大円:r1,(x2+r1,r1)", :black, :left, :bottom, delta=delta)
       point(r2, y2 + r2, "        中円:r2,(r2,y2+r2)", :black, :center, :bottom, delta=5delta)
       point(r3, r3, " 小円:r3,(r3,r3)", :black, :left, :bottom, delta=delta)
       point(x1, 0, " x1", :black, :left, :bottom, delta=delta/2)
       point(x2, 0, " x2", :black, :left, :bottom, delta=delta/2)
       point(0, y1, " y1", :black, :left, :bottom, delta=delta/2)
       point(0, y2, " y2", :black, :left, :bottom, delta=delta/2)
       point(l*鈎/弦, l*股/弦 + y1, " (l*鈎/弦,l*股/弦+y1)", :black, :left, :vcenter)
       point(l*鈎/弦 + x1, l*股/弦, "  (l*鈎/弦+x1,l*股/弦)\n   l=sqrt(x1^2+y1^2)", :black, :left, :vcenter)

       hline!([0], color=:gray, lw=0.5)
       vline!([0], color=:gray, lw=0.5)
   else
      plot!(showaxis=false)
   end
end;

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

モンティ・ホール問題のシミュレーション -- 2

2023年10月09日 | Julia

R で書いたシミュレーションを Julia に翻訳した。

https://blog.goo.ne.jp/r-de-r/e/9dbe50704d057552798b9cfbeb0cf982

using Random
using Statistics

# モンティ・ホール問題のシミュレーション

function MontyHallProblem(ChangeAnswer=true)
    door = shuffle(["景品", "ヤギ", "ヤギ"])  # セット
    Player = rand(1:3)[1]  # どれかを選ぶ
    Monty = setdiff(setdiff(1:3, Player), indexin(["景品"], door))[1]  # 必ずヤギのドアを開ける
    if ChangeAnswer  # 最初の答を変えるなら
        Player = setdiff(setdiff(1:3, Player), Monty)[1]
    end
    return door[Player] == "景品"  # 当たったかどうか結果を返す
end

最初の回答を変える場合


@time mean(MontyHallProblem(true) for _ in 1:10000000) |> println

    0.6664597
     12.091644 seconds (320.48 M allocations: 28.194 GiB, 12.49% gc time, 1.82% compilation time)


最初の回答を変えない場合


@time mean(MontyHallProblem(false) for _ in 1:10000000) |> println

    0.3332185
      8.299969 seconds (200.03 M allocations: 18.032 GiB, 12.26% gc time, 0.16% compilation time)

 

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

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

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