裏 RjpWiki

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

Julia 1.6.3/M1-chip で RCall 使用できるようになった

2021年11月08日 | ブログラミング

Julia 1.6.3
R 4.1.1
macOS Monterey 12.0.1
M1 chip Mac mini 2020

で,RCall が使えなくなっていたが,R 4.1.2 にバージョンアップしたら使えるようになった。

julia> using RCall
[ Info: Precompiling RCall [6f49c342-dc21-5d91-9882-a32aef131414]

julia> R"sqrt(8)"
RObject{RealSxp}
[1] 2.828427


julia> R"""
       x = 3
       y = 7
       print(x * y)
       """
[1] 21
RObject{RealSxp}
[1] 21

でも,Julia 1.7.0-rc2 ではまだ使えない

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

2020 年日本数学オリンピック予選 問題6

2021年11月08日 | ブログラミング

2020 年日本数学オリンピック予選 問題6
https://www.imojp.org/archive/mo2020/jmo2020/problems/jmo30yq.html

Q6. 平面上に 3 つの正方形があり,図のようにそれぞれ 4 つの頂点のうち 2 つの頂点を他の正方形と共有している。ここで,最も小さい正方形の対角線を延長した直線は最も大きい正方形の左下の頂点を通っている。最も小さい正方形と最も大きい正方形の一辺の長さがそれぞれ 1,3 であるとき,斜線部の面積を求めよ。

一辺の長さが 3 の正方形の頂点は以下の通り。

  A = (0, 0)
  B = (3, 0)
  C = (3, 3)
  D = (0, 3);

一辺が 1 の正方形 DEFG の頂点 E の座標を (x, y) とすると,F, G も決まる。

  using SymPy
  @syms x, y
  E = (x, y)
  G = (3 - y, 3 + x)
  F = (x + (3 - y), y + x);

頂点 A, E, G が一直線ということから,線分 AE と AG の傾き(tangent)が等しとする方程式を解き,x, y を求める。

  eq1 = Eq(G[2] / G[1], y / x)
  eq2 = Eq(x^2 + (3 - y)^2, 1)
  solve([eq1, eq2])
  2-element Vector{Dict{Any, Any}}:
   Dict(x => -1/6 + sqrt(17)/6, y => 17/6 - sqrt(17)/6)
   Dict(x => -sqrt(17)/6 - 1/6, y => sqrt(17)/6 + 17/6)

図から,x, y は以下のようになる。 なお,後々の数式変形のために a = sqrt(17) としておく。そうしておかないと,単純に数値解を求めてくれるので,ある意味綺麗じゃない。

  @syms a
  x = (a - 1) / 6
  y = (-a + 17) / 6;

E, G, F を再定義する。

  E = (x, y)
  G = (3 - y, 3 + x)
  F = (x + (3 - y), y + x)
  println("E:$E\nG:$G\nF:$F")
  E:(a/6 - 1/6, 17/6 - a/6)
  G:(a/6 + 1/6, a/6 + 17/6)
  F:(a/3, 8/3)

二番目に大きい正方形の対角線の長さ FB は以下のようになる。

  FB = sqrt((F[1] - 3)^2 + F[2]^2)

三角形 FHB は直角二等辺三角形なので,HB の長さは以下のようになる。

  FB² = (F[1] - 3)^2 + F[2]^2
  HB = sqrt(FB²/2)

頂点 H の座標を (u, v) とする。

  @syms u, v
  H = (u, v);

方程式を立てよう。

  eq3 = Eq((H[1]- 3)^2 + H[2]^2, HB^2)
  eq4 = Eq((F[1]-H[1])^2 + (F[2]-H[2])^2, HB^2)
  solve([eq3, eq4], [u, v])
  u, v = (-(-a^2 + 8*a + 9)/(6*(a - 9)), a/6 - 1/6)
  u(a=>sqrt(17)), v(a=>sqrt(17))
  H = (0.853850937602943, 0.520517604269610)
  H = (u, v)
  ((a^2 - 8*a - 9)/(6*a - 54), a/6 - 0.166666666666667)

三点を辺上に持つ長方形の面積は以下の通り。

  sq = expand((F[1]-E[1])*(F[2]-H[2]))
  - a^2 / 36 + 0.444444444444444 a + 0.472222222222222

右上の三角形の面積は

  tru = simplify((F[2]-E[2]) * (F[1]-E[1]) /2)
  a^2/72 - 1/72

右下の三角形の面積は

  trr = simplify((F[2]-H[2]) * (F[1]-H[1]) /2)
  - 0.0138888888888889 a^2 + 0.25 a - 0.236111111111111

左下の三角形の面積は

  trl = simplify((E[2]-H[2]) * (H[1]-E[1]) /2)
  0.5 - 0.0555555555555556 a

求める三角形の面積は,長方形の面積から 3 つの三角形の面積を除いたものである。

  S = expand(sq - tru - trr - trl)
  - 0.0277777777777778 a^2 + 0.25 a + 0.222222222222222

a = sqrt(17) なので,もう少し簡約化すれば,

  -0.0277777777777778*17+0.222222222222222 + 0.25a
  0.25 a - 0.250000000000001

0.25 * sqrt(17) - 0.25 = (sqrt(17) - 1) / 4 である

  S(a=>sqrt(17))
 0.780776406404415

とどのつまりが,

  (sqrt(17)-1)/4
  E1 = E[1](a=>sqrt(17))
  E2 = E[2](a=>sqrt(17))
  F1 = F[1](a=>sqrt(17))
  F2 = F[2](a=>sqrt(17))
  G1 = G[1](a=>sqrt(17))
  G2 = G[2](a=>sqrt(17))
  println("E:($E1, $E2)\nF:($F1, $F2)\nG:($G1, $G2)")
  using Plots
  pyplot()
  delta = 0.1
  plot([A[1], B[1], C[1], D[1], A[1]],
       [A[2], B[2], C[2], D[2], A[2]],
       seriestype=:shape, fillcolor=false, tickfontsize=12,
       linewidth=2, xlims=(-0.5, 4), aspect_ratio=1, label="")
  annotate!([A[1] - delta, B[1] + 2delta, C[1] + 2delta, D[1]- delta] .- delta,
            [A[2], B[2], C[2], D[2]],
            ["A", "B", "C", "D"])
  plot!([D[1], E1, F1, G1, D[1]],
       [D[2], E2, F2, G2, D[2]],
       seriestype=:shape, fillcolor=false, tickfontsize=12,
       linewidth=2, aspect_ratio=1, label="")
  annotate!([E1 + delta, F1 + delta, G1 + 2delta],
            [E2 - delta, F2 + delta, G2],
            ["E(x,y)", "F", "G"], :left)
  plot!([G1, A[1]], [G2, A[2]], linestyle=:dash, color=:black, label="")
  F1 = F[1](a=>sqrt(17))
  F2 = F[2](a=>sqrt(17))
  H1 = H[1](a=>sqrt(17))
  H2 = H[2](a=>sqrt(17))
  I1 = 3 + H2
  I2 = 3 - H1;
  plot!([F1, H1, B[1], I1, F1],
        [F2, H2, B[2], I2, F2],
       seriestype=:shape, fillcolor=false, tickfontsize=12,
       linewidth=2, label="")
  annotate!([H1 + 2delta, I1 + delta], [H2 + delta, I2], ["H(u,v)", "I"], :left)
  plot!([E1, H1], [E2, H2], linewidth=2, color=:black, label="")
  savefig("fig2.png")

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

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

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