裏 RjpWiki

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

Juliaにおけるデータのクリーニングと前処理のベストプラクティス

2023年09月25日 | Julia
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Juliaでのデータのシリアライゼーションと逆シリアライゼーション

2023年09月25日 | Julia
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Pandasを使用したデータのクリーニングと前処理のベストプラクティス

2023年09月25日 | Python
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Juliaでの異なる形式のデータのエクスポートとインポート方法

2023年09月25日 | Julia
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Juliaを使ったデータの視覚化の基本

2023年09月24日 | Julia

データの視覚化の基本: Juliaを活用した効果的なデータ可視化

データの視覚化は,データ分析と理解において非常に重要な役割を果たす。
Juliaという高性能なプログラミング言語を使用して,データの視覚化を行う基本的な方法について紹介する。
Juliaは高速で柔軟な言語であり,データの視覚化にはさまざまなツールやライブラリが利用できる。
以下に示す例は簡単なものであるが,個々の関数は多くの機能を持っている。
それぞれの関数のオンラインヘルプは `? scatter` のようにすれば得られる。

Juliaを使ったデータの視覚化の基本

1. Juliaのインストールとセットアップ

データの視覚化を始める前に,Juliaをインストールし,必要なパッケージをセットアップする必要がある。
Juliaの公式ウェブサイト(https://julialang.org/)から最新バージョンをダウンロードし,インストールする。
次に,データ可視化に使用するパッケージをインストールする。主要なパッケージとして,Plots.jlやGR.jlがある。
以下の例では,日本語(漢字かな)を使用するので pyplot を使っているが,そもそも日本語を使うための準備も必要である。

2. データの読み込み

データの視覚化には,まずデータを読み込む必要がある。
CSV.jlやDataFrames.jlなどのパッケージを使用して,データをJuliaに読み込む。
データは通常,表形式で保存され,各列が変数を表す。
以下の例では一つの変数データがベクトルに収められている場合の使用法を述べているが,通常はCSVファイルからデータフレームに読み込みデータ列を指定してグラフを描く。

3. 散布図の作成

散布図は,データのパターンや相関関係を視覚化するための基本的なツールである。
Plots.jlを使用して,データをプロットし,散布図を作成する。
例えば,以下のコードで簡単に散布図を描画できる。

using Plots

# データの読み込み
x = randn(1000)
y = randn(1000)

# 散布図の作成
pyplot(size=(400, 400), label="", fontfamily="IPAMincho")
scatter(x, y, xlabel="X軸ラベル", ylabel="Y軸ラベル", title="散布図")

    

4. ヒストグラムの作成

ヒストグラムは,データの分布を理解するのに役立つ。
データの範囲を階級に分割し,各階級内のデータの頻度を表示する。
Plots.jlを使用して,ヒストグラムを簡単に作成できる。

using Plots

# データの読み込み
x = randn(1000)  # ランダムなデータ

# ヒストグラムの作成
histogram(x, xlabel="値", ylabel="頻度", title="ヒストグラム")

    

5. 折れ線グラフの作成

データの時間変化や連続データの可視化には,折れ線グラフが役立つ。
Plots.jlを使用して,折れ線グラフを描画する。

using Plots

# データの作成
x = 1:10
y = [1, 3, 2, 4, 6, 5, 8, 7, 9, 10]

# 折れ線グラフの作成
plot(x, y, xlabel="X軸ラベル", ylabel="Y軸ラベル", title="折れ線グラフ")

 

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

算額(その442)

2023年09月22日 | Julia

算額(その442)

武州豐嶋郡王子稲荷社 寛政元年己酉3月(1624)
關流神谷定令門人 東都湯嶋天神御徒町 大川三之助久菶

藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf

長方形内に甲円 2 個,乙円 1 個,丙円 2 個があり,長方形に内接し,互いに外接している。
長方形の短辺が 451 寸のとき,長辺の長さはいかほどか。

長方形の下辺の中点を原点とし,長方形の短辺,長辺をそれぞれ a, 2b とおく。
図形の右半分を対象とする。
甲円の半径,中心座標を r1, (b - r1, a - r1) ただし b = 2r1
乙円の半径,中心座標を r2, (0, r2)
丙円の半径,中心座標を r3, (b - r3, r3)
として,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive,
     r1::positive, r2::positive, r3::positive;
@syms a, b, r1, r2, r3
b = 2r1
eq1 = (b - r1)^2 + (a - r1 - r2)^2 - (r1 + r2)^2
eq2 = (r1 - r3)^2 + (a - r1 - r3)^2 - (r1 + r3)^2
eq3 = (b - r3)^2 + (r2 - r3)^2 - (r2 + r3)^2
res = solve([eq1, eq2, eq3], (r1, r2, r3))

   6-element Vector{Tuple{Sym, Sym, Sym}}:
    (a*(3 - 2*sqrt(2)), 2*a*(3 - 2*sqrt(2)), 2*a)
    (a*(2*sqrt(2) + 3), 2*a*(2*sqrt(2) + 3), 2*a)
    (a*(14*sqrt(2) + 2*sqrt(82 + 80*sqrt(2)) + 105 + 13*sqrt(41 + 40*sqrt(2)))/(14*(-3 + 4*sqrt(2) + sqrt(41 + 40*sqrt(2)))), a*(-301 - 17*sqrt(41 + 40*sqrt(2)) + 20*sqrt(82 + 80*sqrt(2)) + 224*sqrt(2))/(56*(-3 + 4*sqrt(2) + sqrt(41 + 40*sqrt(2)))), a*(5/4 + sqrt(2) + sqrt(41/4 + 10*sqrt(2))/2))
    (a*(-105 + 14*sqrt(2) - 13*sqrt(41 - 40*sqrt(2)) + 2*sqrt(82 - 80*sqrt(2)))/(14*(3 + 4*sqrt(2) - sqrt(41 - 40*sqrt(2)))), a*(301 + 224*sqrt(2) + 17*sqrt(41 - 40*sqrt(2)) + 20*sqrt(82 - 80*sqrt(2)))/(56*(3 + 4*sqrt(2) - sqrt(41 - 40*sqrt(2)))), a*(-sqrt(2) + 5/4 + sqrt(41/4 - 10*sqrt(2))/2))
    (a*(-105 + 14*sqrt(2) - 2*sqrt(82 - 80*sqrt(2)) + 13*sqrt(41 - 40*sqrt(2)))/(14*(3 + 4*sqrt(2) + sqrt(41 - 40*sqrt(2)))), a*(301 + 224*sqrt(2) - 20*sqrt(82 - 80*sqrt(2)) - 17*sqrt(41 - 40*sqrt(2)))/(56*(3 + 4*sqrt(2) + sqrt(41 - 40*sqrt(2)))), a*(-sqrt(2) + 5/4 - sqrt(41/4 - 10*sqrt(2))/2))
    (a*(-105 - 14*sqrt(2) + 2*sqrt(82 + 80*sqrt(2)) + 13*sqrt(41 + 40*sqrt(2)))/(14*(-4*sqrt(2) + 3 + sqrt(41 + 40*sqrt(2)))), a*(-224*sqrt(2) - 17*sqrt(41 + 40*sqrt(2)) + 20*sqrt(82 + 80*sqrt(2)) + 301)/(56*(-4*sqrt(2) + 3 + sqrt(41 + 40*sqrt(2)))), a*(-sqrt(41/4 + 10*sqrt(2))/2 + 5/4 + sqrt(2)))

r1 > r2 > r3 なので,6 番目の組が適解である。
r1, r2, r3 は以下のように簡約化される。

res[6][1] |> simplify |> apart |> simplify |> println
res[6][2] |> simplify |> apart |> simplify |> println
res[6][3] |> simplify |> apart |> simplify |> println

   a*(-2*sqrt(82 + 80*sqrt(2)) + 7 + sqrt(41 + 40*sqrt(2)) + 14*sqrt(2))/28
   a*(-11*sqrt(41 + 40*sqrt(2)) - 28*sqrt(2) + 63 + 8*sqrt(82 + 80*sqrt(2)))/112
   a*(-sqrt(41 + 40*sqrt(2)) + 5 + 4*sqrt(2))/4

長方形の長辺の長さは 4r1 = 4a*(-2*sqrt(82 + 80*sqrt(2)) + 7 + sqrt(41 + 40*sqrt(2)) + 14*sqrt(2))/28

短辺の長さ = a = 451 寸のとき,長辺の長さは約 563 寸である。

a = 451
4a*(-2*sqrt(82 + 80*sqrt(2)) + 7 + sqrt(41 + 40*sqrt(2)) + 14*sqrt(2))/28

   563.0009311237039

ついでに,r1, r2, r3 はそれぞれ 140.75023278092598, 106.71276946728344, 87.85200899283763 である。

a*(-2*sqrt(82 + 80*sqrt(2)) + 7 + sqrt(41 + 40*sqrt(2)) + 14*sqrt(2))/28 |> println
a*(-11*sqrt(41 + 40*sqrt(2)) - 28*sqrt(2) + 63 + 8*sqrt(82 + 80*sqrt(2)))/112 |> println
a*(-sqrt(41 + 40*sqrt(2)) + 5 + 4*sqrt(2))/4 |> println

   140.75023278092598
   106.71276946728344
   87.85200899283763

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 451
   temp = sqrt(41 + 40*sqrt(2))
   r1 = a*((1 - 2*√2)temp + 7 + 14*sqrt(2))/28
   r2 = a*((8*√2 - 11)temp - 28*sqrt(2) + 63)/112
   r3 = a*(-temp + 5 + 4*sqrt(2))/4
   b = 2r1
   @printf("a = %g;  r1 = %g;  r2 = %g;  r3 = %g\n", a, r1, r2, r3)
   @printf("長方形の長辺の長さ = %g\n", 4r1)
   plot([b, b, -b, -b, 2r1], [0, a, a, 0, 0], color=:black, lw=0.5)
   circle(r1, a - r1, r1, :green)
   circle(-r1, a - r1, r1, :green)
   circle(0, r2, r2, :magenta)
   circle(b - r3, r3, r3, :blue)
   circle(-b + r3, r3, r3, :blue)
   if more == true
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(b - r1, a - r1, "甲円:r1,(b-r1,a-r1)", :green, :center, :top, delta=-delta)
       point(0, r2, "乙円:r2,(0,r2) ", :magenta, :center, :top, delta=-delta)
       point(b - r3, r3, "丙円:r3,(b-r3,r3) ", :blue, :center, :top, delta=-delta)
       point(b, a, "(b,a)", :black, :right, :bottom, delta=delta)
       hline!([0], color=:gray, lw=0.5)
       vline!([0], color=:gray, lw=0.5)
   else
      plot!(showaxis=false)
   end
end;

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

算額(その441)

2023年09月21日 | Julia

算額(その441)

東都下谷稲荷社 寛政元年己酉3月(1624)
黒川喜兵衛盛榮

藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf

円弧の中に甲円 1 個,乙円 2 個,丙円 2 個があり,それぞれの円は隣同士は外接し,円弧を構成する外円には内接し,弦に接している。
甲円,丙円の直径がそれぞれ 12 寸,3 寸のとき,乙円の直径はいかほどか。

以下のように記号を定め方程式を解く。

外円の中心を原点とする。
外円の半径,中心座標を r0, (0, 0)
甲円の半径,中心座標を r1, (0, a + r1)
乙円の半径,中心座標を r2, (x2, a + r2)
丙円の半径,中心座標を r3, (x3, a + r3)
弦が y 軸と交わる座標を (0, a)
として,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms r0::positive, a::positive,
     r1::positive, r2::positive, x2::positive,
     r3::positive, x3::positive;

eq1 = x2^2 + (r1 - r2)^2 - (r1 + r2)^2
eq2 = (x2 - x3)^2 + (r2 - r3)^2 - (r2 + r3)^2
eq3 = x2^2 + (a + r2)^2 - (r0 -r2)^2
eq4 = x3^2 + (a + r3)^2 - (r0 -r3)^2
eq5 = a + 2r1 - r0

res = solve([eq1, eq2, eq3, eq4, eq5], (a, r0, r2, x2, x3))

   2-element Vector{NTuple{5, Sym}}:
    ((-2*r1^(3/2)*sqrt(r3) - r1^2 + 3*r1*r3)/(r1 - r3), (-2*r1^(3/2)*sqrt(r3) + r1^2 + r1*r3)/(r1 - r3), 2*(-r1^(7/2)*sqrt(r3) + 2*r1^(5/2)*r3^(3/2) - r1^(3/2)*r3^(5/2) - r1^3*r3 + 2*r1^2*r3^2 - r1*r3^3)/(r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3), -2*sqrt(2)*r1^(3/2)*sqrt(r3)/sqrt(-r1^(3/2)*sqrt(r3) + r1*r3), sqrt(-8*r1^(3/2)*sqrt(r3) + 8*r1*r3))
    ((2*r1^(3/2)*sqrt(r3) - r1^2 + 3*r1*r3)/(r1 - r3), (2*r1^(3/2)*sqrt(r3) + r1^2 + r1*r3)/(r1 - r3), 2*(r1^(7/2)*sqrt(r3) - 2*r1^(5/2)*r3^(3/2) + r1^(3/2)*r3^(5/2) - r1^3*r3 + 2*r1^2*r3^2 - r1*r3^3)/(r1^3 - 3*r1^2*r3 + 3*r1*r3^2 - r3^3), 2*sqrt(2)*r1^(3/2)*sqrt(r3)/sqrt(r1^(3/2)*sqrt(r3) + r1*r3), sqrt(8*r1^(3/2)*sqrt(r3) + 8*r1*r3))

2 番めのものが適解である。

names = ("a", "r0", "r2", "x2", "x3")
for (i, name) in enumerate(names)
   @printf("%s = %g;  ", name, res[2][i](r1 => 6, r3 => 1.5).evalf())
end

   a = 6;  r0 = 18;  r2 = 4;  x2 = 9.79796;  x3 = 14.6969;  

甲円,丙円の直径が 12 寸,3 寸のとき,乙円の直径は 8 寸である。

using Plots

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

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

算額(その440)

2023年09月21日 | Julia

算額(その440)

東都下谷摩利支天堂 天明8年戊申3月(1788)
東都浅草新堀端住 三浦伴次郎成喜

藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf

求めるものが小頭か大頭かの違いだけで,算額(その185)と同じ問題である。プログラミングスタイルを最近のものに変えた。

等脚台形の隔斜(対角線)で区切られた領域に甲,乙,丙の円を入れる。甲円の直径が 100 寸,乙円の直径が 28 寸,丙円の直径が 45 寸のとき,大頭(台形の下底)はいかほどか。

以下のように記号を定め方程式を解く。
台形の右下隅 A,右上隅 b, の座標をそれぞれ (a, 0),(b, y) と置く。
甲円,乙円,丙円の半径をそれぞれ,r1,r2,r3 とする。
甲円,乙円,丙円の中心から隔斜(対角線)までの距離が円の半径に等しいという連立方程式を解く。

include("julia-source.txt");

using SymPy

@syms a::positive, b::positive, x1::positive, y1::positive, y::positive,
     r1::positive, r2::positive, r3::positive;

eq1 = distance(b, y, a, 0, x1, y1) - r3^2
eq2 = distance(-b, y, a, 0, x1, y1) - r3^2
eq3 = distance(-a, 0, b, y, x1, y1) - r3^2
eq4 = distance(-a, 0, b, y, 0, y - r2) - r2^2
eq5 = distance(-b, y, a, 0, 0, r1) - r1^2;

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 v, r.f_converged
end;

function H(u)
   (a, b, x1, y1, y) = u
   return [
       -r3^2 + (x1 - (a^2*x1 - 2*a*b*x1 + a*y^2 - a*y*y1 + b^2*x1 + b*y*y1)/(a^2 - 2*a*b + b^2 + y^2))^2 + (-y*(a^2 - a*b - a*x1 + b*x1 + y*y1)/(a^2 - 2*a*b + b^2 + y^2) + y1)^2,  # eq1
       -r3^2 + (x1 - (a^2*x1 + 2*a*b*x1 + a*y^2 - a*y*y1 + b^2*x1 - b*y*y1)/(a^2 + 2*a*b + b^2 + y^2))^2 + (-y*(a^2 + a*b - a*x1 - b*x1 + y*y1)/(a^2 + 2*a*b + b^2 + y^2) + y1)^2,  # eq2
       -r3^2 + (x1 - (x1*(a^2 + 2*a*b + b^2 + y^2) - y*(a*y - a*y1 - b*y1 + x1*y))/(a^2 + 2*a*b + b^2 + y^2))^2 + (-y*(a^2 + a*b + a*x1 + b*x1 + y*y1)/(a^2 + 2*a*b + b^2 + y^2) + y1)^2,  # eq3
       -r2^2 + y^2*(-a*r2 - b*r2 + b*y)^2/(a^2 + 2*a*b + b^2 + y^2)^2 + (-r2 - y*(a^2 + a*b - r2*y + y^2)/(a^2 + 2*a*b + b^2 + y^2) + y)^2,  # eq4
       -r1^2 + y^2*(-a*r1 + a*y - b*r1)^2/(a^2 + 2*a*b + b^2 + y^2)^2 + (r1 - y*(a^2 + a*b + r1*y)/(a^2 + 2*a*b + b^2 + y^2))^2,  # eq5
   ]
end;

(r1, r2, r3) =(100, 28, 45) ./ 2
iniv = [big"151.0", 44, 39, 112, 144]
res = nls(H, ini=iniv)
names = ("a", "b", "x1", "y1", "y")
if res[2]
   for (name, x) in zip(names, res[1])
       @printf("%s = %g;  ", name, round(Float64(x), digits=6))
   end
   println()
else
   println("収束していない")
end

   a = 150;  b = 42;  x1 = 37.5;  y1 = 112.5;  y = 144;  

大頭の長さは 2a = 300(寸)である。

using Plots

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2, r3) =(100, 28, 45) ./ 2
   (a, b, x1, y1, y) = res[1]
   @printf("r1 = %g;  r2 = %g;  r3 = %g\n", r1, r2, r3)
   @printf("a = %g; b = %g;  x1 = %g; y1 = %g; y = %g\n", a, b, x1, y1, y)
   plot([a, b, -b, -a, a], [0, y, y, 0, 0], color=:orange, lw=0.5)
   circle(0, r1, r1, :green)
   circle(x1, y1, r3, :blue)
   circle(-x1, y1, r3, :blue)
   circle(0, y - r2, r2, :red)
   segment(-b, y, a, 0, :orange)
   segment(-a, 0, b, y, :orange)
   if more == true
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(0, r1, " 甲円:r1,(0,r1)", :black, :left, :vcenter)
       point(0, y - r2, " 乙円:r2,(0,y-r2)", :black, :left, :vcenter)
       point(x1, y1, " 丙円:r3,(x1,y1,r3)", :black, :left, :vcenter)
       point(b, y, " B(b,y)", :black, :left, :bottom, delta=delta/2)
       point(a, 0, " A(a,0)", :black, :left, :bottom, delta=delta/2)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
      plot!(showaxis=false)
   end
