裏 RjpWiki

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

さぬきうどん 上原屋本店

2024年11月14日 | さぬきうどん

高松市栗林町 さぬきうどん 上原屋本店
やや細麺で,掛けうどんにしたこともあるだろうが柔らかくもちもちした麺
かき揚げの大きさに驚く😲

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

算額(その1401)

2024年11月14日 | Julia

算額(その1401)

二十三 一関市萩荘字八幡 達子袋八幡神社 弘化3年(1846)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.

http://www.wasan.jp/yamamura/yamamura.html
キーワード:三角形,面積
#Julia, #SymPy, #算額, #和算

三角形が 2 つの頂点とそれぞれの対辺上の一点を結ぶ斜線により 4 分割されている。黄色,青,赤の三角形の面積が等しくなる(等積と呼ぶ)ようにする術を述べよ。

3つの頂点の座標を (0, 0), (a, 0), (x2, y2)
斜線の交点座標を (x0, y0)
斜線と斜辺と底辺の交点の座標を (x3, y3), (x4, 0)
黄,青,赤,灰の三角形の面積を S1, S2, S3, S4
とおき,それぞれは最終的に a, x2, y2 のみを含む式であらわす。
x0, y0 を求めるには S1 = S2, S1 = S3 の二元連立方程式を解く。

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

@syms x0, y0, a, x2, y2, x3, y3, x4
(x3, y3) = intersection(a, 0, x0, y0, 0, 0, x2, y2)
x3 = a*x2*y0/(a*y2 - x0*y2 + x2*y0)
y3 = a*y0*y2/(a*y2 - x0*y2 + x2*y0)
x4 = (-x0*y2 + x2*y0)/(y0 - y2)
S = a*y2/2
S2 = (a - x4)*y0/2
S1 = a*y3/2 - S2
S3 = (a - x4)*y2/2 - S2
eq1 = S1 - S2
eq2 = S2 - S3
eq1 |> println
eq2 |> println

   a^2*y0*y2/(2*(a*y2 - x0*y2 + x2*y0)) - y0*(a - (-x0*y2 + x2*y0)/(y0 - y2))
   y0*(a - (-x0*y2 + x2*y0)/(y0 - y2)) - y2*(a - (-x0*y2 + x2*y0)/(y0 - y2))/2

res = solve([eq1, eq2], (x0, y0))[1]  # 1 of 2

   (-sqrt(5)*a/4 + 3*a/4 + x2/2, y2/2)

3 つの面積が等しくなるようにするには,(原点以外の)2 つの頂点から (-sqrt(5)*a/4 + 3*a/4 + x2/2, y2/2) を通る斜線を引けばよい。
a = 10, x2 = 3, y2 = 5 のときは,(3.4098300562505255, 2.5) である。
このとき,x3, y3, x4 は
a*x2*y0/(a*y2 - x0*y2 + x2*y0) = 1.8541019662496845
a*y0*y2/(a*y2 - x0*y2 + x2*y0) = 3.090169943749474
(-x0*y2 + x2*y0)/(y0 - y2) = 3.819660112501052
である。

等積が全体の面積の何倍かは,
全体の面積 = S = S1 + S2 + S3 + S4, 等積 = S0 = S1 = S2 = S3 とすれば,
等積/全体の面積 = S0/S = (√5 - 1)/4
すなわわち,等積は全体の面積の (√5 - 1)/4 倍であることがわかる。

S = a*y2/2
x4 = (-x0*y2 + x2*y0)/(y0 - y2)
S2 = (a - x4)*y0/2
S2(x0 => res[1], y0 => res[2])/S |> simplify |> println

   -1/4 + sqrt(5)/4

等積が実際にはいくつかを知るには,底辺と高さがわかっていれば以下のようにすればよい。

S = a*y2/2
S0 = S * ((√5 -1)/4)
S0(a => 10, y2 => 5) |> println

   7.72542485937369

3 辺の長さが分かっているときはヘロンの公式を使い,以下のようにすればよい。

@syms a, b, c
s = (a + b + c)/2
S = sqrt(s*(s - a)*(s - b)*(s -c))
S0 = S * ((√5 -1)/4)
S0(a => 10, b => sqrt(3^2 + 5^2), c => sqrt(7^2 + 5^2)) |> println

   7.72542485937369

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

S = 25.0, S1 = 7.725424859373685, S2 = 7.725424859373685, S3 = 7.725424859373685, S4 = 1.8237254218789438
a = 10;  b = 5.83095;  c = 8.60233;  x2 = 3;  y2 = 5;  x0 = 3.40983;  y0 = 2.5;  x3 = 1.8541;  y3 = 3.09017;  x4 = 3.81966

function draw(a, x2, y2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   b = sqrt(x2^2 + y2^2)
   c = sqrt((a - x2)^2 + y2^2)
   (x0, y0) = (-sqrt(5)*a/4 + 3*a/4 + x2/2, y2/2)
   x3 = a*x2*y0/(a*y2 - x0*y2 + x2*y0)
   y3 = a*y0*y2/(a*y2 - x0*y2 + x2*y0)
   x4 = (-x0*y2 + x2*y0)/(y0 - y2)
   S = a*y2/2
   S2 = (a - x4)*y0/2
   S1 = a*y3/2 - S2
   S3 = (a - x4)*y2/2 - S2
   S4 = x4*y2/2 - S1
   S123 = (S - S4)/3
   println("S = $S, S1 = $S1, S2 = $S2, S3 = $S3, S4 = $S4") 
   @printf("a = %g;  b = %g;  c = %g;  x2 = %g;  y2 = %g;  x0 = %g;  y0 = %g;  x3 = %g;  y3 = %g;  x4 = %g\n", a, b, c, x2, y2, x0, y0, x3, y3, x4)
   #plot([0, a, x2, 0], [0, 0, y2, 0], color=:green, lw=0.5)
   plot([0, x4, x0, x3, 0], [0, 0, y0, y3, 0], color=:orange, seriestype=:shape, fillcolor=:orange, alpha=0.2)
   plot!([x4, a, x0, x4], [0, 0, y0, 0], color=:blue, seriestype=:shape, fillcolor=:blue, alpha=0.2)
   plot!([x0, a, x2, x0], [y0, 0, y2, y0], color=:red, seriestype=:shape, fillcolor=:red, alpha=0.2)
   plot!([x3, x0, x2, x3], [y3, y0, y2, y3], color=:black, seriestype=:shape, fillcolor=:black, alpha=0.2)
   segment(a, 0, x3, y3)
   segment(x4, 0, x2, y2)
   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(x3, y3, "(x3,y3) ", :black, :right, :vcenter)
       point(x0, y0, " (x0,y0)", :black, :left, :bottom)
       point(x4, 0, "x4", :black, :center, delta=-2delta)
       point(a, 0, "a", :black, :center, delta=-2delta)
       point(x2, y2, " (x2,y2)", :black, :left, :bottom)
       point(x4/2, y0/2, "S1", :darkgoldenrod, mark=false)
       point(x4 + (a - x4)/5, y0/2, "S2", :blue, mark=false)
       point(x4 + (a - x4)/5, 0.6y2, "S3", :red, mark=false)
       point(0.65x4, 0.7y2, "S4", :black, mark=false)
       ylims!(-8delta, y2 + 2delta)
   end  
end;

draw(10, 3, 5, true)

 

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

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

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