裏 RjpWiki

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

算額(その2099)

2024年09月19日 | Julia

#和算 - ブログ村ハッシュタグ
#和算

算額(その2099)

八十七 群馬県碓氷郡松井田町峠 熊野神社 安政4年(1857)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:直角三角形,鈎股弦

直角三角形(鈎股弦)において,「鈎*股」が 52440 歩,「股*弦」が 130065 歩のとき,鈎,股,弦を求めよ。

以下の連立方程式を解く。

using SymPy
@syms 鈎::positive, 股::positive, 弦::positive,
     鈎股相乗::positive, 股弦相乗::positive;
eq1 = 鈎*股 - 鈎股相乗
eq2 = 股*弦 - 股弦相乗
eq3 = 鈎^2 + 股^2 - 弦^2
eq3 = sqrt(鈎^2 + 股^2) - 弦
res = solve([eq1, eq2, eq3], (鈎, 股, 弦))[2]  # 2 of 2

   (鈎股相乗*(1/(股弦相乗^2 - 鈎股相乗^2))^(1/4), (1/(股弦相乗^2 - 鈎股相乗^2))^(-1/4), 股弦相乗*(1/(股弦相乗^2 - 鈎股相乗^2))^(1/4))

鈎 = res[1](鈎股相乗 => 52440, 股弦相乗 => 130065)
股 = res[2](鈎股相乗 => 52440, 股弦相乗 => 130065)
弦 = res[3](鈎股相乗 => 52440, 股弦相乗 => 130065)
(鈎, 股, 弦)

   (152, 345, 377)

「鈎*股」が 52440 歩,「股*弦」が 130065 歩のとき,鈎 = 152 寸,股 = 345 寸,弦 = 377 寸である。

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

算額(その2098)

2024年09月19日 | Julia

#和算 - ブログ村ハッシュタグ
#和算

算額(その2098)

七十六 群馬県桐生市天神町 天満宮 嘉永5年(1852)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:年利

銀 76 匁を,複利で 7 年預け,元利合計が 357.62786865234375 匁であった。年利はいかほどか。

「術」は 400 文字以上にわたり述べられている。

「元本」,「年利」,「年数」,「元利合計」の関係は以下の式になる。

元利合計 = 元本*(1 + 年利)^年数

using SymPy
@syms 元本::positive, 年利::positive, 年数::positive,
     元利合計::positive;
eq = 元利合計 ⩵ 元本*(1 + 年利)^年数
eq |> println

   Eq(元利合計, 元本*(年利 + 1)^年数)

方程式を解いて,年利を求める。
年利 = (元利合計/元本)^(1/年数) - 1

res = solve(eq, 年利)[1]
res |> println

   元利合計^(1/年数)/元本^(1/年数) - 1

「元本」,「年数」,「元利合計」を式に代入し,「年利」を得る。
元本 76 匁を,複利で 7 年預け,元利合計が 357.62786865234375 匁のとき,年利は 0.25 = 2 割 5 分 である。

res(元本 => 75, 年数 => 7, 元利合計 => 357.62786865234375).evalf() |>  println

   0.250000000000000

 

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

算額(その2097)

2024年09月17日 | Julia

#和算 - ブログ村ハッシュタグ
#和算

算額(その2097)

七十二 群馬県富岡市一ノ宮 貫前神社 嘉永2年(1849)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円2個,直角三角形,正五角形

直角三角形の中に正五角形と甲円,乙円を容れる。甲円の直径が 5 寸のとき,乙円の直径はいかほどか。

正五角形を内包する円の半径と中心座標を R, (0, 0)
甲円の半径と中心座標を r1, (r1 - R*cosd(18), R)
乙円の半径と中心座標を r2(x2, r2 -R*cosd(36))
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms R::positive, r1::positive, r2::positive,
     x2::positive;
eq1 = dist2(0, R, R*cosd(Sym(18)), R*sind(Sym(18)), r1 - R*cosd(Sym(18)), R, r1)
eq2 = dist2(0, R, R*cosd(Sym(18)), R*sind(Sym(18)), x2, r2 - R*cosd(Sym(36)), r2)
eq3 = dist2(R*sind(Sym(36)), -R*cosd(Sym(36)), R*cosd(Sym(18)), R*sind(Sym(18)), x2, r2 - R*cosd(Sym(36)), r2);

SymPy の能力的に,一度には解けないので,逐次解いていく。

まず,eq1 を解き,R を求める。

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

   r1*((-sqrt(10) + 5*sqrt(2))*sqrt(sqrt(5) + 5) + 8*sqrt(5))/10

eq2 の R に ans_R を代入し,x2 を求める。

eq12 = eq2(R => ans_R) |> simplify
ans_x2 = solve(eq12, x2)[1]  # 1 of 2
@syms d
ans_x2 = apart(ans_x2, d) |> simplify |> sympy.sqrtdenest|> simplify
ans_x2 |> println

   (-4*sqrt(2)*r1 - 2*r1*sqrt(5 - sqrt(5)) - sqrt(10)*r2 + 5*sqrt(2)*r2)/((-3 + sqrt(5))*sqrt(5 - sqrt(5)))

eq3 の R に ans_R,x2 に ans_x2 を代入し,r2 を求める。

eq13 = eq3(R => ans_R, x2 => ans_x2) |> simplify |> numerator
ans_r2 = solve(eq13, r2)[2]  # 2 of 2
ans_r2 = apart(ans_r2/r1, d) |> x -> x*r1
ans_r2 |> println

   r1*(-sqrt(2)*sqrt(sqrt(5) + 5) - sqrt(5) + 3 + sqrt(10)*sqrt(sqrt(5) + 5)/2)

甲円の直径が 5 寸のとき,各パラメータは以下のように計算される。
乙円の直径は 2*3.032399997699489 = 6.064799995398978 である。

r1 = 5/2
t = sqrt(5 + √5)
u = sqrt(5 - √5)
r2 = r1*(3 - √5 + t*(√10/2 - √2))
x2 = (r2*(5√2 - √10) - r1*(4√2 + 2*u))/((√5 - 3)*u)
R = r1*((5√2 - √10)*t + 8√5)/10
(r2, x2, R)

   (3.032399997699489, 8.347481064940814, 7.1007915155952475)