end;

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

算額(その439)

2023年09月21日 | Julia

算額(その439)

東都本郷真光寺天満宮 天明7年丁未11月(1787)
東都湯嶋御徒町 池田重次郎教政

藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf

外円の一部分である円弧内に,大中小の 5 個の円が入っている。大円と小円は弦に接している。
弦の長さが 8 寸,小円の直径が 1 寸のとき,矢(弦と円の距離,図では r0 - a)の長さはいかほどか。

外円の半径と中心座標を r0, (0, 0)
大円の半径と中心座標を r1, (x1, a + r1)
中円の半径と中心座標を r2, (0, r0 - r2)
小円の半径と中心座標を r3, (r3, a + r3)
弦と y 軸の交点座標を (0, a)
として以下の連立方程式の解を求める。

include("julia-source.txt");

using SymPy
@syms r0::positive,
     r1::positive, x1::positive,
     r2::positive, r3::positive,
     弦::positive, a::positive;

eq1 = x1^2 + (a + r1)^2 - (r0 - r1)^2
eq2 = (x1 - r3)^2 + (r1 - r3)^2 - (r1 + r3)^2
eq3 = x1^2 + (r0 - r2 - a - r1)^2 - (r1 + r2)^2
eq4 = r3^2 + (r0 - r2 - a - r3)^2 - (r2 + r3)^2 
eq5 = (r0^2 - (弦/2)^2) - a^2;

