裏 RjpWiki

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

大学入学共通テスト2023のIIBの問1(2)

2023年01月19日 | Julia

 

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

算額(その102)

2023年01月19日 | Julia

算額(その102)

東京都千代田区 神田明神 平成30年(2018)3月
http://www.wasan.jp/tokyo/kanda.html

一辺が二の正五角形の頂点を結んでできた星の中に等円が六個入っている。等円一つの面積を求めよ。

一辺が二ということは,下図のように座標を決め,五角形が内接する円の半径を r とすると,r = 1 / sin(36/180*π)
更に,x1 = 2r1*cos(18/180*π), y1 = 2r1*sin(18/180*π)

「点 (x1, y1) から 直線 AB までの距離が等円の半径 r1 に等しい」とする方程式を解いて,r1 を得る。

using SymPy

function distance(x1, y1, x2, y2, x0, y0)
p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
l = sympy.Line(p1, p2)
l.distance(sympy.Point(x0, y0))
end;

@syms r, x1, y1, r1;
r = 1 / sind(Sym(36));
x1 = 2r1*cosd(Sym(18));
y1 = 2r1*sind(Sym(18));
eq1 = distance(r*cosd(Sym(18)), r*sind(Sym(18)), -r*cosd(Sym(18)), r*sind(Sym(18)), x1, y1) - r1;

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

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

r1.evalf() |> println

   0.324919696232906

小円の面積は以下の通り。

(r1^2 * π).evalf() |>  println

   0.331666761173503

算額の答えは,「1 引く,2 を 平方根 5 で割,次数のπ倍」とあり,次数って何?また,π倍のパイが若干読み取りにくかったが,
1 - 2/√5 が r1^2 であることがわかれば,等円の面積は (1 - 2/√5)* π ということだ。r1 = √(1 - 2/√5) である。

r1 = (-(5 - 3*sqrt(5))*sqrt(5 - sqrt(5))*(-3*sqrt(2) + sqrt(10)) + 4*(-5 + 3*sqrt(5))*sqrt(5 - 2*sqrt(5)))/(2*(5 - 3*sqrt(5))^2) は簡単にならないが,r1^2 は簡単になる。実に短く 1 - 2/√5 である。

昔の算額は円の径を求めるものが多く,面積を求めるものは少ない。この問題が面積を求めるのには,そういう理由があったのだなと感動した。

r12 = expand(r1^2) |> simplify |> sympy.sqrtdenest |> simplify |>  println

   1 - 2*sqrt(5)/5

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
  θ = beginangle:0.1:endangle
  x = r.*cosd.(θ)
  y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
   plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = 1 / sind(36)
   r1 = sqrt(1 - 2/sqrt(5))
   println("r1 = $r1, S = $(π * r1^2)")
   plot()
   circle(0, 0, r)
   θ = 18:72:378
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(x, y, color=:black, lw=0.5)
   circle(0, 0, r1, :blue)
   for i in 1:5
       j = (i + 1) % 5 + 1
       segment(x[i], y[i], x[j], y[j])
       x1 = 2r1 * cosd(θ[i])
       y1 = 2r1 * sind(θ[i])
       circle(x1, y1, r1, :red)
   end
    if more
       x1 = 2r1*cosd(18)
       y1 = 2r1*sind(18)
       info = @sprintf("r1 = %.3f, 等円の面積 = %.3f\nx1 = %.3f, y1 = %.3f\n", r1, π*r1^2, x1, y1)
       point(-0.8, -1.4, info, :black, :left, mark=false)
       point(0, 0, "0 ", :red, :right)
       point(x[1], y[1], " A", :blue)
       point(-x[1], y[1], "B ", :blue, :right)
       point(2r1 * cosd(θ[1]), 2r1 * sind(θ[1]), "(x1,y1)", :blue, :center)
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
    end
end;

draw(true)
savefig("fig1.png")

   r1 = 0.32491969623290634, S = 0.3316667611735027

using Plots
function draw()
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = 1 / sind(36)
   r1 = sqrt(1 - 2/sqrt(5))
   plot(showaxis=false)
   #circle(0, 0, r)
   θ = 18:72:378
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   plot!(x, y, color=:black, lw=0.5)
   circle(0, 0, r1, :red, fill=true)
   r2 = r*sind(18)/cosd(36)
   for i in 1:5
       j = i + 1
       #point(r2*cosd(θ[i]+36), r2*sind(θ[i]+36), string(i))
       #point(x[i], y[i], string(10+i))
       plot!([x[i], x[j], r2*cosd(θ[i]+36), x[i]], [y[i], y[j], r2*sind(θ[i]+36), y[i]], seriestype=:shape, fillcolor=:blue)
       #segment(x[1], y[1], x[3], y[3])
       x1 = 2r1 * cosd(θ[i])
       y1 = 2r1 * sind(θ[i])
       circle(x1, y1, r1, :red, fill=true)
   end
end;

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

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

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