function draw(r1, more)
    pyplot(size=(600, 600), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   t = sqrt(5 + √5)
   u = sqrt(5 - √5)
   r2 = r1*(3 - √5 + t*(√10/2 - √2))
   x2 = (r2*(5√2 - √10) - r1*(4√2 + 2*u))/((√5 - 3)*u)
   R = r1*((5√2 - √10)*t + 8√5)/10
   @printf("甲円の直径が %g のとき,乙円の直径は %.15g である。\n", 2r1, 2r2)
   plot([R*cosd(18), 0, -R*cosd(18), -R*sind(36), R*sind(36), R*cosd(18)],
        [R*sind(18), R, R*sind(18), -R*cosd(36), -R*cosd(36), R*sind(18)], color=:magenta, lw=0.5)
   circle(r1 - R*cosd(18), R, r1)
   circle(x2, r2 - R*cosd(36), r2, :blue)
   (x01, y01) = Float64.(intersection(0, R, R*cosd(18), R*sind(18), -R*cosd(18), 0, -R*cosd(18), -R*sind(36)))
   (x02, y02) = Float64.(intersection(0, R, R*cosd(18), R*sind(18), R*sind(36), -R*cosd(36), -R*cosd(18), -R*cosd(36)))
   plot!([x01, x02, x01, x01], [y02, y02, y01, y02], color=:green, 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(r1 - R*cosd(18), R, "甲円:r1,(r1-R*cosd(18),R)", :red, :left, :bottom, delta=delta, deltax=-8delta)
       point(x2, r2 - R*cosd(36), "乙円:r2,(x2,r2-R*cosd(36))", :blue, :left, :bottom, delta=delta, deltax=-8delta)
       point(0, R, "(0,R)", :magenta, :center, delta=-2delta)
       point(R*cosd(18), R*sind(18), "(R*cosd(18),Rsind(18)) ", :magenta, :right, :vcenter)
       point(R*sind(36), -R*cosd(36), "(R*sind(36),-R*cosd(36))", :magenta, :right, :bottom, delta=delta)
   end  
end;

draw(5/2, true)

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

算額(その2096)

2024年09月17日 | Julia

算額(その2096)

六十四 群馬県安中市板鼻 鷹巣神社 天保11年(1840)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円10個,外円

外円の中に甲乙丙丁戊の円を容れる。甲円,乙円の直径が 4 寸,9 寸のとき,外円の直径はいかほどか。
異版では,名前の付け方が違うが,本問に対応付けると「丙円の直径も求めよ」としている。

外円の半径と中心座標を R, (0, 0)
甲円の半径と中心座標を r1, (r1, y1)
乙円の半径と中心座標を r2, (r2, y2)
丙円の半径と中心座標を r3, (0, y3)
丁円の半径と中心座標を r4, (x4, y4)
戊円の半径と中心座標を r5, (x5. y5)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms R::positive, r1::positive, y1::positive,
     r2::positive, y2::negative, r3::positive, y3::positive,
     r4::positive, x4::positive, y4::positive,
     r5::positive, x5::positive, y5::positive;
eq1 = r1^2 + (y1 - y3)^2 - (r1 + r3)^2
eq2 = (x4 - r1)^2 + (y1 - y4)^2 - (r1 + r4)^2
eq3 = (x5 - r1)^2 + (y1 - y5)^2 - (r1 + r5)^2
eq4 = r2^2 + (y3 - y2)^2 - (r2 + r3)^2
eq5 = (r2 - x4)^2 + (y4 - y2)^2 - (r2 + r4)^2
eq6 = (x5 - r2)^2 + (y5 - y2)^2 - (r2 + r5)^2
eq7 = x4^2 + (y3 - y4)^2 - (r3 + r4)^2
eq8 = (x5 - x4)^2 + (y5 - y4)^2 - (r4 + r5)^2
eq9 = r1^2 + y1^2 - (R - r1)^2
eq10 = r2^2 + y2^2 - (R - r2)^2
eq11 = x5^2 + y5^2 - (R - r5)^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 Float64.(v), r.f_converged
end;

function H(u)
   (R, y1, y2, r3, y3, r4, x4, y4, r5, x5, y5) = u
   return [
       r1^2 - (r1 + r3)^2 + (y1 - y3)^2,  # eq1
       (-r1 + x4)^2 - (r1 + r4)^2 + (y1 - y4)^2,  # eq2
       (-r1 + x5)^2 - (r1 + r5)^2 + (y1 - y5)^2,  # eq3
       r2^2 - (r2 + r3)^2 + (-y2 + y3)^2,  # eq4
       -(r2 + r4)^2 + (r2 - x4)^2 + (-y2 + y4)^2,  # eq5
       (-r2 + x5)^2 - (r2 + r5)^2 + (-y2 + y5)^2,  # eq6
       x4^2 - (r3 + r4)^2 + (y3 - y4)^2,  # eq7
       -(r4 + r5)^2 + (-x4 + x5)^2 + (-y4 + y5)^2,  # eq8
       r1^2 + y1^2 - (R - r1)^2,  # eq9
       r2^2 + y2^2 - (R - r2)^2,  # eq10
       x5^2 + y5^2 - (R - r5)^2,  # eq11
   ]
end;

(r1, r2) = (4/2, 9/2)
iniv = BigFloat[9.1, 6.9, -1.1, 1.9, 3.5, 0.94, 2.8, 4.0, 1.8, 5.3, 5.1]

res = nls(H, ini=iniv)

   ([9.142857142857142, 6.857142857142857, -1.1428571428571428, 1.9393939393939394, 3.463203463203463, 0.9411764705882353, 2.823529411764706, 4.033613445378151, 1.7777777777777777, 5.333333333333333, 5.079365079365079], true)

甲円,乙円の直径が 4 寸,9 寸のとき,外円の直径は 128/7 = 18 + 2/7 ≒ 18.2857 である。
丙円は 128/33 = 3 + 29/33 ≒ 3.87879 である。

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

   R = 9.14286;  y1 = 6.85714;  y2 = -1.14286;  r3 = 1.93939;  y3 = 3.4632;  r4 = 0.941176;  x4 = 2.82353;  y4 = 4.03361;  r5 = 1.77778;  x5 = 5.33333;  y5 = 5.07937

function draw(r1, r2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (R, y1, y2, r3, y3, r4, x4, y4, r5, x5, y5) = [37.4/2, 12.9, -3.5, 7.9/2, 5.6, 2.3, 6.2, 5.9, 7.9/2, 12.2, 8.1]
   (R, y1, y2, r3, y3, r4, x4, y4, r5, x5, y5) = res[1]
   @printf("甲円,乙円の直径が %g, %g のとき,外円の直径は %g, 丙円の直径は %g である。\n", 2r1, 2r2, 2R, 2r3)
   @printf("R = %g;  y1 = %g;  y2 = %g;  r3 = %g;  y3 = %g;  r4 = %g;  x4 = %g;  y4 = %g;  r5 = %g;  x5 = %g;  y5 = %g\n", R, y1, y2, r3, y3, r4, x4, y4, r5, x5, y5)
   plot()
   circle(0, 0, R)
   circle2(r1, y1, r1, :blue)
   circle2(r2, y2, r2, :green)
   circle(0, y3, r3, :magenta)
   circle2(x4, y4, r4, :orange)
   circle2(x5, y5, r5, :brown)
   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, R, "R", :red, :center, :bottom, delta=delta/2)
       point(r1, y1, "甲円:r1\n(r1,y1)", :blue, :center, delta=-delta/2)
       point(r2, y2, "乙円:r2,(r2,y2)", :green, :center, delta=-delta/2)
       point(0, y3, "丙円:r3\n(0,y3)", :magenta, :center, delta=-delta/2)
       point(x4, y4, "丁円:r4,(x4,y4)", :black, :left, :bottom, delta=delta/2, deltax=-2delta)
       point(x5, y5, "戊円:r5\n(x5,y5)", :brown, :center, :bottom, delta=delta/2)
   end  
end;

draw(4/2, 9/2, true)

 

#和算 - ブログ村ハッシュタグ
#和算

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

算額(その2095)

2024年09月16日 | Julia

算額(その2095)

二十七 群馬県太田市細谷 冠稲荷神社 文化11年(1814)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円6個,長方形

長方形の中に,甲乙丙丁戊己の 6 個の円を容れる。甲円,丁円の直径がそれぞれ 169 寸,36 寸のとき,己円の直径はいかほどか。

長方形の長辺と短辺を a, b; b = 2r1
甲円の半径と中心座標を r1, (a - r1, r1)
乙円の半径と中心座標を r2, (x2, r2)
丙円の半径と中心座標を r3, (x3, b - r3)
丁円の半径と中心座標を r4, (x4, r4)
戊円の半径と中心座標を r5, (x5, r5)
己円の半径と中心座標を r6, (r6, r6)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms a::positive, b::positive, r1::positive, r2::positive,
     x2::positive, r3::positive, x3::positive, r4::positive, x4::positive,
     r5::positive, x5::positive, r6::positive;
b = 2r1
eq1 = (a - r1 - x2)^2 + (r1 - r2)^2 - (r1 + r2)^2
eq2 = (a - r1 - x3)^2 + (r1 - r3)^2 - (r1 + r3)^2
eq3 = (x2 - x3)^2 + (b - r3 - r2)^2 - (r2 + r3)^2
eq4 = (x4 - x3)^2 + (b - r3 - r4)^2 - (r4 + r3)^2
eq5 = (x5 - x3)^2 + (b - r3 - r5)^2 - (r5 + r3)^2
eq6 = (r6 - x3)^2 + (b - r3 - r6)^2 - (r6 + r3)^2
eq7 = (x2 - x4)^2 + (r2 - r4)^2 - (r2 + r4)^2
eq8 = (x4 - x5)^2 + (r4 - r5)^2 - (r4 + r5)^2
eq9 = (x5 - r6)^2 + (r5 - r6)^2 - (r5 + r6)^2;
# res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9], (a, r2, x2, r3, x3, x4, r5, x5, r6))

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)
   (a, r2, x2, r3, x3, x4, r5, x5, r6) = u
   return [
       (r1 - r2)^2 - (r1 + r2)^2 + (a - r1 - x2)^2,  # eq1
       (r1 - r3)^2 - (r1 + r3)^2 + (a - r1 - x3)^2,  # eq2
       -(r2 + r3)^2 + (x2 - x3)^2 + (2*r1 - r2 - r3)^2,  # eq3
       -(r3 + r4)^2 + (-x3 + x4)^2 + (2*r1 - r3 - r4)^2,  # eq4
       -(r3 + r5)^2 + (-x3 + x5)^2 + (2*r1 - r3 - r5)^2,  # eq5
       -(r3 + r6)^2 + (r6 - x3)^2 + (2*r1 - r3 - r6)^2,  # eq6
       (r2 - r4)^2 - (r2 + r4)^2 + (x2 - x4)^2,  # eq7
       (r4 - r5)^2 - (r4 + r5)^2 + (x4 - x5)^2,  # eq8
       (r5 - r6)^2 - (r5 + r6)^2 + (-r6 + x5)^2,  # eq9
   ]
end;

(r1, r4) = (169/2, 36/2)
iniv = BigFloat[350, 27, 171, 67, 115, 127, 20, 89, 36]

res = nls(H, ini=iniv)

   ([350.3565608160057, 26.68421052631579, 170.88675952162194, 66.89583333333333, 115.48770876656474, 127.05454353959865, 19.6047261009667, 89.48407269786442, 36.202314049586775], true)

甲円の直径が 169 寸,丁円の直径が 36 寸のとき,己円の直径は 72.4046 寸である。

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

   a = 350.357;  b = 169;  r1 = 84.5;  r2 = 26.6842;  x2 = 170.887;  r3 = 66.8958;  x3 = 115.488;  r4 = 18;  x4 = 127.055;  r5 = 19.6047;  x5 = 89.4841;  r6 = 36.2023

function draw(r1, r4, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (a, r2, x2, r3, x3, x4, r5, x5, r6) = res[1]
   b = 2r1
   @printf("甲円の直径が %g,丁円の直径が %g のとき,己円の直径は %g である。\n", 2r1, 2r4, 2r6)
   @printf("a = %g;  b = %g;  r1 = %g;  r2 = %g;  x2 = %g;  r3 = %g;  x3 = %g;  r4 = %g;  x4 = %g;  r5 = %g;  x5 = %g;  r6 = %g\n", a, b, r1, r2, x2, r3, x3, r4, x4, r5, x5, r6)
   plot([0, a, a, 0, 0], [0, 0, b, b, 0], color=:green, lw=0.5)
   circle(a - r1, r1, r1)
   circle(x2, r2, r2, :magenta)
   circle(x3, b - r3, r3, :blue)
   circle(x4, r4, r4, :orange)
   circle(x5, r5, r5, :purple)
   circle(r6, r6, r6, :brown)
   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, b, "(a,b)", :green, :right, :bottom, delta=2delta)
       point(a - r1, r1, "甲円:r1,(a-r1,r1)", :red, :center, delta=-2delta)
       point(x2, r2, "乙円:r2,(x2,r2)", :magenta, :left, :bottom, delta=2delta)
       point(x3, b - r3, "丙円:r3,(x3,b-r3)", :blue, :center, delta=-2delta)
       point(x4, r4, " 丁円:r4,(x4,r4)", :orange, :left, :vcenter)
       point(x5, r5, "戊円:r5,(x5,r5) ", :purple, :right, :vcenter)
       point(r6, r6, "己円:r6\n(r6,r6) ", :brown, :center, :bottom, delta=2delta)
   end  
end;

draw(169/2, 36/2, true)

#和算 - ブログ村ハッシュタグ
#和算

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

算額(その2094)

2024年09月15日 | Julia

算額(その2094)

二十五 群馬県高崎市木部町 木部村鎮守社 文化10年(1813)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円7個,正方形

正方形の中に全円,累円(甲円,乙円,丙円)を容れる。甲円の直径が 1 寸のとき,丙円の直径はいかほどか。

全円の半径と中心座標を r1, (r1, r1); 正方形の一辺の長さは 2r1
甲円の半径と中心座標を r2, (r2, r2)
乙円の半径と中心座標を r3, (x3, r3)
丙円の半径と中心座標を r4, (x4, r4)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms r1::positive, r2::positive,
     r3::positive, x3::positive,
     r4::positive, x4::positive;
eq1 = 2(r1 - r2)^2 - (r1 + r2)^2
eq2 = (x3 - r2)^2 + (r2 - r3)^2 - (r2 + r3)^2
eq3 = (r1 - x3)^2 + (r1 - r3)^2 - (r1 + r3)^2
eq4 = (x4 - x3)^2 + (r3 - r4)^2 - (r3 + r4)^2
eq5 = (r1 - x4)^2 + (r1 - r4)^2 - (r1 + r4)^2
res = solve([eq1, eq2, eq3, eq4, eq5], (r1, r3, x3, r4, x4))[4]  # 4 of 4

   (2*sqrt(2)*r2 + 3*r2, r2/2, r2 + sqrt(2)*r2, r2*(4*sqrt(2) + 9)/49, r2*(11/7 + 8*sqrt(2)/7))

丙円の半径 r4 は 甲円の半径 r2 の (4√2 + 9)/49 倍である。
甲円の直径が 1 寸のとき,丙円の直径は (4√2 + 9)/49 = 0.2991194744794363 寸である。

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

   r1 = 2.91421;  r2 = 0.5;  r3 = 0.25;  x3 = 1.20711;  r4 = 0.14956;  x4 = 1.59384

function draw(r2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r3, x3, r4, x4) = (2*sqrt(2)*r2 + 3*r2, r2/2, r2 + sqrt(2)*r2, r2*(4*sqrt(2) + 9)/49, r2*(11/7 + 8*sqrt(2)/7))
   @printf("甲円の直径が %g のとき,丙円の直径は %g である。\n", 2r2, 2r4)
   @printf("r1 = %g;  r2 = %g;  r3 = %g;  x3 = %g;  r4 = %g;  x4 = %g\n", r1, r2, r3, x3, r4, x4)
   a = 2r1
   plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:green, lw=0.5)
   circle(r1, r1, r1)
   circle(r2, r2, r2, :blue)
   circle(x3, r3, r3, :orange)
   circle(x4, r4, r4, :magenta)
   circle(a - r2, r2, r2, :blue)
   circle(a - x3, r3, r3, :orange)
   circle(a - x4, r4, r4, :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(r1, r1, "全円:r1,(r1,r1)", :red, :center, delta=-delta/2)
       point(r2, r2, "甲円:r2\n(r2,r2)", :blue, :center, delta=-delta/2)
       point(x3, r3, "乙円:r3,(x3,r3)", :black, :center, delta=-3delta)
       point(x4, r4, "丙円:r4,(x4,r4)", :magenta, :left, :bottom, delta=2delta)
   end  
end;

draw(1/2, true)

#和算 - ブログ村ハッシュタグ
#和算

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

算額(その2093)

2024年09月14日 | Julia

算額(その2093)

十七 群馬県高崎市八幡町 八幡宮 文化7年(1810)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円5個,菱形

菱形の中に,大円 2 個,中円 2 個,小円 1 個を容れる。菱形の対角線の長い方が 12 寸,短い方が 5 寸のとき,小円の直径はいかほどか。

菱形の対角線を 2a, 2b; a > b
大円の半径と中心座標を r1, (r3 + r1, 0)
中円の半径と中心座標を r2, (0, r3 + r2)
小円の半径と中心座標を r3, (0, 0)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms a::positive, b::positive,
     r1::positive, r2::positive, r3::positive;
sinθ = b/sqrt(a^2 + b^2)
cosθ = a/sqrt(a^2 + b^2)
eq1 = (r3 + r1)^2 + (r3 + r2)^2 - (r1 + r2)^2 |> expand
eq2 = (a - r3 - r1)*sinθ - r1
eq3 = (b - r3 - r2)*cosθ - r2;

SymPy では能力的に一度に解けないので,逐次解いていく。
まず,eq1 を解いて r1 を求める。

ans_r1 = solve(eq1, r1)[1]
ans_r1 |> println

   r3*(r2 + r3)/(r2 - r3)

eq2 の r1 に,上で求めた r1 を代入し,r2 を求める。

eq12 = eq2(r1 => ans_r1)
ans_r2 = solve(eq12, r2)[1]
ans_r2 |> println

   r3*(-a*b - r3*sqrt(a^2 + b^2))/(-a*b + 2*b*r3 + r3*sqrt(a^2 + b^2))

eq3 に,上で求めた r1, r2 を代入し,r3 を求める。

eq13 = eq3(r1 => ans_r1, r2 => ans_r2) |> simplify |> numerator
ans_r3 = solve(eq13, r3)[2] |> factor
ans_r3 |> println

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

解として得られた r3 を 代入して r2,r1 を確定する。

a = 12/2
b = 5/2
r3 = -a*b*(a + b + sqrt(a^2 + b^2) - sqrt(3*a^2 + 2*a*sqrt(a^2 + b^2) + 3*b^2 + 2*b*sqrt(a^2 + b^2)))/(a - b)^2
r2 = r3*(-a*b - r3*sqrt(a^2 + b^2))/(-a*b + 2*b*r3 + r3*sqrt(a^2 + b^2))
r1 = r3*(r2 + r3)/(r2 - r3)
(r1, r2, r3) |> println

   (1.5296184351192643, 0.9631806558860881, 0.49337363357064845)

菱形の対角線の長い方が 12 寸,短い方が 5 寸のとき,小円の直径は 2*0.49337363357064845 = 0.9867472671412969 寸である。「答」では「小円の径一寸三分二厘半微弱」としているが,正しいとは思えない。

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

   a = 6;  b = 2.5;  r1 = 1.52962;  r2 = 0.963181;  r3 = 0.493374

function draw(a, b, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r3 = -a*b*(a + b + sqrt(a^2 + b^2) - sqrt(3*a^2 + 2*a*sqrt(a^2 + b^2) + 3*b^2 + 2*b*sqrt(a^2 + b^2)))/(a - b)^2
   r2 = r3*(-a*b - r3*sqrt(a^2 + b^2))/(-a*b + 2*b*r3 + r3*sqrt(a^2 + b^2))
   r1 = r3*(r2 + r3)/(r2 - r3)
   @printf("菱形の対角線の長い方が %g,短い方が %g のとき,小円の直径は %g である。\n", 2a, 2b, 2r3)
   @printf("a = %g;  b = %g;  r1 = %g;  r2 = %g;  r3 = %g\n", a, b, r1, r2, r3)
   plot([a , 0, -a, 0, a], [0, b, 0, -b, 0], color=:green, lw=0.5)
   circle2(r3 + r1, 0, r1)
   circle22(0, r3 + r2, r2, :blue)
   circle(0, 0, r3, :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(a, 0, " a", :green, :left, :vcenter)
       point(0, b, "b", :green, :center, :bottom, delta=delta)
       point(r3 + r1, 0, "大円:r1\n(r3+r1,0)", :red, :center, delta=-delta)
       point(0, r3 + r2, "中円:r2\n(0,r3+r2)", :blue, :center, :bottom, delta=delta)
       point(0, 0, "小円:r3,(0,0)", :magenta, :right, :vcenter, deltax=-7delta)
   end  
end;

draw(12/2, 5/2, true)

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

算額(その2092)

2024年09月14日 | Julia

算額(その2092)

百四十四 群馬県勢多郡宮城村柏倉 諏訪神社 (1914)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円6個,直線上

直線上にある大円 3 個が交わっている。隙間に 3 個の小円を容れる。大円の直径が与えられたとき,小円の直径を得る術を述べよ。

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

include("julia-source.txt");

using SymPy
@syms r1::positive, r2::positive;

eq = 2(r1 - r2)^2 - (r1 + r2)^2
res = solve(eq, r2)[1]  # 1 of 2
res |> println

   r1*(3 - 2*sqrt(2))

小円の半径 r2 は,大円の半径 r1 の (3 - 2√2) 倍である。
大円の直径が 1 寸のとき,小円の直径は (3 - 2√2) = 0.1715728752538097 寸である。

function draw(r1, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = r1*(3 - 2√2)
   @printf("大円の直径が %g のとき,小円の直径は %g である。\n", 2r1, 2r2)
   plot()
   circle(0, 0, r1)
   circle2(r1 - r2, 0, r1)
   circle(0, 0, r2, :blue)
   circle22(0, r1 - r2, r2, :blue)
   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(r1 - r2, 0, "大円:r1\n(r1-r2,0)", :red, :right, :vcenter, deltax=-delta)
       point(0, r1 - r2, "小円:r2,(0,r1-r2)", :blue, :center, :bottom, delta=7delta)
       point(r2, 0, "r2 ", :blue, :right, :vcenter)
   end  
end;

draw(1/2, true)

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

算額(その2091)

2024年09月14日 | Julia

算額(その2091)

百四十一 群馬県藤岡市鮎川 北野神社 明治24年(1891)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円1個,直角三角形,正方形

直角三角形と,その鈎(直角を挟む 2 辺のうち,短い方)を共有する正方形で区分される領域に黄円を描く。弦(直角三角形の斜辺)の長さが 6.5 寸のとき,黄円が最大になるのは鈎がどれほどのときか。

鈎が 0 に近づく場合,黄円の直径も 0 に近づく。鈎が「弦/√2」 に近づく場合,黄円の直径も 0 に近づく。両者の中ほど(真ん中ではない)のときに黄円の直径が最も大きくなる。

計算の都合上,左右反転させて図を描く。
鈎(正方形の一辺のながさ)を「鈎」
黄円の半径と中心座標を r, (a + r, 0)
股(直角を挟む 2 辺のうち,長い方)を「股」
弦を「弦」
正方形の辺と弦の交点座標を (a, c)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms 鈎::positive, 股::positive, 弦::positive,
     a::positive, c::positive, r::positive;
a = 鈎
eq1 = 鈎^2 + 股^2 - 弦^2
eq2 = c*股 - 鈎*(股 - a)
eq3 = (股 - a) + c - 弦*c/a - r
eq4 = dist2(股, 0, 0, 鈎, a + r, r, r)
res = solve([eq1, eq2, eq4], (r, 股, c))[1]

   ((-弦*sqrt(弦^2 - 鈎^2)*sqrt(弦^4 - 弦^2*鈎^2 - 2*弦^2*鈎*sqrt(弦^2 - 鈎^2) + 2*鈎^3*sqrt(弦^2 - 鈎^2)) + (弦^2 - 2*鈎^2)*(弦^2 - 鈎^2))/(2*(弦^2 - 鈎^2)^(3/2)), sqrt(弦^2 - 鈎^2), -鈎^2/sqrt(弦^2 - 鈎^2) + 鈎)

黄円の半径 r は,r = ((-弦*sqrt(弦^2 - 鈎^2)*sqrt(弦^4 - 弦^2*鈎^2 - 2*弦^2*鈎*sqrt(弦^2 - 鈎^2) + 2*鈎^3*sqrt(弦^2 - 鈎^2)) + (弦^2 - 2*鈎^2)*(弦^2 - 鈎^2))/(2*(弦^2 - 鈎^2)^(3/2)), sqrt(弦^2 - 鈎^2), -鈎^2/sqrt(弦^2 - 鈎^2) + 鈎) と表すことができる。

弦が 6.5 のとき,鈎と黄円の半径の関係は下図のようである。鈎が 2 〜 3 の範囲で黄円の半径 r が最大になる。

using Plots
pyplot(size=(300, 200), grid=false, aspectratio=:none, label="")
plot(res[1](弦 => 6.5), xlims=(0, 6.5/√2), xlabel="鈎", ylabel="r")
hline!([0])

黄円の半径が最大になるときの鈎の値を求めるには,r の式において,鈎で微分した導関数の値が 0 になるときの鈎の値を求めればよい。

solve(diff(res[1], 鈎), 鈎)[1] |> println

   弦*(-1/2 + sqrt(3)/2)

鈎が 弦*(√3 - 1)/2 のとき,黄円の半径(直径)は最大値を取る。
弦が 6.5 寸の場合には,鈎 = 6.5*(√3 - 1)/2 = 2.3791651245988508 のとき,半径 r は最大値 0.584868958605704 になる。
直径は 1.16973791721141 である。

res[1](弦 => 6.5, 鈎 => 2.3791651245988508) |> println
2res[1](弦 => 6.5, 鈎 => 2.3791651245988508) |> println

   0.584868958605704
   1.16973791721141

function draw(弦, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 鈎 = 弦*(√3 - 1)/2
   (r, 股, c) = ((-弦*sqrt(弦^2 - 鈎^2)*sqrt(弦^4 - 弦^2*鈎^2 - 2*弦^2*鈎*sqrt(弦^2 - 鈎^2) + 2*鈎^3*sqrt(弦^2 - 鈎^2)) + (弦^2 - 2*鈎^2)*(弦^2 - 鈎^2))/(2*(弦^2 - 鈎^2)^(3/2)), sqrt(弦^2 - 鈎^2), -鈎^2/sqrt(弦^2 - 鈎^2) + 鈎)
   @printf("弦(斜線)の長さが %g のとき,鈎(正方形の一辺の長さ)が %g のときに黄円の直径が最大値 %g になる。\n", 弦, 鈎, 2r)
   plot([0, a, a, 0, 0], [0, 0, a, a], color=:green, lw=0.5)
   circle(a + r, r, r)
   segment(0, 鈎, 股, 0, :blue)
   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, a, "a ", :green, :right, :bottom, delta=3delta)
       point(a, a, "(a,a)", :green, :right, :bottom, delta=delta)
       point(a, 0, "a", :green, :center, delta=-2delta)
       point(股, 0, "股", :blue, :center, delta=-2delta)
       point(a + r, r, "黄円:r\n(a+r,r)", :red, :center, delta=-2delta)
       δ = 3delta
       dimension_line(2delta, 鈎 + 3delta, 股 + 2delta, 3delta, "弦", delta=3delta, deltax=3delta)
       dimension_line(-4delta, 0, -4delta, 鈎, "鈎", deltax=-4delta)
       plot!(xlims=(-15delta, 股 + 3delta), ylims=(-9delta, 鈎 + 3delta))
   end  
end;

draw(6.5, true)

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

算額(その2090)

2024年09月14日 | Julia

算額(その2090)

百四十一 群馬県藤岡市鮎川 北野神社 明治24年(1891)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円4個,楕円

楕円の中に小円 2 個を容れる。小円はそれぞれが楕円と 2 点で接する。さらに,小円と外接する大円 2 個を描く。大円は互いに外接し,2 個の小円とも外接する。楕円の長径と短径,小円の直径が与えられた解き,大円の直径を求める術を述べよ。

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

eq1 は「算法助術の公式84」による。

include("julia-source.txt");

using SymPy
@syms a::positive, b::positive,
     r1::positive, r2::positive, x2::positive;
eq1 = x2^2 - (a^2 - b^2)*(b^2 - r2^2)/b^2
eq2 = x2^2 + r1^2 - (r1 + r2)^2
res = solve([eq1, eq2], (r1, x2))[1]

   (-(-a^2*b^2 + a^2*r2^2 + b^4)/(2*b^2*r2), sqrt(-(a - b)*(-b + r2))*sqrt(a + b)*sqrt(b + r2)/b)

res[1] |>  simplify |> println
res[2] |>  simplify |> println

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

たとえば,長径 = 6,短径 = 3,小円の直径 = 2 のとき,大円の半径は 1.375 である(直径は 2.75)。

a = 6/2; b = 3/2; r2 = 2/2
(a^2*b^2 - a^2*r2^2 - b^4)/(2*b^2*r2)

   1.375

function draw(a, b, r2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = (a^2*b^2 - a^2*r2^2 - b^4)/(2*b^2*r2)
   x2 = sqrt(a^2*b^2 - a^2*r2^2 - b^4 + b^2*r2^2)/b
   @printf("長径が %g,短径が %g,小円の直径が %g のとき,大円の直径は %g である。\n", 2a, 2b, 2r2, 2r1)
   plot()
   ellipse(0, 0, a, b, color=:blue)
   circle22(0, r1, r1, :green)
   circle2(x2, 0, r2)
   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, r1, "大円:r1,(0,r1)", :green, :center, delta=-delta)
       point(x2, 0, "小円:r2,(x,0)", :red, :center, delta=-delta)
       point(0, b, "b", :blue, :center, :bottom, delta=delta)
       point(a, 0, " a", :blue, :left, :vcenter)
   end  
end;

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

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

算額(その2089)

2024年09月13日 | Julia

算額(その2089)

百三十五 群馬県安中市鷺宮 咲前神社 明治20年(1887)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円4個,正方形,斜線

正方形の中に右上の頂点を通る斜線を引き,区分された領域に大円 1 個,等円 3 個を容れる。正方形の一辺の長さが 7.2 寸,大円の直径が 3.6 寸,斜線の長さが 9 寸のとき,等円の直径はいかほどか。

正方形の一辺の長さを a
斜線と正方形の下辺との交点を (b, 0)
大円の半径と中心座標を r1, (a - r1, r1)
等円の半径と中心座標を r2, (r2, y21), (x22, y22), (x23, a - r2)
とおき,以下の連立方程式を解く。

条件が 3 つあげられているが,斜線の長さと正方形の一辺の長さと大円の直径の間には以下に示される関係があり,それぞれを別々に,任意に設定できるものではない。
斜 = sqrt(a^2 + (a - b)^2)
a + (a - b) - 斜 = 2r1
a = 7.2,r1 = 3.6/2 のときには,斜 = 9 になるというだけのことである。

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

   (a^2 - 4*a*r1 + 2*r1^2)/(a - 2*r1)

a = 7.2,r1 = 3.6/2 のとき,b = 1.8, 斜 = 9 になる。

ans_b(a => 7.2, r1 => 3.6/2) |> println  # 斜 => 9)  

   1.80000000000000

sqrt(a^2 + (a - ans_b)^2)(a => 7.2, r1 => 3.6/2) |> println

   9.00000000000000

斜は a, r1 から計算される。

eq6 を b について解くと,b = (a^2 - 4*a*r1 + 2*r1^2)/(a - 2*r1) となる。

それ以外の値を与えると破綻する。

よって,与えられるべき条件はこの 3 つの条件の内の 2 個だけである。a と r1 を与えるのが自然であろう。以下では,a, r1 のみが与えられる一般解を求めることにする。

SymPy の solve() では解析解を求めることができないので,nlsolve() で数値解を求める。

include("julia-source.txt");

using SymPy
@syms a::positive, b::positive, r1::positive, r2::positive,
     y21::positive, x22::positivr, y22::positive, x23::positive;
eq1 = dist2(b, 0, a, a, r2, y21, r2)
eq2 = dist2(b, 0, a, a, x22, y22, r2)
eq3 = dist2(b, 0, a, a, x23, a - r2, r2)
eq4 = (x22 - r2)^2 + (y22 - y21)^2 -  4r2^2
eq5 = (x23 - x22)^2 + (a - r2 - y22)^2 - 4r2^2
eq6 = a + (a - b) - sqrt(a^2 + (a - b)^2) - 2r1;

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)
   (r2, y21, x22, y22, x23, b) = u
   return [
       a^2*b^2 - 2*a^2*b*r2 + 2*a^2*b*y21 - a^2*r2^2 - 2*a^2*r2*y21 + a^2*y21^2 - 2*a*b^2*y21 + 2*a*b*r2^2 + 2*a*b*r2*y21 - 2*a*b*y21^2 - b^2*r2^2 + b^2*y21^2,  # eq1
       a^2*b^2 - 2*a^2*b*x22 + 2*a^2*b*y22 - 2*a^2*r2^2 + a^2*x22^2 - 2*a^2*x22*y22 + a^2*y22^2 - 2*a*b^2*y22 + 2*a*b*r2^2 + 2*a*b*x22*y22 - 2*a*b*y22^2 - b^2*r2^2 + b^2*y22^2,  # eq2
       a*(a^3 - 2*a^2*r2 - 2*a^2*x23 + 2*a*b*r2 - a*r2^2 + 2*a*r2*x23 + a*x23^2 - 2*b*r2*x23),  # eq3
       -4*r2^2 + (-r2 + x22)^2 + (-y21 + y22)^2,  # eq4
       -4*r2^2 + (-x22 + x23)^2 + (a - r2 - y22)^2,  # eq5
       2*a - b - 2*r1 - sqrt(a^2 + (a - b)^2),  # eq6
   ]
end;

(a, r1) = (7.2, 3.6/2, 9)
iniv = BigFloat[1.3, 1.5, 2.9, 3.7, 4.5, 1.8]

res = nls(H, ini=iniv)

   ([1.3333333333333335, 1.6000000000000003, 2.9333333333333336, 3.7333333333333334, 4.533333333333334, 1.7999999999999998], true)

正方形の一辺の長さ,大円の直径,斜がそれぞれ 7.2, 3.6, 9 のとき,等円の直径は 8/3 ≒ 2.66667 である。

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

   a = 7.2;  r1 = 1.8;  斜 = 9;  r2 = 1.33333;  y21 = 1.6;  x22 = 2.93333;  y22 = 3.73333;  x23 = 4.53333;  b = 1.8

function draw(a, r1, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r2, y21, x22, y22, x23, b) = res[1]
   斜 = sqrt(a^2 + (a - b)^2)
   @printf("正方形の一辺の長さ,大円の直径,斜がそれぞれ %g, %g, %g のとき,等円の直径は %g である。\n", a, 2r1, 斜, 2r2)
   @printf("a = %g;  r1 = %g;  斜 = %g;  r2 = %g;  y21 = %g;  x22 = %g;  y22 = %g;  x23 = %g;  b = %g\n",
       a, r1, 斜, r2, y21, x22, y22, x23, b)
   plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:green, lw=0.5)
   circle(a - r1, r1, r1)
   circle(r2, y21, r2, :blue)
   circle(x22, y22, r2, :blue)
   circle(x23, a - r2, r2, :blue)
   segment(b, 0, a, a, :orange)
   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(7.2, 3.6/2, true)

以下の図は,正方形の一辺の長さ,大円の直径,斜がそれぞれ 7, 4, 9.66667 のときのもので,等円の直径は 2.29811 である。

    a = 7;  r1 = 2;  斜 = 9.66667;  r2 = 1.14906;  y21 = 2.52264;  x22 = 2.73396;  y22 = 4.18679;  x23 = 4.31887;  b = 0.333333

draw(7, 4/2, true)

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

算額(その2088)

2024年09月12日 | Julia

算額(その2088)

百八 群馬県邑楽郡板倉町板倉 雷電神社 慶応3年(1867)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円9個

大円,中円,小円が交わってできる区画に甲円,乙円,丙円を容れる。大円,小円の直径がそれぞれ 6 寸, 3 寸のとき,丙円の直径はいかほどか。

大円の半径と中心座標を r1, (2r2, 0)
中円の半径と中心座標を r2, (r2, 0); r2 = r4 + r5
小円の半径と中心座標を r3, (0, 0)
甲円の半径と中心座標を r4, (2r2 + r4, 0), (2r5 + r4, 0); r4 = r1/2
乙円の半径と中心座標を r5, (r5, 0), (-r5, 0); r5 = r3/2
丙円の半径と中心座標を r6, (x6, y6)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms r1::positive, r2::positive, r3::positive, r4::positive,
     r5::positive, r6::positivr, x6::positive, y6::positive;
r4 = r1/2
r5 = r3/2
r2 = r4 + r5
eq1 = (2r2 - x6)^2 + y6^2 - (r1 + r6)^2
eq2 = (r2 - x6)^2 + y6^2 - (r2 - r6)^2
eq3 = x6^2 + y6^2 - (r3 + r6)^2
res = solve([eq1, eq2, eq3], (r6, x6, y6))[1]

   (r1*r3/(2*(r1 + r3)), r3*(r1^2 + 5*r1*r3 + 2*r3^2)/(2*(r1 + r3)^2), r1*r3*sqrt(r1 + 2*r3)*sqrt(2*r1 + r3)/(r1 + r3)^2)

丙円の半径 r6 は,大円と小円の半径 r1, r3 の関数で,r1*r3/2(r1 + r3) である。
大円,小円の直径がそれぞれ 6 寸, 3 寸のとき,丙円の直径は 1 寸である。

r1 = 6/2
r3 = 3/2
r6 = r1*r3/2(r1 + r3)

   0.5

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

   r1 = 3;  r2 = 2.25;  r3 = 1.5;  r4 = 1.5;  r5 = 0.75;  r6 = 0.5;  x6 = 1.33333;  y6 = 1.49071

function draw(r1, r3, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r4 = r1/2
   r5 = r3/2
   r2 = r4 + r5
   (r6, x6, y6) = (r1*r3/(2*(r1 + r3)), r3*(r1^2 + 5*r1*r3 + 2*r3^2)/(2*(r1 + r3)^2), r1*r3*sqrt(r1 + 2*r3)*sqrt(2*r1 + r3)/(r1 + r3)^2)
   @printf("大円,小円の直径がそれぞれ %g, %g のとき,丙円の直径は %g である。\n", 2r1, 2r3, 2r6)
   @printf("r1 = %g;  r2 = %g;  r3 = %g;  r4 = %g;  r5 = %g;  r6 = %g;  x6 = %g;  y6 = %g\n", r1, r2, r3, r4, r5, r6, x6, y6)
   plot()
   circle(2r2, 0, r1, :green)
   circle(r2, 0, r2, :magenta)
   circle(0, 0, r3, :brown)
   circle(2r2 + r4, 0, r4)
   circle(2r5 + r4, 0, r4)
   circle2(r5, 0, r5, :blue)
   circle22(x6, y6, r6, :orange)
   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(2r2, 0, " 大円:r1,(2r2,0)", :green, :left, :bottom, delta=delta)
       point(r2, 0, "中円:r2,(2r2,0)", :magenta, :left, :bottom, delta=delta, deltax=-4delta)
       point(0, 0, "小円:r3  \n(0,0)  ", :brown, :right, :bottom, delta=delta/2)
       point(2r2 + r4, 0, "甲円:r4,(2r2+r4,0)", :red, :center, delta=-delta)
       point(2r5 + r4, 0, "甲円:r4,(2r5+r4,0)", :red, :center, delta=-delta)
       point(r5, 0, "乙円:r5\n(r5,0)", :blue, :center, delta=-delta)
       point(x6, y6, "丙円:r6,(x6,y6)", :orange, :left, :bottom, delta=delta)
   end  
end;

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

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

算額(その2087)

2024年09月12日 | Julia

算額(その2087)

九十三 群馬県安中市板鼻 鷹巣神社 安政5年(1858)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円3個,面積

大中小の 3 円が互いに接している。3 円の直径が与えられたとき,黒積(中央部分の面積)はいかほどか。

大円の半径と中心座標を r1, (0, 0)
中円の半径と中心座標を r2, (x2, y2)
小円の半径と中心座標を r3, (0, r1 + r3)
とおき,以下の連立方程式を解き,中円の中心座標を求める。

include("julia-source.txt");

using SymPy
@syms r1::positive, r2::positive, x2::positive,
     y2::positive, r3::positive;
eq1 = x2^2 + y2^2 - (r1 + r2)^2
eq2 = x2^2 + (r1 + r3 - y2)^2 - (r2 + r3)^2

res = solve([eq1, eq2], (x2, y2))[1]

   (2*sqrt(r1)*sqrt(r2)*sqrt(r3)*sqrt(r1 + r2 + r3)/(r1 + r3), (r1^2 + r1*r2 + r1*r3 - r2*r3)/(r1 + r3))

求める面積は 3 円の中心座標が構成する三角形の面積から,中心角が θ1,θ2,θ3 の 3 円の扇形の面積を差し引いたものである。

(x2, y2) = (res[1], res[2])

θ1 = atand(x2, y2)
θ2 = acosd(((r1 + r2)^2 + (r2 + r3)^2 - (r1 + r3)^2)/(2(r1 + r2)*(r2 + r3)))
θ3 = 180 - θ1 - θ2

S = (r1 + r3)*x2/2 - (r1^2*θ1 + r2^2*θ2 + r3^2*θ3)*pi/360;

大円,中円,小円の直径がそれぞれ 10 寸,6 寸,4 寸のとき,黒積は 1.41639227322922 である。

S(r1 => 10/2, r2 => 6/2, r3 => 4/2).evalf() |> println

   1.41639227322922

function draw(r1, r2, r3, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x2, y2) = (2*sqrt(r1)*sqrt(r2)*sqrt(r3)*sqrt(r1 + r2 + r3)/(r1 + r3), (r1^2 + r1*r2 + r1*r3 - r2*r3)/(r1 + r3))
   θ1 = atand(x2, y2)
   θ2 = acosd(((r1 + r2)^2 + (r2 + r3)^2 - (r1 + r3)^2)/(2(r1 + r2)*(r2 + r3)))
   θ3 = 180 - θ1 - θ2
   S = (r1 + r3)*x2/2 - (r1^2*θ1 + r2^2*θ2 + r3^2*θ3)*pi/360
   @printf("大円,中円,小円の直径がそれぞれ %g, %g, %g のとき,黒積は %g である。\n", 2r1, 2r2, 2r3, S)
   @printf("r1 = %g;  r2 = %g;  r3 = %g;  x2 = %g;  y2 = %g\n", r1, r2, r3, x2, y2)
   plot([0, x2, 0, 0], [0, y2, r1 + r3, 0], color=:black, lw=0.5, seriestype=:shape, fillcolor=:gray70)
   circlef(0, 0, r1, :white)
   circle(0, 0, r1)
   circle(0, 0, 0.15r1, beginangle=90 - θ1, endangle=90, lw=2)
   circlef(x2, y2, r2, :white)
   circle(x2, y2, r2, :blue)
   circle(x2, y2, 0.15r1, :blue, beginangle=90 + θ3, endangle=90 + θ3 + θ2, lw=2)
   circlef(0, r1 + r3, r3, :white)
   circle(0, r1 + r3, r3, :green)
   circle(0, r1 + r3, 0.15r1, :green, beginangle=270, endangle=270 + θ3, lw=2)
   plot!([0, x2, 0, 0], [0, y2, r1 + r3, 0], color=:black, 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(delta/2, 4delta, "θ1", :red, :left, :bottom, delta=delta, mark=false)
       point(0, 0, "大円:r1,(0, 0)", :red, :center, delta=-delta/2)
       point(x2 - 5delta, y2 - 2delta, "θ2", :blue, :right, :vcenter, mark=false)
       point(x2, y2, "中円:r2,(x2,y2)", :blue, :center, delta=4delta, deltax=delta)
       point(3.5delta, r1 + r3 - 5delta, "θ3", :green, :right, :vcenter, mark=false)
       point(0, r1 + r3, "小円:r3,(0,r1+r3)", :green, :center, :bottom, delta=delta)
   end

end;

draw(10/2, 6/2, 4/2, true)

 

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

算額(その2086)

2024年09月12日 | Julia

算額(その2086)

九十一 群馬県富岡市一ノ宮 貫前神社 安政5年(1858)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円6個,外円,半円

巽円(外円)の中に乾円と半乾円を 1 個ずつ,坤円 2 個,艮円 2 個を容れる。巽円の直径が与えられたとき,乾円,坤円,艮円の直径を求める術を述べよ。

巽円の半径と中心座標を R, (0, 0)
乾円の半径と中心座標を r1, (0, R - r1)
坤円の半径と中心座標を r2, (x2, y2); y2 = R - 2r1
艮円の半径と中心座標を r3, (x3, y3); x3 = x2, y3 = -br1
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms R::positive, r1::positive, r2::positive,
     x2::positive, y2::negative, r3::positive,
     x3::positive, y3::negative;
y2 = R - 2r1
x3 = x2
y3 = -r1
eq1 = x2^2 + r1^2 - (r1 + r2)^2 |> expand
eq2 = x3^2 + (y3 - (R - 3r1))^2 - (r1 + r3)^2 |> expand
eq3 = x2^2 + y2^2 - (R - r2)^2 |> expand
eq4 = r1^2 + (R - 3r1)^2 - R^2
res = solve([eq1, eq2, eq3, eq4], (r1, r2, r3, x2))[1]

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

乾円,坤円,艮円の直径はそれぞれ,巽円の直径の 3/5, 3/10, 1/10 倍である。

巽円の直径が 20 寸のとき,すべてのパラメータは以下のとおりである。

   R = 10;  r1 = 6;  r2 = 3;  r3 = 1;  x2 = 6.7082;  y2 = -2;  x3 = 6.7082;  y3 = -6

function draw(R, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2, r3, x2) = R.*(3/5, 3/10, 1/10, 3√5/10)
   y2 = R - 2r1
   x3 = x2
   y3 = -r1
   @printf("R = %g;  r1 = %g;  r2 = %g;  r3 = %g;  x2 = %g;  y2 = %g;  x3 = %g;  y3 = %g\n", R, r1, r2, r3, x2, y2, x3, y3)
   plot()
   circle(0, 0, R, :magenta)
   circle(0, R - r1, r1)
   circle(0, R - 3r1, r1, beginangle=0, endangle=180)
   circle2(x2, y2, r2, :blue)
   circle2(x3, y3, r3, :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)
       point(0, R - r1, "乾円:r1,(0,R-r1)", :red, :center, delta=-delta/2)
       point(x2, y2, "坤円:r2,(x2,y2)", :blue, :center, delta=-delta/2)
       point(x3, y3, "艮円:r3,(x3,y3)", :green, :center, delta=-delta/2)
       point(x3, y3, "艮円:r3,(x3,y3)", :green, :center, delta=-delta/2)
       point(0, R, "R", :magenta, :center, :bottom, delta=delta/2)
       point(r1, R - 3r1, "(r1,R-3r1) ", :magenta, :right, :vcenter)
   end

end;

draw(20/2, true)

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

算額(その2085)

2024年09月11日 | Julia

算額(その2085)

八十四 群馬県渋川市川島 甲波宿袮神社 安政3年(1856)
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.
キーワード:円4個,直角三角形

直角三角形の中に,全円 1 個,等円 3 個を容れる。等円の直径が 4 寸,全円の直径と股の差が 8 寸のとき,股はいかほどか。

鈎,股をそのまま「鈎」,「股」
全円の半径と中心座標を r1, (股 - r1, r1)
等円の半径と中心座標を r2, (股 - r2, r2), (股 - 3r2, r2), (股 - 5r2, r2)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

using SymPy
@syms 鈎::positive, 股::positive, r1::positive,
     r2::positive, 差::positive;
eq1 = 股 - 2r1 - 差
eq2 = dist2(0, 0, 股, 鈎, 股 - 5r2, r2, r2)/鈎
eq3 = dist2(0, 0, 股, 鈎, 股 - r1, r1, r1)/(鈎*股);
res = solve([eq1, eq2, eq3], (股, 鈎, r1))[4]  # 4 of 4

   (3*r2 + 差/2 + sqrt(36*r2^2 - 4*r2*差 + 差^2)/2, 9*r2^2/差 + r2 + 3*r2*sqrt(36*r2^2 - 4*r2*差 + 差^2)/(2*差) - 差/4 + sqrt(36*r2^2 - 4*r2*差 + 差^2)/4, 3*r2/2 - 差/4 + sqrt(36*r2^2 - 4*r2*差 + 差^2)/4)

股は以下の式で計算できる。

res[1]

等円の直径が 4 寸,全円の直径と股の差が 8 寸のとき,股は 16 寸である。

res[2](差 => 8, r2 => 4//2)

   16

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

   r2 = 2;  鈎 = 12;  股 = 16;  r1 = 4

function draw(r2, 差, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (股, 鈎, r1) = (3*r2 + 差/2 + sqrt(36*r2^2 - 4*r2*差 + 差^2)/2, 9*r2^2/差 + r2 + 3*r2*sqrt(36*r2^2 - 4*r2*差 + 差^2)/(2*差) - 差/4 + sqrt(36*r2^2 - 4*r2*差 + 差^2)/4, 3*r2/2 - 差/4 + sqrt(36*r2^2 - 4*r2*差 + 差^2)/4)
   @printf("等円の直径が %g のとき,股は %g である。\n", 2r2, 股)
   @printf("r2 = %g;  鈎 = %g;  股 = %g;  r1 = %g\n", r2, 鈎, 股, r1)
   plot([0, 股, 股, 0], [0, 0, 鈎, 0], color=:green, lw=0.5)
   circle(股 - r1, r1, r1)
   circle(股 - 5r2, r2, r2, :blue)
   circle(股 - 3r2, r2, r2, :blue)
   circle(股 - r2, r2, r2, :blue)
   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(股 - r1, r1, "全円:r1,(股-r1,r1)", :red, :center, :bottom, delta=delta)
       point(股 - r2, r2, "等円:r2\n(股-r2,r2)", :blue, :center, :bottom, delta=delta)
       point(股 - 3r2, r2, "等円:r2\n(股-3r2,r2)", :blue, :center, :bottom, delta=delta)
       point(股 - 5r2, r2, "等円:r2\n(股-5r2,r2)", :blue, :center, :bottom, delta=delta)
       point(股, 鈎, "(股,鈎)", :green, :right, :bottom, delta=delta)
   end

end;

draw(4/2, 8, true)

 

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

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

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