res = solve([eq1, eq2, eq3, eq4, eq5], (r0, r1, x1, r2, a))

   2-element Vector{NTuple{5, Sym}}:
    ((1536*r3^6 + 288*r3^4*弦^2 - 64*r3^4*弦*sqrt(16*r3^2 + 5*弦^2) - 84*r3^2*弦^4 + 52*r3^2*弦^3*sqrt(16*r3^2 + 5*弦^2) + 3*弦^6 - 弦^5*sqrt(16*r3^2 + 5*弦^2))/(32*r3*(144*r3^4 - 40*r3^2*弦^2 + 弦^4)), r3*(128*r3^4 - 8*r3^2*弦^2 - 16*r3^2*弦*sqrt(16*r3^2 + 5*弦^2) + 3*弦^4 + 弦^3*sqrt(16*r3^2 + 5*弦^2))/(2*(256*r3^4 + 32*r3^2*弦^2 + 弦^4)), r3*弦*(2*弦 + sqrt(16*r3^2 + 5*弦^2))/(16*r3^2 + 弦^2), r3*(96*r3^4 + 44*r3^2*弦^2 + 20*r3^2*弦*sqrt(16*r3^2 + 5*弦^2) + 7*弦^4 + 3*弦^3*sqrt(16*r3^2 + 5*弦^2))/(8*(144*r3^4 - 40*r3^2*弦^2 + 弦^4)), (-1536*r3^6 + 1440*r3^4*弦^2 + 64*r3^4*弦*sqrt(16*r3^2 + 5*弦^2) - 180*r3^2*弦^4 + 20*r3^2*弦^3*sqrt(16*r3^2 + 5*弦^2) + 3*弦^6 - 弦^5*sqrt(16*r3^2 + 5*弦^2))/(4608*r3^5 - 1280*r3^3*弦^2 + 32*r3*弦^4))
    ((1536*r3^6 + 288*r3^4*弦^2 + 64*r3^4*弦*sqrt(16*r3^2 + 5*弦^2) - 84*r3^2*弦^4 - 52*r3^2*弦^3*sqrt(16*r3^2 + 5*弦^2) + 3*弦^6 + 弦^5*sqrt(16*r3^2 + 5*弦^2))/(32*r3*(144*r3^4 - 40*r3^2*弦^2 + 弦^4)), r3*(128*r3^4 - 8*r3^2*弦^2 + 16*r3^2*弦*sqrt(16*r3^2 + 5*弦^2) + 3*弦^4 - 弦^3*sqrt(16*r3^2 + 5*弦^2))/(2*(256*r3^4 + 32*r3^2*弦^2 + 弦^4)), r3*弦*(2*弦 - sqrt(16*r3^2 + 5*弦^2))/(16*r3^2 + 弦^2), r3*(96*r3^4 + 44*r3^2*弦^2 - 20*r3^2*弦*sqrt(16*r3^2 + 5*弦^2) + 7*弦^4 - 3*弦^3*sqrt(16*r3^2 + 5*弦^2))/(8*(144*r3^4 - 40*r3^2*弦^2 + 弦^4)), (-1536*r3^6 + 1440*r3^4*弦^2 - 64*r3^4*弦*sqrt(16*r3^2 + 5*弦^2) - 180*r3^2*弦^4 - 20*r3^2*弦^3*sqrt(16*r3^2 + 5*弦^2) + 3*弦^6 + 弦^5*sqrt(16*r3^2 + 5*弦^2))/(4608*r3^5 - 1280*r3^3*弦^2 + 32*r3*弦^4))

