{}は波括弧?

僕より10歳は若い人と話してて、気づいたことメモ。

括弧の呼び名が、昔と今では違ってる。
昔は、括弧は「大・中・小」と呼んで区別していた。同じ順番で「[], {}, ()」。
今は、括弧は「角・波・丸」と呼ぶそうな。

話の中では、「え…中括弧ってどれですか?」と言われ、手で宙に描きながら「え?ふにゃふにゃっとした奴…?」などと表現したら伝わったけども、、、

検索したら、括弧についてという記事を書いている人もいた。

なるほど。

数IIの教科書を読み返していて疑問が..w

教科書の冒頭に書かれた問いかけ…

「指示に従って等式を変形してみましょう。」

\( \\
 a=b \\
 a^{2}=ab \\
 a^{2}-b^{2}=ab-b^{2} \\
 (a+b)(a-b)=b(a-b) \\
 a+b=b \\
 b+b=b \\
 2b=b \\
 2=1
\)
\( \\
a=bで、a \neq 0とします \\
両辺に a をかけます \\
両辺から b^{2} を引きます \\
両辺を それぞれ因数分解します \\
両辺を a-b で割ります \\
a=b を代入します \\
左辺を整理します \\
両辺を b で割ります
\)
「方程式を変形した結果、答えが「2=1」になりました。どこが間違っているのでしょうか。」

正直、え…なにが違うの?と思ってしまいました。
しばらく考えてみて、「両辺を a-b で割ります」という操作が、0除算だから結果がおかしくなっているように思いましたが、それ以外の理由を思いつかず。。

その後…

知見のある知り合いに聞いてみると、やっぱり「0で割る」という数学的な禁忌を犯しているせいでその後の結果が正しくない結果となっていることが分かった…げに恐ろしきは0除算…

[VGMPlayer] 標本化と量子化

PCMサンプリングのことを調べると、標本化(sampling)・量子化(quantization)という言葉が出てくる。

標本化:(波形を)時間方向に区切ってデータを集めること。
量子化:(波形を)振幅方向に区切ってデータを集めること。

前回の話がそのへんのことになるけど、正直全然わかっていない。

で、こういった処理をまとめて離散化(Discretization)と呼んでいる。
数学的には、離散数学と呼ばれる分野になるらしい。

PCMサンプリングの場合でいうと、(数学的に定義される”波形”は)本来連続的に変化していて、時間方向や振幅方向にいくら細かく区切っても基本的に連続する性質を持っている。しかし、これを一定の時間経過・一定の振幅量の単位で区切ってPCMデータに変換する。
そしてこの時、データは切り捨て誤差(Truncation error)と呼ばれるデータの欠落を起こす。
こういったデータを扱う学問が、離散数学ということになる。

言葉で書いても分かりづらいので、映像を見てもらうと下のような感じ。

英語なので説明は分かりづらいと思うけども、元々時間も振幅も “continuous(連続的)” だった波形の情報は、標本化及び量子化によって、 “discrete(離散的)” に変化するよ。ということを説明している。

また、実際の標本化・量子化はこんな感じ。というのが次の映像。

0の話


整数は、絶対値の部分が小数点を扱わない。0またはそれ以上の数。
もっと原初の概念としての自然数(1以上の数)。

…などの数の概念を勉強したのがいつぐらいだったか覚えがないけども、ネットで検索する限り小学校高学年頃になるらしい。
掛け算や割り算は小学校3年生で覚えるので “0” もたぶんその頃に扱い始めるのだろう。

でも、以下の式は数学レベルの思考が必要で、たぶんこれを受け入れられるかどうかは数学を学ぶ上での試金石になる問題のように思う。。

\( 9 \div 0 = ? \)

他に、こういうのもある。

\( 2^{0} = ? \)

要は、数学は計算をするためのシステムであること。現実世界を単純に投影したものではなく “数学の理論の上で成り立っている” ということ。
このへんが現実世界を基準に考えるタイプの脳みそだと、数学の世界と現実の状況の相互投影がうまくいかなくて得心のいかない壁にやたらぶつかる。解決方法は、すべては数学の世界での話として考えるだけでいい。という話になるんだろうけど。

数学は超がつくほど頭のいい人達が寄ってたかって、それも長い年月を掛けて編み出してきた技術。それによって未知の事象をも投影することができるように磨かれているけれども、逆にどんな事象も投影できるように作られたシステムなので、それなりにお約束が一杯ある。

