裏 RjpWiki

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

算額(その855)改訂版

2025年01月06日 | Julia

算額(その855)改訂版

算額(その855)」は依拠した図に誤りがあるので,改訂版を書いた。

三十 岩手県一関市山ノ目 配志和神社 嘉永5年(1848)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

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

今有如図 03044
https://w.atwiki.jp/sangaku/pages/315.html

キーワード:円4個,正方形,面積
#Julia, #SymPy, #算額, #和算

正方形の中に等円 4 個を容れる。等円の直径が 1 寸のとき,図で示す部分の面積(赤積)はいかほどか。

山村の図は間違っているので,改訂版を書く。

正方形の一辺の長さを a,等円の半径を r とおく。
以下の方程式をとき,等円の直径が既知の場合の正方形の一辺の長さを求める。

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

using SymPy
@syms  a::positive, r::positive
eq = ((a - r) - 2r)^2 + ((a - r) - (1 + √Sym(3))r)^2 - 4r^2;
res = solve(eq, a)[2]
res |> println

    r*(sqrt(3) + 3)

等円の半径が r のとき,正方形の一辺の長さは a = r*(3 + √3) である。

B, C, D 円の中心座標を (bx, by), (cx, cy), (dx, dy) などとする。

a = r*(√Sym(3) + 3)
(bx, by) = (3r, r)
(cx, cy) = (2r, (1 + √Sym(3))r)
(dx, dy) = (a - r, a - r)
(ex, ey) = (3r, 0)
(fx, fy) = (a, a - r)
(gx, gy) = (a, 0);

∠FDC = 150°,∠DCB = 90°,∠EBC = 210° である。
赤積は,多角形GFDCBE から B円の 210/360,C円の 90/360,D円の150/360 を差し引いたものである。

多角形の面積 = ((fx - dx) + (fx - cx))*(fy - cy)/2 + ((fx - cx) + (fx - bx))*(cy - by)/2 + (gx - bx)*(by - ey)  |> simplify
多角形の面積 |> println

    2*r^2*(sqrt(3) + 2)

扇形3個の面積 = PI*r^2*(150 + 90 + 210)/360
扇形3個の面積 |> println

    5*pi*r^2/4

赤積 = 多角形の面積 - 扇形3個の面積 |> factor
赤積 |> println

    -r^2*(-16 - 8*sqrt(3) + 5*pi)/4

赤積は,等円の半径の二乗の (16 + 8√3 - 5π)/4 倍である。

等円の直径が 1 寸のときに多角形の面積,扇型の面積,赤積を求める。