最初の組が適解である。

矢の長さは 2*r3*(3*r3^2 - 4*sqrt(r3^2 + 20) - 24)/(9*r3^2 - 16)

res[1][1] - res[1][5] |> simplify |> println

   r3*(24*r3^2 - 3*弦^2 - 弦*sqrt(16*r3^2 + 5*弦^2))/(36*r3^2 - 弦^2)

弦の長さが 8 寸,小円の直径が 1 寸 のとき,矢の長さは 3 寸である。

(r3, 弦) = (1/2, 8)
r3*(24*r3^2 - 3*弦^2 - 弦*sqrt(16*r3^2 + 5*弦^2))/(36*r3^2 - 弦^2)

   3.0

   r0 = 4.16667;  r1 = 1.125;  x1 = 2;  r2 = 1.04167;  a = 1.16667
   矢 = 3

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r3, 弦) = (1/2, 8)
   (r0, r1, x1, r2, a) = ((1536*r3^6 + 288*r3^4*弦^2 - 64*r3^4*弦*sqrt(16*r3^2 + 5*弦^2) - 84*r3^2*弦^4 + 52*r3^2*弦^3*sqrt(16*r3^2 + 5*弦^2) + 3*弦^6 - 弦^5*sqrt(16*r3^2 + 5*弦^2))/(32*r3*(144*r3^4 - 40*r3^2*弦^2 + 弦^4)),
       r3*(128*r3^4 - 8*r3^2*弦^2 - 16*r3^2*弦*sqrt(16*r3^2 + 5*弦^2) + 3*弦^4 + 弦^3*sqrt(16*r3^2 + 5*弦^2))/(2*(256*r3^4 + 32*r3^2*弦^2 + 弦^4)),
       r3*弦*(2*弦 + sqrt(16*r3^2 + 5*弦^2))/(16*r3^2 + 弦^2),
       r3*(96*r3^4 + 44*r3^2*弦^2 + 20*r3^2*弦*sqrt(16*r3^2 + 5*弦^2) + 7*弦^4 + 3*弦^3*sqrt(16*r3^2 + 5*弦^2))/(8*(144*r3^4 - 40*r3^2*弦^2 + 弦^4)),
       (-1536*r3^6 + 1440*r3^4*弦^2 + 64*r3^4*弦*sqrt(16*r3^2 + 5*弦^2) - 180*r3^2*弦^4 + 20*r3^2*弦^3*sqrt(16*r3^2 + 5*弦^2) + 3*弦^6 - 弦^5*sqrt(16*r3^2 + 5*弦^2))/(4608*r3^5 - 1280*r3^3*弦^2 + 32*r3*弦^4))
   @printf("r0 = %g;  r1 = %g;  x1 = %g;  r2 = %g;  a = %g\n",
           r0, r1, x1, r2, a)
   @printf("矢 = %g\n", r0 - a)
   plot()
   circle(0, 0, r0, :gray)
   circle(x1, a + r1, r1)
   circle(-x1, a + r1, r1)
   circle(0, r0 - r2, r2, :blue)
   circle(r3, a + r3, r3, :orange)
   circle(-r3, a + r3, r3, :orange)
   b = sqrt(r0^2 - a^2)
   segment(-b, a, b, a)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(x1, a + r1, "大円:r1,(x1,a+r1)", :red, :center, :bottom, delta=delta/2)
       point(0, r0 - r2, "中円:r2,(0,r0-r2)", :blue, :center, :bottom, delta=delta/2)
       point(r3, a + r3, " 小円:r3,(r3,a+r3)", :black, :left, :vcenter)
       point(0, a, " a", :black, :left, :top, delta=-delta/2)
       point(弦/2, a, "(弦/2,a)", :black, :right, :top, delta=-delta/2)
       point(0, r0, " r0", :black, :left, :bottom, delta=delta/2)
       point(r0, 0, "r0 ", :black, :right, :bottom, delta=delta/2)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5, ylims=(-0.3, 4.3))
   else
       plot!(showaxis=false)
   end