いろいろなお約束と、そのお約束の裏に潜む事情を空気を読むかのように理解できる人と、できないで数学の扉を潜れずにまごまごする人がいる。

まごまごする人でも、数学のシステムをもっと自然に受け入れられるといいんだけど…こんだけ頭のいい人がたくさん居てもそうなってないということは、それは難しいのだろうか。それともまごついてる人は、単に数式を解く絶対量が足りなかっただけなんだろうか?

今日は0にまつわる問題を自分が全然受け入れてなかったことに気づいて、かなり凹んだ。。

仮に \( 9 \div 0 = 0 \) が正しいとした場合…

逆説的に下記も正しいということになってしまうが…

\( 0 \times 0 = 9 \)

上記式は\( 9 \div 0 = 0 \)を変形したもの。
変形の過程はこんな感じ。

\(9 \div 0 = 0 \)
\(9 \div 0 \times 0 = 0 \times 0 \)
\(9 = 0 \times 0\)

“0で割る” 部分を右辺に移項するので、両辺に0を掛け消せる要素(左辺の \( \div 0 \times 0 \) )を省く。
…のだけど、すでにこの時点でなんかおかしい。

両辺を入れ替えれば、前述の式になる。

\(0 \times 0 = 9\)

0に0を掛けても答えは9ではないので、答えは間違っている。ということまでは、なんとなくわかる。

でもそれだけでは「解なし」という理由にはならない。
この問いに「解なし」と答える理屈を窺い知るために、とりあえずもう少し話を発展させてみる。

  • まず1以下の数値で割ったら答えはどうなるのか。
  • 次にそれを極限まで小さくするとどういう傾向が表れるのか。
  • 傾向から0で割った場合にどういう結論が導かれるか。

そのあたりを踏まえ、小中学校での学習要項に沿った場合に “学習範囲を超えている” という状況までわかって、はじめて「解なし」という結論に得心がいった。

頭が硬いってことかもな。
でも個人的には、「数えられない・数えきれない」という答えの方がしっくりくる。

実際には “0と0に限りなく近い極小の数” は別モノなので、この理解も正しいわけではないようだが、もはやどうでも良くなってくる…
最終的に、こんなQ&Aを見つけた。
[算数・数学]なぜ0でわる計算をしないのか(0で割れない理由)
プログラム的には

そもそも0除算ってCPU的に0除算エラー出るし、言語的には0除算例外でトラップ対象、CPUの演算コスト的にも非常に高価な処理。プログラムを書く時はまず乗算に置き換えを考えるような計算なので、あまり深く考えたこと自体がなかったかも…

しばらく放置してみて、思ったこと

 結局、0で割るとはどういうこと?に書かれているように代数的な観点と解析的な観点は異なっていて、代数的には「解なし(計算が成立する数は存在しない)」、解析的には「数えきれない(結果が無限大になる)」という話ってことになる。。

 ただ、どうしてもなんだかその理屈がしっくりこない自分が居て困る…

数の種類

まずはどんな数があるか、おさらいが必要だったので検索したらそのもののページがあった。
素晴らしいです、、

数学-数の種類

学校では

数の数え方(1、2、3)ということで自然数を覚える
自然数に0を含み、計算の概念として整数を覚える
割り算と共に分数を知り、小数表現を知る
負の表現、平方根を中学で知る
中学も終わる頃には、数の種類を知ることになる。

こうして、有理数・無理数の当たりまで計算で扱うに至る。
高校では、これに虚数および複素数を知る。

たぶん純粋に数学を理解するには、学んできた数のことを少し体系化して捉える訓練がどこかで必要になってくるんじゃないかと思うんですよね。

特に、数学の感覚が鈍い僕みたいな人間の場合。

数の歴史を紐解いた解説が最近書かれていたので、これもメモしておきたい。

虚数や複素数の存在に納得する、もう一つの説明

そしてイメージより言葉で覚える僕みたいな人は、やっぱり英語もセットで種類名を覚えた方が誤解なくスムーズに受け入れられそう。

平方根ってなんだっけ?


中学校で「2乗すると “その値” を得られる数」みたいに習った。

\(x = \sqrt{x^{2}} \)

\(\sqrt{2} \) は「ルート・2」と読む。
平方根は、英語では “square root” と呼ぶ。

