<style> .reveal, .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 { font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, "Microsoft JhengHei", Meiryo, sans-serif; } h1, h2, h3, h4, h5, h6 { text-transform: none !important; } .color-yellow{ color: yellow; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; text-align: left; padding: 10px 0; } .alert-info { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .alert-success { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .alert-danger { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .reveal .slides span { text-align: left; display: inline-block; } p, li { font-size: 0.88em !important; } li>p { font-size: 1em !important; } </style> # JuliaTokai #10 (2021/05/15) ###### tags: `JuliaTokai` `prezentation` --- # Rotations.jlで学ぶ<br>3次元の回転 [堀川 由人, ほりたみゅ, @Hyrodium](https://hyrodium.github.io) ---- ### おしながき * 自己紹介 * 3次元の回転って? * Rotations.jlの紹介 * 面白い結果(a) $\operatorname{SO}(3)$の可視化 * 面白い結果(b) Thomson問題の拡張 * まとめ --- ## 自己紹介 幾何学がスキ! ![](https://hyrodium.github.io/assets/logo.png =300x) ![](https://media0.giphy.com/media/BWClhsM6ACc7QaPNDc/giphy.gif?cid=790b761199dc032c147fd3e0de271eb710c7d2a1b936172e&rid=giphy.gif&ct=g =300x) [堀川 由人, ほりたみゅ, @Hyrodium](https://hyrodium.github.io) * 過去の関連発表 * Rotations.jlとの関わり ---- ### 過去の関連発表 $\operatorname{SO}(3)$と$\operatorname{SU}(2)$の対応関係について話しました * [逆数の作図からCayley変換まで / 第1回日曜数学会](https://www.slideshare.net/yutohorikawa/cayley-57826500) ![](https://i.imgur.com/Je0Pm8K.png =x150) ![](https://i.imgur.com/mD7m3C4.png =x150) ![](https://i.imgur.com/xQ8nvQV.png =x150) * [Riemann球面に内接する直方体 / 第4回日曜数学会](https://www.slideshare.net/yutohorikawa/riemann-57827572) ![](https://i.imgur.com/mSLbPqn.png =x150) ![](https://i.imgur.com/W9Gku2d.png =x150) ![](https://i.imgur.com/XW6aBP0.png =x150) ---- ### Rotations.jlとの関わり 3次元回転をJuliaで扱うためのパッケージ * 1ヶ月前(2021/04/08)からcontribution開始 * PR 8つ (merged 3つ) * issue 7つ * 3次元回転を完全に理解したぞ! * 今日はその報告です --- ## 3次元の回転って? * そもそも回転とは * $\operatorname{SO}(3)$の性質 ①-⑥ ---- ### そもそも回転とは * 原点の位置を変えない合同変換 * (普通は)Eudlid空間での合同変換 * ただし鏡像は除く * 線形代数の言葉で言えば… * 直交行列による変換 ($R^{-1}=R^{\top}$となる行列) * ただし行列式は1 * 一般には$n$次の回転行列まで考えれる * $\operatorname{SO}(n)$と書く * Rotations.jlでは(基本的に)3次のみ扱う ---- ### $\operatorname{SO}(3)$の性質① 元の可視化 $\color{red}{x},\color{green}{y},\color{blue}{z}$軸の正規直交基底の"姿勢"が$\operatorname{SO}(3)$の元 ![](https://i.imgur.com/HIPjM9b.png =450x) ![](https://i.imgur.com/HUF1YaG.png =x100) ---- ### $\operatorname{SO}(3)$の性質② 空間の次元 * 与えられた姿勢への到達に、3回の座標軸回転が必要 * Euler角と呼ばれる (回転順序によって12種類存在) * $\color{blue}{z}\text{-}\color{red}{x}\text{-}\color{blue}{z}, \color{red}{x}\text{-}\color{green}{y}\text{-}\color{red}{x}, \color{green}{y}\text{-}\color{blue}{z}\text{-}\color{green}{y}, \color{blue}{z}\text{-}\color{green}{y}\text{-}\color{blue}{z}, \color{red}{x}\text{-}\color{blue}{z}\text{-}\color{red}{x}, \color{green}{y}\text{-}\color{red}{x}\text{-}\color{green}{y}$ 狭義Euler角 * $\color{red}{x}\text{-}\color{green}{y}\text{-}\color{blue}{z}, \color{green}{y}\text{-}\color{blue}{z}\text{-}\color{red}{x}, \color{blue}{z}\text{-}\color{red}{x}\text{-}\color{green}{y}, \color{red}{x}\text{-}\color{blue}{z}\text{-}\color{green}{y}, \color{blue}{z}\text{-}\color{green}{y}\text{-}\color{red}{x}, \color{green}{y}\text{-}\color{red}{x}\text{-}\color{blue}{z}$ Tait–Bryan角 * つまり$\operatorname{SO}(3)$は3次元の空間! $\dim(\operatorname{SO}(3))=3$ * より一般に$\dim(\operatorname{SO}(n))=n(n-1)/2$ ![](https://media1.giphy.com/media/P8hnZXBWvNcpBYUmNE/giphy.gif?cid=790b7611b23ea0d9b90d0c376d5794e5844af2aef3b1fcf5&rid=giphy.gif&ct=g =250x) ![](https://media0.giphy.com/media/gMUpeF3bfOs7j5aY04/giphy.gif?cid=790b7611617f153c1f101642bb5d31a4a423463df37ed36d&rid=giphy.gif&ct=g =250x)\ $\color{red}{x}\text{-}\color{green}{y}\text{-}\color{blue}{z}回転 / \color{red}{x}\text{-}\color{green}{y}\text{-}\color{red}{x}$回転 ---- ### $\operatorname{SO}(3)$の性質③ 行列表示 ![](https://i.imgur.com/HIPjM9b.png =x180) ![](https://i.imgur.com/HUF1YaG.png =x150) * 3次元なのにパラメータが9つあるように見える * $xy$平面上の円周$S^1$と同じ状況 * 行列表示すると過剰にパラメータが発生 * :arrow_up: 計算量 * :arrow_down: 計算精度 * 行列表示以外の"良い"パラメータが欲しい! ---- ### $\operatorname{SO}(3)$の性質④ 固有値と固有ベクトル * $R\in \operatorname{SO}(3)$の固有値は$\{1,e^{i\theta},e^{-i\theta}\}$で表示可能 * 固有値$1$に対応する固有ベクトルが回転軸 * $\theta$が回転角 * 任意の回転は「軸回りの回転」として表示可能! * 回転軸(2次元)+回転量(1次元)なのでちゃんと3次元 * [Rodriguesの回転公式](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%89%E3%83%AA%E3%82%B2%E3%82%B9%E3%81%AE%E5%9B%9E%E8%BB%A2%E5%85%AC%E5%BC%8F) ![](https://media4.giphy.com/media/8Zz6CB6PkVkeyRE6kE/giphy.gif?cid=790b761191754df7698c0550a00c62f0008964a6845f84bd&rid=giphy.gif&ct=g =240x) ![](https://i.imgur.com/jf0nDyz.png =x240) ---- ### $\operatorname{SO}(3)$の性質⑤ 準同型な空間など この辺りから数学的に込み入ってきますが… * $\operatorname{SO}(3)$と$\operatorname{SU}(2)$は$1:2$に対応(準同型) * $\operatorname{SU}(2)$は$\det$が1のユニタリ行列全体 * (詳細は以前の発表スライド参照) * $\operatorname{SU}(2)$は「単位長さ四元数全体」と対応(同型) * つまり4つの実数で3次元の回転を表現可能 * パラメータ減ってハッピー!(9→4) * 「単位長さ四元数」は3次元球面$S^3$と対応(同相) * $S^3\subset\mathbb{R}^4$なので普通の球面ではない * 立体射影で$S^3\leftrightarrow\mathbb{R}^3\cup\{\infty\}$の対応(同相) * パラメータ減ってハッピー!(4→3) ---- ### $\operatorname{SO}(3)$の性質⑥ まとめ * $\operatorname{SO}(3)$は3次元Lie群! * 3次行列として表示可能 * しかし計算には都合が悪い * 良い感じのパラメータ(座標)が欲しい! * 直感的に理解しやすい * コンピュータが計算しやすい * 数学的なモチベーション → https://twitter.com/phykm/status/1388747029304672261 * 行列表示 / Euler角 / 軸回り回転 / 四元数 / $\mathbb{R}^3\cup\{\infty\}$ --- ## Rotations.jlの紹介 * Juliaで3次元回転を扱うためのパッケージ比較 * Rotations.jlで定義される型 * 使い方の例 ---- ### Juliaで3次元回転を扱うための<br>パッケージ比較 * [Rotations.jl](https://github.com/JuliaGeometry/Rotations.jl) * 回転は3次元行列 * 最新版`v1.0.2` * [ReferenceFrameRotations.jl](https://github.com/JuliaSpace/ReferenceFrameRotations.jl) * (まだ詳しく触ってないので何とも…) * 最新版`v0.5.7` ---- <!-- .slide: style="font-size: 30px;" --> ### Rotations.jlで定義されている型 * 行列表示 * `RotMatrix` * Euler角 * `RotX`, `RotY`, `RotZ` * `RotXY`, `RotYX`, `RotZY`, `RotYZ`, `RotXZ`, `RotZX` * `RotXYZ`, `RotXYX`, (他10種) * 軸回り回転 * `AngleAxis` * `RotationVec` * 四元数 * `UnitQuaternion` * $S^3$の立体射影 * `MRP` (Modified Rodrigues Parameters) * $S^3$の原点からの射影 * `RodriguesParam` `<: Rotation <: StaticMatrix <: AbstractMatrix` これらの他にも2次元回転の型もある ---- ### 使い方の例 ```julia= using Rotations # ランダムに回転行列を生成 (Haar測度) R_uq = rand(UnitQuaternion{Float64}) # 行列に変換 Matrix(R_uq) # 別のパラメータに変換 (MRP) R_mrp = MRP(R_uq) # 別のパラメータに変換 (Euler角) R_xyz = RotXYZ(R_uq) ``` このスライドのgifもRotations.jlで計算してます (レンダリングはPOV-Ray) --- ## 面白い結果(a) $\operatorname{SO}(3)$の可視化 `MRP`を使えば頑張れば$\operatorname{SO}(3)$を3次元球として描ける! * ① 可視化の概要 * ② 座標軸まわりの回転 * ③ 非可換性の可視化 * ④ $xy$回転曲面の可視化 * ⑤ ジンバルロック * ⑥ 有限部分群 ---- ### $\operatorname{SO}(3)$の可視化① `MRP`で可視化する! ![](https://media2.giphy.com/media/lSsUc96YbwPLOsSjOE/giphy.gif?cid=790b7611b0181c53504884200c283991728139cda5b7bfe2&rid=giphy.gif&ct=g =350x) ![](https://i.imgur.com/HIPjM9b.png =350x) 数学的に込み入ったことは抜きにして… 3次元球内の一点が、一つの姿勢($\operatorname{SO}(3)$の元)を表す! ---- ### $\operatorname{SO}(3)$の可視化②-x $x$軸回転 ![](https://media4.giphy.com/media/icJFrVwEFNNyN7JKlP/giphy.gif?cid=790b7611d74e9cb86466d218c100be524ab1a92101734922&rid=giphy.gif&ct=g) 原点が単位行列 ---- ### $\operatorname{SO}(3)$の可視化②-y $y$軸回転 ![](https://media2.giphy.com/media/sWSgE73h7GHvIhrAGo/giphy.gif?cid=790b76118dfc6a0b557324a7336f05baf1d7fcead95a8b5d&rid=giphy.gif&ct=g) 球面上の点がちょうど「180°回転」に相当する ---- ### $\operatorname{SO}(3)$の可視化②-z $z$軸回転 ![](https://media3.giphy.com/media/R7cZqkkimdIne1uhBG/giphy.gif?cid=790b7611be345994e975cf706e1696e65c5922260d1902aa&rid=giphy.gif&ct=g) * 一般に左図での「球面内の点と原点を結ぶ直線」は右図での「回転軸」に一致する * 逆元は原点対称の点 ---- ### $\operatorname{SO}(3)$の可視化③ $\operatorname{SO}(3)$の非可換性:$\color{magenta}{R_x(t)R_y(t)}$と$\color{cyan}{R_y(t)R_x(t)}$の比較 ![](https://media4.giphy.com/media/fjmvMyManZVb6b1FP9/giphy.gif?cid=790b761192273ed5c1a37387015f5cd4602f6ea127dc50cb&rid=giphy.gif&ct=g) MRP(左)の方が基底の図示(右)よりも把握しやすい ---- ### $\operatorname{SO}(3)$の可視化④ $\{R_x(s)R_y(t) \mid s,t\in\mathbb{R}\}$は群を成さないが… 曲面としては描画できる ![](https://media3.giphy.com/media/zHPoJ4UXjHJEkrQGIB/giphy.gif?cid=790b7611a3fdb81d2ecb4353590d9b0eb640dc6f3065b16b&rid=giphy.gif&ct=g =x350) ![](https://media1.giphy.com/media/Zxf1aKEoBuxCQqNkty/giphy.gif?cid=790b7611f6b31808980cb4e60de91783275a381ca289aa07&rid=giphy.gif&ct=g =x350) ---- ### $\operatorname{SO}(3)$の可視化⑤ [ジンバルロック](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%B3%E3%83%90%E3%83%AB)(`RotXYX`) ![](https://media3.giphy.com/media/nvj1I9ztgHV3LPrefo/giphy.gif?cid=790b76114d1e1433c255c0aec69065664ae45a48b01573cd&rid=giphy.gif&ct=g =350x) $x$軸上でめっちゃ密 😷 → Jacobianがゼロ → Euler角は$\operatorname{SO}(3)$の全体座標に不適格 ---- ### $\operatorname{SO}(3)$の可視化⑥-4/4 $\operatorname{SO}(3)$の有限部分群と言えば…正多面体群! * 正4面体群の位数は12 * $\operatorname{SU}(2)$で考えれば24個←正24胞体の頂点に一致! ![](https://media3.giphy.com/media/f5mSX3OK0yH1aoT7fR/giphy.gif?cid=790b761141deee0f8a4e67cc588bf1c57ff434172c4d5fb3&rid=giphy.gif&ct=g =400x) ![](https://media3.giphy.com/media/3o6gaRVJG8FmmonsLC/giphy.gif?cid=790b76115df6dbbcab8dbe159135ae4aa4b56f969917461f&rid=giphy.gif&ct=g =400x) ---- ### $\operatorname{SO}(3)$の可視化⑥-6/8 * 正6面体群(=正8面体群)の位数は24 * $\operatorname{SU}(2)$で考えれば48個←正24胞体の頂点と胞中心に一致! ![](https://media0.giphy.com/media/RLfAyxWG9TJ2dtysdE/giphy.gif?cid=790b7611a29ab211462ffdbd3becd31ad402c3538fbaea78&rid=giphy.gif&ct=g =400x) ![](https://media3.giphy.com/media/xT0BKjGsKdlWBJe2C4/giphy.gif?cid=790b761192bc7487acf894a28fab3ba02760f1f3cc4dc0b8&rid=giphy.gif&ct=g =400x) ---- ### $\operatorname{SO}(3)$の可視化⑥-12/20 * 正12面体群(=正20面体群)の位数は60 * $\operatorname{SU}(2)$で考えれば120個←正600胞体の頂点に一致! ![](https://media4.giphy.com/media/ucfKbc8MeNHOvP4AbE/giphy.gif?cid=790b7611021d04f25095614e233b557744a3bb4119504f10&rid=giphy.gif&ct=g =400x) ![](https://media4.giphy.com/media/3o6gaTLI9ho5ADW86c/giphy.gif?cid=790b76119d768ecbf6c7702b345585533f66ef1bfb8f8945&rid=giphy.gif&ct=g =400x) --- ## 面白い結果(b) Thomson問題の拡張 * Thomson問題とは * $\operatorname{SO}(3)$への拡張 * 計算結果 ---- ### Thomson問題とは① 概要 > トムソン問題(トムソンもんだい、英: Thomson problem) は、静電エネルギーが最小になるよう単位球面上に N 個の電子を配置する問題である(電子間力はクーロンの法則に従うものとする)。 [Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A0%E3%82%BD%E3%83%B3%E5%95%8F%E9%A1%8C)より ---- ### Thomson問題とは② 計算例 ![](https://media4.giphy.com/media/YTgjQYAXEcAjk8isE6/giphy.gif?cid=790b761175a3a5c6a6aad25c0e91bd3cf47fc3664be6d62f&rid=giphy.gif&ct=g =x150) ![](https://media4.giphy.com/media/VXeYgsxen7ngUqYyqs/giphy.gif?cid=790b7611bf0a9199788d469884fa2fb4ed24a9ec78ba3f2e&rid=giphy.gif&ct=g =x150) ![](https://media3.giphy.com/media/xwuBoAtHfKxVHREuWR/giphy.gif?cid=790b761151d0f45e3325de7d08bd809c7434984131dcde56&rid=giphy.gif&ct=g =x150) ![](https://media0.giphy.com/media/yLQ4JoFb9UdeVr9ka1/giphy.gif?cid=790b76114594a2b40ca2c9d3707ccae2716cadd659502341&rid=giphy.gif&ct=g =x150) ![](https://media2.giphy.com/media/LvbOSmXFDFn7COClaW/giphy.gif?cid=790b76117c78facde3277d3a1c99b9818148f8edb5e3eab5&rid=giphy.gif&ct=g =x150) * 4,6,8,12,20点で計算 * 4,6,12点の場合のみ、正多面体の頂点に一致 ---- ### $\operatorname{SO}(3)$への拡張 * そもそも$\operatorname{SO}(3)$にどうやって距離いれるの? * 2点間を結ぶ回転行列の回転角にしよう! * Lie代数$\mathfrak{so}(3)$に内積($\operatorname{SO}(3)$にRiemann計量)を入れて「最短曲線の長さ」を距離とすることと同じ * じゃあエネルギーは? * Thomson問題に倣って(1/距離)を2点間のエネルギーにしよう! ---- ### 計算結果 * 12,24,60点で正多面体群が出てくると期待されるが… * 正多面体群になるのは24,60点のみだった! <small/>(数値的に実験しただけで厳密に示した訳ではないです)</small> * スライドが間に合わなかったのでデモします… --- ## まとめ * 感想 * 今後の予定 * 参考文献など ---- ### 感想 * Rotations.jl便利! * いろんなパラメータ変換とか有り難い * 可視化にも便利 * コンストラクタのベストプラクティスが分からん… * コンストラクタで正規化するか否か ---- ### 今後の予定 * Rotations.jlのバグ修正 * 私が送ったPR早くレビューして欲しいな:pray::pray::pray: * もう少し真面目にThomson問題を解く * 微分方程式系として記述できそう * ちゃんと可視化もやる ---- ### 参考文献など * [Rotations.jl](https://github.com/JuliaGeometry/Rotations.jl) * Rotations.jlのリポジトリ * [逆数の作図からCayley変換まで / 第1回日曜数学会](https://www.slideshare.net/yutohorikawa/cayley-57826500) * 私の以前の発表 * [Riemann球面に内接する直方体 / 第4回日曜数学会](https://www.slideshare.net/yutohorikawa/riemann-57827572) * 私の以前の発表 * [EquallySpacedPointsOnSO3](https://github.com/hyrodium/EquallySpacedPointsOnSO3) * $\operatorname{SO}(3)$上でのThomson問題のリポジトリ * [VisualizeSO3](https://github.com/hyrodium/VisualizeSO3) * このスライドでの図を作ったときのリポジトリ * 他にも個人ブログ等で参考にしたのあったはず…:pray:
{"metaMigratedAt":"2023-06-15T23:56:44.600Z","metaMigratedFrom":"YAML","title":"JuliaTokai #10 (2021/05/15)","breaks":true,"lang":"ja","dir":"ltr","robots":"noindex, nofollow","slideOptions":"{\"theme\":\"white\",\"transition\":\"slide\"}","contributors":"[{\"id\":\"41421433-16a1-4a57-ac11-6f7b7becb765\",\"add\":18577,\"del\":5826}]","description":"堀川 由人, ほりたみゅ, @Hyrodium"}
    955 views