end;

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

算額(その438)

2023年09月18日 | Julia

算額(その438)

社丈右衛門正常 天明2年壬寅4月(1782)

藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf

交差する 2 個の大円の中に,等円 3 個,甲円,乙円,丙円がそれぞれ 4 こずつ入っている。大円の直径が与えられたとき,大円の直径が与えられたとき,各円の直径を求めよ。

大円の半径と中心座標を 2r, (0, r), (0, -r)
等円の半径と中心座標を r, (0, 2r), (0, 0), (0, -2r)
甲円の半径と中心座標を r1, (x1, y1)
乙円の半径と中心座標を r2, (x2, y2)
丙円の半径と中心座標を r3, (x3, y3)
として以下の連立方程式の解を求める。

include("julia-source.txt");

using SymPy
@syms r0::positive, r::positive,
     r1::positive, x1::positive, y1::positive,
     r2::positive, x2::positive, y2::positive,
     r3::positive, x3::positive, y3::positive,
     r4::positive, x4::positive, y4::positive,
     r5::positive, x5::positive, y5::positive,
     r6::positive, x6::positive, y6::positive;

r = r0//2
eq1 = x1^2 + (y1 + r)^2 - (2r + r1)^2
eq2 = x1^2 + (y1 - r)^2 - (2r - r1)^2
eq3 = x1^2 + (2r - y1)^2 - (r1 + r)^2

eq4 = (x1 - x2)^2 + (y1 - y2)^2 - (r1 + r2)^2
eq5 = x2^2 + (r - y2)^2 - (2r - r2)^2
eq6 = x2^2 + (y2 + r)^2 - (2r + r2)^2

eq7 = x3^2 + (r - y3)^2 - (2r - r3)^2
eq8 = (x2 - x3)^2 + (y2 - y3)^2 - (r2 + r3)^2
eq9 = x3^2 + (y3 + r)^2 - (2r + r3)^2;

solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9], (r1, x1, y1, r2, x2, y2, r3, x3, y3))

   2-element Vector{NTuple{9, Sym}}:
    (3*r0/10, 2*sqrt(3)*r0/5, 3*r0/5, 9*r0/82, 20*sqrt(3)*r0/41, 9*r0/41, 27*r0/730, 182*sqrt(3)*r0/365, 27*r0/365)
    (3*r0/10, 2*sqrt(3)*r0/5, 3*r0/5, 9*r0/82, 20*sqrt(3)*r0/41, 9*r0/41, 3*r0/10, 2*sqrt(3)*r0/5, 3*r0/5)

最初の組が適解である。
(3*r0/10, 2*sqrt(3)*r0/5, 3*r0/5, 9*r0/82, 20*sqrt(3)*r0/41, 9*r0/41, 27*r0/730, 182*sqrt(3)*r0/365, 27*r0/365)

r0 = 36; r = 18;  r1 = 10.8; x1 = 24.9415; y1 = 21.6; r2 = 3.95122; x2 = 30.4165; y2 = 7.90244; r3 = 1.33151; x3 = 31.0915; y3 = 2.66301

円の直径だけをいえば,甲円,乙円,丙円の直径は大円の直径のそれぞれ 3/10, 9/82, 27/730 倍である。

大円の直径 = 72 のとき,等円の直径 = 36;  甲円の直径 = 21.6;  乙円の直径 = 7.90244;  丙円の直径 = 2.66301