多角形の面積(r => 1//2).evalf() |> println
扇形3個の面積(r => 1//2).evalf() |> println
赤積(r => 1//2).evalf() |> println

    1.86602540378444
    0.981747704246810
    0.884277699537628

r = 0.5, a = 2.3660254037844384
多角形の面積 = 1.866025403784438
扇形3個の面積 = 0.9817477042468103
赤積 = 0.8842776995376276

術は等円の直径を用いた式で,上述の式と同じである。

@syms 直径, 円周率, 円積率, 半径
# 直径 = 1
#円周率 = 3.1416
#円周率 = π
円積率 = 円周率/4
直径 = 2半径
# (sqrt(0.75) + 1 - 円積率*1.25)*直径^2
(sqrt(Sym(3)/4) + 1 - 円積率*(Sym(5)/4))*直径^2 |> simplify |> println

    半径^2*(-5*円周率 + 8*sqrt(3) + 16)/4

function draw(r, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    a = r*(√3 + 3)
    (ax, ay) = (r, r)
    (bx, by) = (3r, r)
    (cx, cy) = (2r, (1 + √3)r)
    (dx, dy) = (a - r, a - r)
    (ex, ey) = (3r, 0)
    (fx, fy) = (a, a - r)
    (gx, gy) = (a, 0)
    多角形の面積 = ((fx - dx) + (fx - cx))*(fy - cy)/2 + ((fx - cx) + (fx - bx))*(cy - by)/2 + (gx - bx)*(by - ey)
    扇形3個の面積 = π*r^2*(150 + 90 + 210)/360
    赤積 = 多角形の面積 - 扇形3個の面積
    println("r = $r, a = $a, 多角形の面積 = $多角形の面積, 扇形3個の面積 = $扇形3個の面積, 赤積 = $赤積")
    plot([0, a, a, 0, 0], [0, 0, a, a, 0], color=:green, lw=0.5)
    plot!([gx, fx, dx, cx, bx, ex, gx], [gy, fy, dy, cy, by, ey, gy], color=:red, fillcolor=:red, seriestype=:shape)
    circlef(r, r, r, :white)
    circlef(2r, (1 + √3)*r, r, :white)
    circlef(a - r, a - r, r, :white)
    circlef(3r, r, r, :white)
    circle(r, r, r, :blue)
    circle(2r, (1 + √3)*r, r, :blue)
    circle(a - r, a - r, r, :blue)
    circle(3r, r, r, :blue)
    plot!([gx, fx, dx, cx, bx, ex, gx], [gy, fy, dy, cy, by, ey, gy], color=:gray80)
    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(ax, ay, " A", :blue, :left, :vcenter)
        point(bx, by, " B", :blue, :left, :vcenter)
        point(cx, cy, "C ", :blue, :right, :vcenter)
        point(dx, dy, "D", :blue, :left, :bottom, delta=delta/2)
        point(ex, ey, "E", :blue, :left, delta=-delta)
        point(fx, fy, " F", :blue, :left, :vcenter)
        point(gx, gy, "G", :blue, :left, delta=-delta)
        plot!(xlims=(-5delta, a + 5delta), ylims=(-5delta, a + 5delta))
    end
end;

draw(1/2, true)

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

算額(その1521)

2025年01月06日 | Julia

算額(その1521)

二十八 一関市萩荘 赤萩観音寺 天保2年(1831)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

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

今有如図 03025
https://w.atwiki.jp/sangaku/pages/143.html

キーワード:円5個,直線上
#Julia, #SymPy, #算額, #和算

問:今有如図直線上下添大円其交容小円二個只謂小円径一寸問大円径幾何

直線の上に互いに外接する大円 2 個が載っており,その大円 2 個に下側から外接する大円が 1 個ある。
左右の大円と直線および下の大円が作る隙間に小円が左右に 2 個ある。
小円の直径が 1 寸のとき,大円の直径はいかほどか。

村山の図は本人自身も問がどのような図形を表現しているのかわからなかったのであろう。図には,あるはずの直線が描かれておらず,そんな描写はないにも関わらず 3 個の大円を内接する四辺形が描かれており(しかも四辺形は正方形であるとして「方」という文字を書き添え,結果として問題をややこしくしている),また,小円の位置は不適切だ。不適切にも程がある。

「今有如図」はちゃんとした図を示している。この図があれば,解を求めるのは簡単である。

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

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

using SymPy
@syms r1::positive, r2::positive, x2::positive
eq1 = x2^2 + ((r2 - r1) + √Sym(3)*r1)^2 - (r1 + r2)^2
# eq1 = x2^2 + ((r2 - r1) + √3*r1)^2 - (r1 + r2)^2  # 記号計算を行わない場合
eq2 = (x2 - r1)^2 + (r2 - r1)^2 - (r1 + r2)^2
res = solve([eq1, eq2], (r1, x2))[1];

大円の半径は以下のようになる。桁数の大きい整数係数を持つ,二重根号を含む長い式になる。

res[1] |> println

    (-25413135*sqrt(3)*r2 + 44016841*r2 + (-28103451 + 16225535*sqrt(3))*(4*sqrt(3)*r2 + 7*r2 - 4*sqrt(2)*r2*sqrt(1939428460839052729369227845122062114242 - 1119729543939448663603914987253430016841*sqrt(3))/(164355571104683741015 - 94890733220103835857*sqrt(3))))*(4*sqrt(3)*r2 + 7*r2 - 4*sqrt(2)*r2*sqrt(1939428460839052729369227845122062114242 - 1119729543939448663603914987253430016841*sqrt(3))/(164355571104683741015 - 94890733220103835857*sqrt(3)))^2/(2*r2^2*(36060146 - 20819335*sqrt(3)))

SymPy では自動的に簡約化できないので,SymPy の手を借りながら手作業で簡約化する。
まず二重根号を外すと,4 つの項に分解される。

ans_r1 = res[1] |> sympy.sqrtdenest;

それぞれの項を個別に簡約化すると以下のようになる。

t1 = ans_r1.args[1] |> simplify
t1 |> println

    3008680048456320*sqrt(3)*r2/121 + 5211186707645184*r2/121

t2 = ans_r1.args[2] |> simplify
t2 |> println

    -3008680048441074*sqrt(3)*r2/121 - 5211186707618685*r2/121

t3 = ans_r1.args[3] |> simplify
t3 |> println

    52055161703399520*r2/121 + 30054061622167230*sqrt(3)*r2/121

t4 = ans_r1.args[4] |> simplify
t4 |> println

    -52055161703423478*r2/121 - 30054061622181024*sqrt(3)*r2/121

4 項を足し合わせ,更に簡約化すると, r1 = 3*r2*(4*sqrt(3) + 7) = r2*3(4√3 + 7) = r2*(12√3 + 21) = r2*(√432 + 21) となる。

最後の式は,術に述べられているものである。すなわち,「432 の平方根に 21 を加え,小円の直径を掛けると大円の直径が得られる」。

t1 + t2 + t3 + t4 |> simplify |> println

    3*r2*(4*sqrt(3) + 7)

大円の半径 r1 は,小円の半径 r2 の (√432 + 21) 倍である。
小円の直径が 1 寸のとき,大円の直径は √432 + 21 = 41.78460969082653 寸である。

もちろん方程式を解いて得られた解に直接 r2 = 1/2 を代入して 2 倍すれば,上のように迂遠な手順を踏まなくても大円の直径が得られる。

2res[1](r2 => 1/2).evalf() |> println

    41.7846096908265

なお,当初の方程式 eq1 を,eq1 = x2^2 + ((r2 - r1) + √3*r1)^2 - (r1 + r2)^2 とすれば,記号計算は行われず 41.7846096908267*r2 という解が得られる。

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

draw(1/2, true)

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

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

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