yield (generator) の有り難みとは?: python
fortran77及び90・95上がりからすると、昨今のモダンな言語のノリになかなかついて行けないでやんです(バカでごめんなさい)。
そもそもファイルのreadに関して一行ずつ読むのがデフォルトのfotran脳的には、python様がどこでどうメモリを消費しているか、またループが露わに出ていないためどこが律速かわからないのであります。
1GBのファイルを開いてデータを読み込むのを目的とした時に、以下の操作でメモリを食うのか食わんのかがpython様が裏で働き過ぎててわからぬ。
- f = open( filename, "w" ) でファイルを開いた時
- num_line = sum( 1 for line in open( filename ) ) で行数を数える時
- line = f.readline() で一行だけ読んだ時
行数を数えるアルゴリズムは以下から参照
text files - How to get line count cheaply in Python? - Stack Overflow
そりゃあread()やreadlines()でファイルの中身を丸ごと扱おうとしてメモリが足りないとかはわかる。しかしどこで何がどうメモリ使うのかがイマイチわからん。
(「1GBのファイルを用意して自分で一個一個やってどれくらいメモリ食うか自分で調べろよ」という声をここでは盛大に無視することをお許し願いたい。)
こういう思考回路を背景にネット上を徘徊すると、pythonにはyield (generator)という機能があるという事実に出会う。
generatorは以下のサイトが分かり易かった。
ailaby.com
一個一個やるからgeneratorは省メモリですよ〜というノリはわかった。ということは、ファイルを開くだけならばメモリは大して使わないのだろうということは何となく類推出来る。
まさに行数を数えるものを作ろうとする際には、ファイルを丸ごと読み込んでメモリ不足で動かないという事態を起こすことなく安全に処理出来る。
しかし、例えば膨大なデータをプロットしたいとかなった時には、結局全部のデータが必要で、一個一個扱おうがそれをリスト変数なり何なりに格納する場合にはgeneratorの恩恵は無さそうに思える。
自分はビックデータを扱う分野にはまだいないので、何をどうズル工夫してメモリの問題を避けているのかが、イマイチ掴めていない。アルゴリズム等によるメモリ節約の寄与と、メモリを摘みまくったPCの物理的な寄与のどっちが支配的なのかがわからんです。何となく機械学習のプログラムが発達して来たからという風潮を感じつつも、何でもノートPC上で出来る魔法みたいなことは起こってなくて実際は金に物を言わせてる感が否めない。もっと勉強します。
複素数平面上の漸近とは?
クーロン散乱の記事を読んでいて、よく考えると???となった位相の問題。
要するに、
(?)
となるか?というもの。
いや成らんやろ。がどんなに大きかろうが、結局が重要なのであって、によってもたらされる位相のズレを解消することは出来ない。
一つ有り得る話としては、を複素定数として規格化因子に入れてしまうというもの。
が定数ならそれで良い。しかし例えば、
(?)
というように、変数の依存性が残っているものはどう扱えば良いのだろうか?これは具体的なケースとしては無限遠方において平面波になるかというものである。
数値計算上、適当な 境界で一致させるようにその時ので を複素定数として抜き出すということは可能だろうが、そうではなく解析的な極限操作、漸近操作において、依存性が残るものをどう捉えられるのだろうか?時計の長針と短針のように、完全に揃い続けることはないものを漸近したと呼んで良いのだろうか?
もう少し勉強してみる必要がありそう。
極座標の不思議
いや、大した話ではないが、
に違和感を感じた。基底一個で三次元の位置を特定出来ちゃっている訳なので。
頭ではわかっているが、心のどこかで、
(もちろん誤り)
を期待してしまっている自分がまだどこかに潜んでいる気がする。
多分、
に慣れ過ぎたのだろうと思う。
でもこれはどっちかというとただの媒介変数標示なのだろうと思う。
極座標と言うからにはが基底の空間で、軌跡(時間発展)がこれらの変数(?)に対して与えられるようなものな気がする。
ただ、じゃあそれを空間で見て分かり易いか?というと全くの別問題だろう。計算し易いとかはもちろんあるだろうが。
まぁ常に位置ベクトルの向きにを向かせるという約束なので、そういうもんであるが、ここにナブラの直交座標から極座標への変換とかが入って来ると話がややこしくなる。
ナブラはそもそも直交座標で定義されたものなので、極座標で定義し直すという気持ちでいると、やっぱり
(もちろん誤り)
的な方向に行ってしまいがちな気がする。
ナブラの極座標への変換は
極座標のラプラシアンの出し方いろいろ
が分かり易かった。
結局というのが、直交座標に慣れていると癖が強く感じる気がする。
この辺の座標変換の究極系が一般相対論かと思うと恐ろしい。。。
ラグランジュアン:位置と運動量は独立か?
独立ではない(でもついこの間まで良くわからずにいた)。
紛らわしい理由として、
- と書かれているからついつい。
- その導出過程で となっているからついつい。
という感じだろうか?
そもそも、であるから、独立な訳がない。
というか、偏微分している時点で、独立じゃないけど別々に微分しますよ~ということを宣言しているので、別々に微分していることが独立性を表すことに全くならない。
大元に立ち返ると、はの関数である。なので、言ってしまえばラグランジュアンはとだけ書いても良いぐらいである。言い換えると、の形が求まった後に、ラグランジュアンを求めると、結局しか出て来ない訳で。
じゃあ何で結局全部tの関数なのにわざわざで書くのか?というと、そうすることでを理解し易い、利用し易い、実験に合う、Newton力学と整合する、などなどというメリットがあるからである。
じゃあ何で関数の中身を区切るだけでそんな変わるのか?というと、関数を見る視点が変わるから、とでも言いましょうか。
例として、を考えたときに、と勝手に決めると、となる。は明らかにに対して線形である。大元のの5次のまま見ても良いが、直線関係にあるもので 特徴付けられるならば理解し易い気がしないだろうか?ちなみにこの場合、は好き勝手な値が取れるわけではなく、であり、平面上で曲線を描くと思っても良いし、媒介変数の立場を取ればパラメータによって軌跡が描かられると思っても良い。
今は、勝手に作った関数で物理的意味は特になく、変数を変えることにあまり旨味が無いかも知れないが、実際に位置や運動量、圧力、体積、磁場と言った意味を纏った量でエネルギーなどの物理量を記述するとなると、それぞれが既に何かの関数になっているかも知れないが、一つの変数として見て法則性があった方が解釈し易かったり制御し易かったりするわけである。
上では、が求まった後にそれをに分配するという立場で話をしてきた。
元々やりたいことは逆で、、各時刻においての無限小変位を加えたときに作用が変化しない(極値を取る)ようなは何ですか?ということである。このときも変位を受ける。これらも独立ではなく、である。ちなみに、はに対する変位ではないことに注意。時間の変位は考えておらず、それとは無関係に加えている。というか、時間積分だからその中で時間の変位を与えるとおかしくなる。
ごちゃごちゃ書いたが、要は、
これに関して、全微分、すなわち何らかの変位が起こったときのラグランジュアンの一般的な変化がわかれば、のときの全微分を使えば良いから話が終わる。
多変数を引数に持つ関数の全微分は偏微分を用いて書かれる。
それで、本当に一変数の全微分と勝手に区切ったなんちゃって多変数の微分達の和が一致するかで確認すると、例えばで微分すると、
となり、勝手に区切っても正しい微分の手続きを踏めば問題無いことがわかる。
話をまとめると、はの関数(時間で積分すると作用を返す関数)だけど、任意の関数で表現しても良く、これらの変位に対して作用が極値を取るような条件(制限)がラグランジュ方程式であり、この制限下でが上手いこと軌跡を描く、ということだと理解している。
実際にラグランジュアンに形を与える際、例えば等速直線運動のときの運動エネルギーを考えると、を介さずに、ガリレイ変換の対称性からほぼ直接の依存性()がポンっと出てくるから、余計にが独立変数だと思ってしまうかも知れない。
むしろ任意の関数で表現しても良いから、対称性等のアプローチでラグランジュアンの形を大枠で推定出来ると思う方が無難かも知れない。
線積分と線分
昔から線分を求める積分が苦手だった。アステロイドとかサイクロイドとかアンドロイドとかがその所為もあってか苦手。
一方、ベクトルが出て来てから線積分は別に何とも思わなくなった。
が、しかし、では積分を行う軌跡上のベクトルを足していくため、閉曲線ではゼロになる。なんか線積分と線分の関係がしっくり来ないと思って考察した。
アステロイドの線分を求めるのをやらされるのは、大体公式に当てはめるみたいな感じで教わることが多いと思っている。
自分はイメージ(理解)無しで覚えるのが苦手なので、頭に全く残らなかった。
物理を扱うようになって思ったのは、線分を求めるよりは、積分を行う軌跡上に射影した、つまりを計算することが多いということ。あまり線分は出て来ない気がする。
まぁ式にしてしまえば何てことないのだが、簡単のため二次元を考えて、ある軌跡上の線分を求めるには、
「微少量の線分を足しまくる」というただそれだけをすれば良い。媒介変数表示、いわゆるパラメータ(ここでは)が出てくるが、これは軌跡上で積分する以上、軌跡の方程式が無いといけない訳で、、というのを記述するための変数がどうしても必要になる。
多分、このパラメータが無いといけないのが、結構ハードルが高くて、普通は被積分関数の振舞を気にしていれば良かった(とかは一次元的で、その間隔とかはあまり意識する必要がない)のが、になるととを独立に積分することが出来ないため、割とパニックになる。それでパラメータを入れたら、積分の中身が普通のとかではなく微分が来るから、暗記するには自分にはキツイ。
さらに質が悪いことに、簡単な例と思って単位円を持ってくると、、だから、
これは、誤って微分ではなく普通のを突っ込んでも同じ解が出て来てしまう。
単位円ではない例も必要だろう。
の曲線を、 として]で積分すると、
これは単位長さの正方形の対角線の長さをキチンと表せている。間違たver.では、
となり、答えを間違う。ちなみにこの間違った答えと同じ線分を与えるのは、であり、]の範囲ではよりも進みが遅い。それ故に軌跡は同じだが、線分が短くなるということになる。
単位円だけをモデル(分かり易い例)に持ってくるのは、時として危険だなぁと思った次第である。
場とは
最近全然更新していなかったので、砂川先生の理論電磁気の一番最初の節でもまとめてみる。
万有引力でもクーロン力でも何でも良いが、とにかく二つの物体間に働く力を考えたい。
二つの物体の間で直接力が働くとする立場を「遠隔作用」と呼ぶことにする。つまり、物体が一つあるだけでは何も起きませんと言っているのと同じ。
一方で、今日ブラックホールとか重力の説明でよく出てくる、ゴム板に重い球を乗せると球がゴム板に沈む(めりこむ、凹む)のを用いれば、二つの球を接触はしない程度に接近させてゴム板に乗せると引っ付いて一か所に落ち着く。ゴム板が完全に透明で全く見えないとすると、あたかも二つの球は勝手に引っ付いたように見える。つまり、「真空」を媒介に二つの物体が作用し合っているとする立場を「近接作用」と呼ぶことにする。ここで言っている近接とは、己の位置近傍の真空とだけやり取りするという意味である。
で、結局どっちも同じ力を記述出来るんだったらどっちでも良くない?となるが、片方でしか記述できない物理現象が出てくると、もう片方は棄却されざるを得ない。
ではどんな物理現象で差が出るかと言うと、電磁波の発生である。
真空中に荷電粒子を一つだけ置いて(実際にどうやって置くかは知りません)、それを振動させると電磁波が発生します。
荷電粒子一つだけなので、遠隔作用の立場では説明出来ません。
しかし近接作用の立場を取れば、荷電粒子の振動が「真空」に作用しているため、その「真空」の変位の結果が電磁波として現れると考えることが出来ます。
このようにして、近接作用の立場が支持されています。
「真空」と聞くと何もないものというイメージが強く、実際にエーテルというものが空間を満たしていて、その力学的振動が電磁波だという説を検証する時期がありました。
しかし、光速度の不変性が発見されると、その説は棄却され、エーテルはファイ○ルファン○ジーで主に見かけるMPを回復するアイテムという存在になりました(ゼノ○アスでは魔法という概念そのもの)。
結局のところ、「真空」に何かがあるという訳ではなく、「真空」そのものが荷電粒子に作用したりされたりできる「何か」として扱っていくこととなります。(真空の正体については僕はよく知りません。)
真空が実際に何なのかを明らかにしなくても、古典電磁気の範囲では問題なく電磁気現象を予言出来るので、その意味では「真空の正体」は置いておいて「真空の性質」にだけ注目していくと言えると思います。
それで、場とは何か?についてですが、真空が物体によって受けた変位の空間分布を場と呼びます。この分布を絵で書こうとすると、矢印をいっぱい書いて頑張ることになるで、矢印を麦と思えば、物体の周りに麦畑が広がっている感じになります。この麦畑がfieldであり、すなわち場と訳されています。
日本人だと、矢印の群れを何て表現するのかなぁと。ススキ?鍬?稲穂?結局は畑からは抜けられないかな。。。
LaTeXで図が真っ白になる問題について(texlive/2013)(Windows)
論文を書いていて、TeXworksでpLaTex(ptex2pdf)でpdfを作製。
どれどれと思って見たら、epsの図のところだけポッカリ真っ白。
LaTeXを書いていてeps画像がPDFファイルに出力されない問題を解決 - 透明の練習 第2刷
パソコン雑記: TeXでEPSファイルがPDF出力できない現象について(2)
を参考にして見たが、結局上手く行かない。
というか、そもそもdviファイルが出て来てなかった。
「pLaTexはダイレクトにtex -> pdfに行くから、dviは出ない」という先入観が良くなかった。
あと、コンソールを常時表示させていなかったのも良くなかった。
コンソールを見ると、Warningとあり、どうやらGhostscriptを「gs」のコマンドで呼んでいてコケていた。
ん?と思って、自分のC:/gs/gs9.20/binを見ると、gswin64.exeがいらっしゃった。
つまり、gs.exeをLaTexは探していたが、あるのはgswin64.exeだからシカトされていたわけです。
gswin64.exeをコピーしてgs.exeを用意したら、ちゃんと図が出るようになりました。
logファイルを見ればいいやと思ってたら甘かった。。。コンソール大事ですね。