72 .* [3/10, 9/82, 27/730] |> println

   [21.599999999999998, 7.902439024390244, 2.663013698630137]

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r0 = 72/2
   r = r0/2
   (r1, x1, y1, r2, x2, y2, r3, x3, y3) = (3*r0/10, 2*sqrt(3)*r0/5, 3*r0/5, 9*r0/82, 20*sqrt(3)*r0/41, 9*r0/41, 27*r0/730, 182*sqrt(3)*r0/365, 27*r0/365)
   @printf("r0 = %g; r = %g;  r1 = %g; x1 = %g; y1 = %g; r2 = %g; x2 = %g; y2 = %g; r3 = %g; x3 = %g; y3 = %g\n",
           r0, r, r1, x1, y1, r2, x2, y2, r3, x3, y3)
   @printf("大円の直径 = %g;  等円の直径 = %g;  甲円の直径 = %g;  乙円の直径 = %g;  丙円の直径 = %g\n", 2r0, 2r, 2r1, 2r2, 2r3)
   plot()
   circle(0, r, r0, :gray)
   circle(0, -r, r0, :gray)
   circle(0, 2r, r, :blue)
   circle(0, -2r, r, :blue)
   circle(0, 0, r, :blue)
   circle4(x1, y1, r1)
   circle4(x2, y2, r2, :blue)
   circle4(x3, y3, r3, :green)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(x1, y1, "  甲円:r1,(x1,y1)", :black, :left, :vcenter)
       point(x2, y2, "   乙円:r2,(x2,y2)", :black, :left, :vcenter)
       point(x3, y3, "  丙円:r3,(x3,y3)", :black, :left, :vcenter)
       point(0, r, " r")
       point(0, -r, " -r")
       point(0, 2r, " 2r")
       point(0, 3r, " 3r")
       point(0.08r, 2.4r, "等円", :blue, mark=false)
       point(0.8x1, 2.1r, "大円", :gray, mark=false)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その437)

2023年09月18日 | Julia

算額(その437)

橘田彌曾八元克 天明八年戊申2月(1788)

藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf

大円の中に,甲,乙,丙,丁,戊,己の 6 個の円が入っている。丁円,戊円,己円の直径がそれぞれ 872.3 寸,671 寸,572 寸のとき,大円の直径はいかほどか。

(必要ならば)己円の中心がy 軸上に来るように回転する。中心の x 座標が 0 になる。
大円の半径と中心座標を r0, (0, 0)
甲円の半径と中心座標を r1, (x1, y1)
乙円の半径と中心座標を r2, (x2, y2)
丙円の半径と中心座標を r3, (x3, y3)
丁円の半径と中心座標を r4, (x4, y4) r4 = 872.3/2
戊円の半径と中心座標を r5, (x5, y5)  r5 = 671/2
己円の半径と中心座標を r6, (x6, y6)  r6 = 572/2, x6 = 0
として以下の連立方程式の数値解を求める。

include("julia-source.txt");

using SymPy
@syms r0,
      r1, x1, y1, r2, x2, y2, r3, x3, y3,
      r4, x4, y4, r5, x5, y5, r6, x6, y6

eq1 = x1^2 + y1^2 - (r0 - r1)^2
eq2 = x2^2 + y2^2 - (r0 - r2)^2
eq3 = x3^2 + y3^2 - (r0 - r3)^2
eq4 = x4^2 + y4^2 - (r0 - r4)^2
eq5 = x5^2 + y5^2 - (r0 - r5)^2
eq6 = x6^2 + y6^2 - (r0 - r6)^2
eq7 = (x1 - x2)^2 + (y1 - y2)^2 - (r1 + r2)^2
eq8 = (x1 - x3)^2 + (y1 - y3)^2 - (r1 + r3)^2
eq9 = (x1 - x4)^2 + (y1 - y4)^2 - (r1 + r4)^2
eq10 = (x1 - x5)^2 + (y1 - y5)^2 - (r1 + r5)^2
eq11 = (x2 - x3)^2 + (y2 - y3)^2 - (r2 + r3)^2
eq12 = (x2 - x4)^2 + (y2 - y4)^2 - (r2 + r4)^2
eq13 = (x2 - x6)^2 + (y2 - y6)^2 - (r2 + r6)^2
eq14 = (x3 - x5)^2 + (y3 - y5)^2 - (r3 + r5)^2
eq15 = (x3 - x6)^2 + (y3 - y6)^2 - (r3 + r6)^2;

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 v, r.f_converged
end;

function H(u)
   (r0, r1, x1, y1, r2, x2, y2, r3, x3, y3, x4, y4, x5, y5, y6) = u
   return [
       x1^2 + y1^2 - (r0 - r1)^2,  # eq1
       x2^2 + y2^2 - (r0 - r2)^2,  # eq2
       x3^2 + y3^2 - (r0 - r3)^2,  # eq3
       x4^2 + y4^2 - (r0 - r4)^2,  # eq4
       x5^2 + y5^2 - (r0 - r5)^2,  # eq5
       x6^2 + y6^2 - (r0 - r6)^2,  # eq6
       -(r1 + r2)^2 + (x1 - x2)^2 + (y1 - y2)^2,  # eq7
       -(r1 + r3)^2 + (x1 - x3)^2 + (y1 - y3)^2,  # eq8
       -(r1 + r4)^2 + (x1 - x4)^2 + (y1 - y4)^2,  # eq9
       -(r1 + r5)^2 + (x1 - x5)^2 + (y1 - y5)^2,  # eq10
       -(r2 + r3)^2 + (x2 - x3)^2 + (y2 - y3)^2,  # eq11
       -(r2 + r4)^2 + (x2 - x4)^2 + (y2 - y4)^2,  # eq12
       -(r2 + r6)^2 + (x2 - x6)^2 + (y2 - y6)^2,  # eq13
       -(r3 + r5)^2 + (x3 - x5)^2 + (y3 - y5)^2,  # eq14
       -(r3 + r6)^2 + (x3 - x6)^2 + (y3 - y6)^2,  # eq15
   ]
end;

(r4, r5, r6) = (872.3, 671, 572) ./2
x6 = 0
iniv = [big"95.0", 57, 12, 40, 41, -40, -43, 34, 36, -47, -72, 18, 75, -8, -79] .* (620.3/28)
res = nls(H, ini=iniv);
println([round(Float64(x), digits=6) for x in res[1]], " 収束:", res[2]);

   [1586.0, 830.761905, 265.84381, 706.902857, 726.916667, -668.763333, -539.24, 623.071429, 672.917143, -688.777143, -994.422, 577.304, 1248.06, 78.08, -1300.0] 収束:true