“平方(へいほう:square)” とは四角形の縦横を掛けて面積を得ることに由来。2乗すること。幾何学用語。
“根(こん:root)” とは平方する際の元となる数値のことを指す。

もうちょっとなんなのか知りたいなーと思ったら、こんなサイトを見つけた。
中学生に平方根の基本的な概念と計算方法を教えるレベルのものですけど。

平方根ってなに?

これを見ると “平方根の正体” というか計算方法はわかる。だけども、まだこれだけだと数のイメージみたいなものを持てなくて困っている…

こういう場面で適用するべき。みたいな分類が全くついてなくて “この単元” の勉強が過ぎ去ったらもう実際の計算で活かすべきタイミングが全く掴めない感じになっている。

検索で見つけた、平易に説いているドキュメント
平方根や円周率のはなし – 山口大学
とか思ってたら…

 wikiの “幾何学” のページにイメージしやすい図があった…

 そうか “直角三角形における、斜辺と他の2辺の関係” は1つの形なのか。

 でも、それだけと思ったらダメだよな。
 有理数に対して、無理数を式に書き表す概念だしね。

そもそも “ピタゴラスの定理” から無理数が発見された模様。(出典)
計算時は

 平方根の計算を解こうとする場合は素因数分解がササッとできないと、母数を揃えられなくて式がまとまらないんですよね。
 素因数分解で100〜1000くらいまでをササッと素因数分解できると、式をまとめやすい。

 頭の体操のつもりで、たまに50〜100個くらい数字を並べて分解してみた方がいいのかもしれない。
 特に、センスのない自分みたいな人間の場合は。

孤度法, 度数法


計算式ほんとすぐ忘れるのでメモ。

角度を表す単位

 ラジアン(radian)が孤度法。
 ディグリー(degree)が度数法。

孤度法は、円の1周を 2πラジアン と表す。
度数法は、円の1周を 360° と表す。

孤度法⇔度数法の変換式

孤度法⇒度数法の変換式:
  \(deg = \frac{rad \times 180}{\pi} \)

度数法⇒孤度法の変換式:
  \(rad = \frac{deg \times \pi}{180} \)

カリー化

 A Short Practical Guide to Blocksで判らないでいたカリー化。

 モヤっとしていたので、もうちょっと調べてみた。(というか同じページに書いてあったんだけど..)
 ⇒カリー化

 結局のところ、以下のように書かれている通りなのだろう。

カリー化を利用すると、複数の引数をとる関数を、一つの引数のみを取る複数の関数のラムダ計算などの単純な理論的モデルと見なして研究できるようになる。

 問題を単純な形に切り分けて処理する為の技術って感じ。
 逆にいえば、問題を単純な形に切り分ける力も必要..と。

 例えば wikipediaに以下のように書かれているように、第1引数と第2引数を渡す関数をそれぞれ別に定義・関数化することで、引数を1つしか取らない関数2つに処理を分けている。
 ※関数:cdiv(x)と 無名関数:function(y) の2つ。

 また、カリー化する意味も “inv”変数関数を作って見せることで証明している。
 ※併せて説明されている理論的モデルは wiki参照。

 事象を単純化した数学モデルに置き換える作業が必要な場合には、威力を発揮すると思われるが、そういうことをしない人間なので正直便利さが全く理解できないでいる..


 JavaScriptで複数キーでソートする処理って..とか思ってたら、早速関数を引数に取る必要が出てきた。まぁ関数を引数に取るだけで、カリー化とは関係ないか..
 とはいえ、こういうのをさらっと1から書けないなぁ。
 ⇒http://stackoverflow.com/questions/1129216/sort-array-of-objects-by-property-value-in-javascript


集合の計算

こういうの苦手なんだよな~、ってことでめも。
プログラムで直接こういう計算することってあんまりない気がするけど、集計結果をまとめて個々の値をはじき出す時には必要ですね。

http://www.shukatsu-kami.jp/spi2/method/special3.html

おー、線分図にすると判り易いんだな。
http://saisokuspi.com/higengo/shuu_reidai/

でも、表を書くヤツをやってると、もはやただのツールでなんか意味を理解しないで使ってる状態になってしまって、昔数学判らないまま覚えてた頃を思い出して憂鬱になってきた…orz

視線と垂直に交わる平面上の1点を求めるには(補足)