r0 = 1586
r1 = 830.762; x1 = 265.844;  y1 = 706.903
r2 = 726.917; x2 = -668.763; y2 = -539.24
r3 = 623.071; x3 = 672.917;  y3 = -688.777
r4 = 436.15;  x4 = -994.422; y4 = 577.304
r5 = 335.5;   x5 = 1248.06;  y5 = 78.08
r6 = 286;     x6 = 0;        y6 = -1300

大円の半径は 1586 寸(直径は 3172 寸)である。

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r4, r5, r6) = (872.3, 671, 572) ./2
   x6 = 0
   (r0, r1, x1, y1, r2, x2, y2, r3, x3, y3, x4, y4, x5, y5, y6) = res[1]
   @printf("r0 = %g; r1 = %g; x1 = %g; y1 = %g; r2 = %g; x2 = %g; y2 = %g; r3 = %g; x3 = %g; y3 = %g; r4 = %g;  x4 = %g; y4 = %g; r5 = %g;  x5 = %g; y5 = %g; r6 = %g;  x6 = %g;  y6 = %g\n", r0, r1, x1, y1, r2, x2, y2, r3, x3, y3, r4, x4, y4, r5, x5, y5, r6, x6, y6)
   @printf("大円の半径 = %g;  直径 = %g\n", r0, 2r0)
   plot()
   circle(0, 0, r0, :gray)
   circle(x1, y1, r1)
   circle(x2, y2, r2, :blue)
   circle(x3, y3, r3, :green)
   circle(x4, y4, r4, :magenta)
   circle(x5, y5, r5, :orange)
   circle(x6, y6, r6, :brown)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(x1, y1, " 甲:r1,(x1,y1)", :red, :left, :vcenter)
       point(x2, y2, "乙:r2,(x2,y2)", :blue, :center, :top, delta=-delta)
       point(x3, y3, "丙:r3,(x3,y3)", :green, :center, :top, delta=-delta)
       point(x4, y4, "丁:r4,(x4,y4)", :magenta, :center, :top, delta=-delta)
       point(x5, y5, "戊:r5,(x5,y5)", :orange, :center, :bottom, delta=delta/2)
       point(x6, y6, " 己:r6,(x6,y6)", :black, :left, delta=-delta/2)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その436)

2023年09月17日 | Julia

算額(その436)

橘田彌曾八元克 天明八年戊申2月(1788)

藤田貞資(1789):神壁算法巻上
http://www.wasan.jp/jinpeki/jinpekisanpo1.pdf

外円の中に,甲円 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;
r0 = 36//20
eq1 = (2r1)^2 + (a + r1)^2 - (r0 - r1)^2
eq2 = r1^2 + (y2 - a - r1)^2 - (r1 + r2)^2
eq3 = r1^2 + y2^2 - (r0 - r2)^2
eq4 = r1^2 + (r0 - r3 - y2)^2  - (r3 + r2)^2
eq5 = 2r3 + 2r1 + a - r0;
# res = solve([eq1, eq2, eq3, eq4, eq5], (a, r1, r3, r2, y2))

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 v, r.f_converged
end;

function H(u)
   (a, r1, r3, r2, y2) = u
   return [
       4*r1^2 + (a + r1)^2 - (r0 - r1)^2,  # eq1
       r1^2 - (r1 + r2)^2 + (-a - r1 + y2)^2,  # eq2
       r1^2 + y2^2 - (r0 - r2)^2,  # eq3
       r1^2 - (r2 + r3)^2 + (r0 - r3 - y2)^2,  # eq4
       a - r0 + 2*r1 + 2*r3,  # eq5
   ]
end;
r0 = 3.6/2
iniv = r0 .* [big"0.22", 0.24, 0.14, 0.12, 0.69]
res = nls(H, ini=iniv);
println([round(Float64(x), digits=6) for x in res[1]], " 収束:", res[2]);

   [0.330519, 0.500029, 0.234712, 0.282615, 1.43263] 収束:true

a = 0.330519;  r1 = 0.500029;  r3 = 0.234712;  r2 = 0.282615;  y2 = 1.43263

外円の直径が 3.6 のとき,甲円の直径 は 1.00006 である。

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, r1, r3, r2, y2) = res[1]
   @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, :gray)
   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
       point(0, a + r1, " 甲円:r1,(0,a+r1)", :red, :center, :top, delta=-delta/2)
       point(2r1, a + r1, " (2r1,a+r1)", :red, :center, :bottom, 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", :gray, :left, :bottom, delta=delta/2)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その435)

2023年09月15日 | Julia

算額(その435)

東京都府中市 大國魂神社 明治18年(1885)

山口正義(2015):やまぶき2 第33号
https://yamabukiwasan.sakura.ne.jp/ymbk33.pdf

外円とその平行な 2 本の弦に内接・外接する,甲円 2 個,乙円 1 個,丙円 3 個が入っている。甲円,乙円,丙円,外円も内接・外接している。
外円と甲円の直径の差が 4 寸のとき,乙円の直径はいかほどか。

外円の半径と中心座標を r0, (0, 0)
甲円の半径と中心座標を r1, (r1, a + r1)
乙円の半径と中心座標を r2, (0, r0 - r2)
丙円の半径と中心座標を r3, (x3, a + 2r1 + r3), (0, a + 2r1 - r3)
甲円と接する下側の弦と y 軸の交点の y 座標を a
外円と甲円の直径の差を A
として,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms A::positive, r0::positive, a::negative,
     r1::positive, r2::positive, r3::positive, x3::positive;
eq1 = r1^2 + (a + r1)^2 - (r0 -r1)^2
eq2 = r1^2 + (r1 - r3)^2 - (r1 + r3)^2
eq3 = x3^2 + (r2 - r3)^2 - (r2 + r3)^2
eq4 = 2r0 - 2r1 - A
eq5 = x3^2 + (a + 2r1 + r3)^2 - (r0 - r3)^2
eq6 = r0 + a + 2r1 + 2r2 - 2r0
res = solve([eq1, eq2, eq3, eq4, eq5, eq6], (r0, a, r1, r2, r3, x3))

   1-element Vector{NTuple{6, Sym}}:
    (A*(sqrt(3) + 2)/4, A*(1 - sqrt(3))/4, sqrt(3)*A/4, A/8, sqrt(3)*A/16, sqrt(2)*3^(1/4)*A/8)

   r0 = 3.73205;  a = -0.732051;  r1 = 1.73205;  r2 = 0.5;  r3 = 0.433013;  x3 = 0.930605

乙円の半径は A/8。すなわち,外円と甲円の直径の差の 1/8 である。乙円の直径は外円と甲円の直径の差の 1/4 である。
つまり,外円と甲円の直径の差が 4 寸のとき,乙円の直径は 1 寸である。

山口は「大國魂神社奉献 関流和算額」という小冊子に書かれている本問への答えに失望したと書いてるが,ここで示したのが正解だ(答と術は正しい)と伝えたいものだ。

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   A = 4
   (r0, a, r1, r2, r3, x3) = (A*(sqrt(3) + 2)/4, A*(1 - sqrt(3))/4, sqrt(3)*A/4, A/8, sqrt(3)*A/16, sqrt(2)*3^(1/4)*A/8)
   @printf("r0 = %g;  a = %g;  r1 = %g;  r2 = %g;  r3 = %g;  x3 = %g\n", r0, a, r1, r2, r3, x3)
   plot()
   circle(0, 0, r0, :gray)
   circle(r1, a + r1, r1)
   circle(-r1, a + r1, r1)
   circle(0, r0 - r2, r2, :blue)
   circle(x3, a + 2r1 + r3, r3, :green)
   circle(-x3, a + 2r1 + r3, r3, :green)
   circle(0, a + 2r1 - r3, r3, :green)
   b = sqrt(r0^2 - a^2)
   segment(-b, a, b, a, :magenta)
   c = sqrt(r0^2 - (a + 2r1)^2)
   segment(-c, a + 2r1, c, a + 2r1, :magenta)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(r1, a + r1, "甲円:r1,(r1,a+r1)", :red, :center, :top, delta=-delta)
       point(0, r0 - r2, "乙円:r2,(0,r0-r2) ", :black, :right, :vcenter)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

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

算額(その434)

2023年09月15日 | Julia

算額(その434)

埼玉県大宮市 氷川神社 明治31年(1898)

山口正義(2015):やまぶき2 第33号
https://yamabukiwasan.sakura.ne.jp/ymbk33.pdf

一〇一 大宮市高鼻町 氷川神社 明治31年(1898)
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.

正方形内に,四分円 1 個,半円 2 個,円 1 子が入っている。円は四分円,半円と 3箇所で内接・外接している。円の直径が 1 寸のとき,正方形の一辺の長さを求めよ。

正方形の一辺の長さは 2r2 である。円の半径を r1,中心座標を (x1, y1) として,以下の連立方程式の解を求める。

include("julia-source.txt");

using SymPy
@syms r1::positive, r2::positive,
     x1::positive, y1::positive, a::positive;
eq1 = (r2 - x1)^2 + y1^2 - (r1 + r2)^2
eq2 = (2r2 - x1)^2 + y1^2 - (2r2 - r1)^2
eq3 = x1^2 + (y1 - r2)^2 - (r2 - r1)^2
res = solve([eq1, eq2, eq3], (r2, x1, y1))

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (33*r1/8, 3*r1, 5*r1)

r2 = r1*33/8 ゆえ,正方形の一変の長さは 2r2 = 2r1*33/8 すなわち,円の直径が 1 寸のとき 33/8 = 4.125 寸である。

算額の答で(「埼玉の算額」より)は,四寸一分三厘五毛となっているようだが,誤植である。

   r1 = 0.5;  r2 = 2.0625;  x1 = 1.5;  y1 = 2.5;  正方形の一辺の長さ = 4.125

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = 1//2
   (r2, x1, y1) = (33*r1/8, 3*r1, 5*r1)
   a = 2r2
   @printf("r1 = %g;  r2 = %g;  x1 = %g;  y1 = %g;  正方形の一辺の長さ = %g\n", r1, r2, x1, y1, 2r2)
   plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:black, lw=0.5)
   circle(a, 0, 2r2, :blue, beginangle=90, endangle=180)
   circle(r2, 0, r2, :green, beginangle=0, endangle=180)
   circle(0, r2, r2, :magenta, beginangle=-90, endangle=90)
   circle(x1, y1, r1, :red)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(x1, y1, "(x1,y1)")
       point(0, r2, " r2")
       point(r2, 0, " r2", :green, :left, :bottom, delta=delta)
       point(2r2, 0, "2r2 ", :green, :right, :bottom, delta=delta)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 

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

算額(その433)

2023年09月15日 | Julia

算額(その433)

埼玉県大宮市 氷川神社 明治31年(1898)

山口正義(2015):やまぶき2 第33号
https://yamabukiwasan.sakura.ne.jp/ymbk33.pdf

外円の中に正方形 1 個,大円 2 個,小円 4 個が入っている。
小円の直径が 1 寸のとき,大円の直径はいかほどか。

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

include("julia-source.txt");

using SymPy
@syms r0::positive, r1::positive, r2::positive,
     x2::positive;
r0 = 2r1
eq1 = x2^2 + (r1 - r2)^2 - (r1 + r2)^2
eq2 = r2/(r0 - x2) - (sqrt(Sym(2)) - 1)  # tand(45/2)
res = solve([eq1, eq2], (r1, x2))

   1-element Vector{Tuple{Sym, Sym}}:
    (sqrt(2)*r2 + 3*r2/2, sqrt(2)*r2 + 2*r2)

大円の半径は,小円の半径の (2*sqrt(2) + 3)/2 倍である。

sqrt(Sym(2))*r2 + 3*r2/2 |> simplify |> println

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

小円の直径が 1 寸のとき,大円の直径は 2.914213562373095 寸である。

r2 = 1
r2*(2*sqrt(2) + 3)/2

   2.914213562373095

   r1 = 1.45711;  x2 = 1.70711;  大円の直径 = 2.91421

using Plots

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1//2
   (r1, x2) = (sqrt(2)*r2 + 3*r2/2, sqrt(2)*r2 + 2*r2)
   r0 = 2r1
   @printf("r1 = %g;  x2 = %g;  大円の直径 = %g\n", r1, x2, 2r1)
   plot([0, r0, 0, -r0, 0], [-r0, 0, r0, 0, -r0], color=:black, lw=0.5)
   circle(0, 0, r0, :blue)
   circle(0, r1, r1, :red)
   circle(0, -r1, r1, :red)
   circle4(x2, r2, r2, :green)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /  3  # size[2] * fontsize * 2
       point(0, r1, " 大円:r1,(0,r1)", :red)
       point(x2, r2, " 小円:r2,(x2,r2)", :black, :center, delta=-delta)
       point(r0, 0, "r0", :blue)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

 

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

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

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