そもそもはdevkitのmoveTool.pyが perspカメラに対応していなくて、

どうやったら『パースペクティブビュー上でドラッグした点の行き先』を計算できるのか..

という疑問から始まった。

話としては、『平面の方程式』を手掛りにして『平面と直線の交点を求める』ということになるのだが、
いろいろ考えてはみたものの、カメラの正面方向のベクトルに直行する平面上の1点がどうなれば求まるのか、というところに数学できない君の自分は結局辿りつくことが出来なかった。

そもそも、平面の方程式を自分は知らなかった..
平面の方程式というのは、平面上の2点p,qと平面の法線ベクトルの値が揃えば、以下の式は成り立つ、という公式。

点q(x,y,z)を通り,\( \vec{N}=(a,b,c) \) を法線ベクトルとする平面αの方程式

\( ax+by+cx+d=0 \)

高校数学で内積・外積あたりを勉強していると、以下のような形で証明される。

平面α上の点q(x,y,z)に対して \( \vec{N} \perp \vec{P} \) から ( \( \vec{P} \) は平面上の点pから点qへ向かうベクトル )
 

\( \vec{N} \cdot \vec{P}=0 \)
\( (a,b,c) \cdot (x-P_x,y-P_y,z-P_z)=0 \)
\( a(x-P_x)+b(y-P_y)+c(z-P_z)=0 \)

 
以上により、
\( ax+by+cz+d=0 \) が求まる
(ただし \( d=-aP_x-bP_y-cP_z \) は、定数とする)

今回自分がやりたかったのは、『パースペクティブ視点で選択頂点をドラッグした時の移動先を求める』という処理。

 •平面と直線の交点を求めるには平面と直線がわかっていないといけない。
 •直線は、視点の位置と3d上のマウスポインタの方向(M3dViewから得たもの)で指定される。
 •平面は、空間上の一点と法線ベクトルで指定される。
 •平面を指定するための空間上の一点がpで、今回はこれが移動前の位置。

視点・視線ベクトル・点p(選択頂点の元の位置)までは判っているので、あとはOpenMayaのM3dViewクラスの機能と上の式があれば目的は達成できる。

ということで、実際にやってみるとまだもう1つ問題が残っていて、起点となる位置(点p)を確定できていなかった..orz
※moveTool.pyの場合、平行投影表示の視点の場合を想定した実装の為、M3dView.viewToWorld関数で取得するワールド座標がpersp視点の場合には求める座標になっていなかった。

問題を解消する方法はこれまたいろいろとあるハズだが、思い付いたのは選択頂点のある1頂点の座標(もしくは選択頂点の中心座標)を取得して、一旦M3dView.worldToView関数でコンテキスト面に投影する方法。

moveTool.pyの実装自体がコンテキスト面⇒ワールド空間への座標変換と、ワールド空間での始点と終点の相対的な移動量計算なので、始点の基準になる1点をコンテキスト面に投影出来てしまえば、その座標とマウス位置(実際の始点や終点)との2D的なオフセットを得ることが出来る。(既に分かっている始点、視線ベクトルに加え、足りなかった点pとして『始点の基準になる1点と、2D的なオフセット』が手に入ったことになる。)

ドラッグ中は、コンテキスト座標基準でオフセットを加えた2D位置を元に先の説明の交点計算を行うことで、最終的な移動先(ワールド空間上の1点)を得られる。
何故ならば『視線と垂直に交わる平面』とコンテキスト面は、どちらも視線と垂直に交わる面であり互いに平行な面。
したがって、コンテキスト座標基準でオフセットを加えた2D位置というのは、そのまま『視線と垂直に交わる平面上に”平行投影された”1点』となるからである。

視線と垂直に交わる平面上の1点を求めるには

そもそもはdevkitのmoveTool.pyが perspカメラに対応していなくて、
どうやってパースペクティブビュー上でドラッグした点の位置を計算できるのか..という疑問から出てきた話題。

添付画像は、教えてもらった求め方。(平面の式から、点qを求めるところまでの一連の導出)
視線に垂直に交わる平面上の1点を求める(1)

視線に垂直に交わる平面上の1点を求める(2)

視線に垂直に交わる平面上の1点を求める(3)

平面の方程式の解法..は、このへんを参考にすれば、判るかも。
http://21.xmbs.jp/shindou-11684-n3.php?guid=on&page=5&view=1