まっしーの貯蔵庫

思考のゴミ箱

【python】本日のよくわからんエラー

今日もpython

import numpy as np
import matplotlib.pyplot as pet

x = np.arange(0.1,4000,0.1)

sum1 = sum(funyufunyu)
sum2 = sum(hogyahogya)
S = sum1/((sum2*x)**2)

plt.plot(x,S)
plt.show()

みたいなコードを書いたのね。そしたらさ

RuntimeWarning: invalid value encountered in true_divide

って怒られたの。

計算はできて、グラフも出してくれるんだけど、エラーを吐く原因がよくわからなかった。
stack overflowの皆様書いてくださってるんだけど、なんか俺の求めてる答えと噛み合ってる気がしなくて。


結局、xの指定を

x=np.arange(10,4000,10)

くらいまで解像度を落としたらエラーを吐かなくなった。グラフの様子もそうそう変わらなかったので問題なし。


よくわからないけど調子が悪かったら解像度を落としてみるのもアリなのかもしれない。

ちなみに今日は

print (sum)
      ^
SyntaxError: invalid syntax

などと怒られる場面もあって、「ついにこのmacちゃんも年か…」と思いかけた。(僕はpython3を使っているのでprint文には()をつける。2なら確かに怒られる)
このエラーもなんで吐いたのか、いつの間にか治ったけどなんで治ったのかわからない。とりあえずその辺を全部deleteして書き直したら治った。意味わからない。
かな入力でアルファベットを入力したからだと思っているが、真相は不明。
vimを使ったからだろうか。

ちなみに、最近エディタとしてvimを使い始めた。確かに移動は楽。だけど慣れないとただただしんどい。練習するしかない。
vimを使える奴は狂人らしい。望むところである。

陰関数のプロット

昔、僕が高校生だった頃は、数学Cという科目が残っていた。
数学Cの最後の方で”リサージュ曲線”の話が出てきていたものだ。
そこで先生は「これ手で計算して描くの面倒だから普通はPCに任せますwww」っていう話をしていた。
のを最近思い出した。


じゃあどう描くんだ。

未だに陰関数をプロットしなければならないという場面にはあまり遭遇していないのだが、とりあえず現時点で思いつくだけの描き方をリストアップする。

  1. 「Grapher」を用いる

Macを持っている人が使える、チート級の技。
二次元プロットも三次元プロットも可能である。
また、極座標も使うことができる。
さらに、どんな陽関数、陰関数も即プロットできる。

使い方は簡単。最初に座標系を選ぶ。
あとはプロットしてほしい式を打ち込むだけ。

どうも、微分とか積分とかもやってくれるらしい。とんでもないソフトだ。

  1. Gnuplot」を用いる

ググったけど、描き方忘れた。
大体のやり方は以下のとおり。

 + z=F(x,y)のグラフを三次元で描画
 + z=0を抜き取る
 + 抜き取った面を上から眺める

なるほどな、という感じのやり方であるが、もう少し簡単に描けないものだろうか。

  1. 微分方程式」を用いる

F(x,y)=0をxで微分する。
これによりdy/dxが求められる(求められない場合は、どんまい、としか言えない)。
それでできた微分方程式を、オイラー法なりルンゲクッタ法なり使って解く。

  1. python」を使う

mpl_toolkits.mplot3d の Axes3D というモジュール、すなわち潜在能力を呼び覚ます。
これにより、z=F(x,y)という関数であれば描画可能である。
今までの三次元プロットでよく使ったのはこの方法だ。

例。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

x=np.arange(-3,3,0.25)
y=np.arange(-3,3,0.25)

X,Y = np.meshgrid(x,y)

Z=np.sin(X)+np.cos(Y)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z)

plt.show()

f:id:astro_massii:20161009195103p:plain

何をやっているかというと

  1. x,yの範囲を設定する
  2. np.meshgrid(X,Y)により、XとYの網目をつくる
  3. z=F(x,y)を定義する。網目の各穴に対してzの値が定まる、という仕組み。
  4. 描画

という流れ。詳しくはググれ。pythonの三次元プロットのやり方を説明した日本語のサイトは多くはないが、やり方を分かりやすく書いてる方がいらっしゃるのでそっちを見るのが早い。

あとはz=0を抜き取ればいい。これはしたことないけど。てかできるんだろうか。知らん。


以上。
gnuplot微分方程式pythonの方法はx,yの2変数の陰関数でないと使えないという欠点がある。
やはりGrapher一強だろうか。
でも、Grapherを使うのは外道、という気もする。

今度、数値計算の本でも借りるか。

雑記20161006

天文学専攻になって1年になる。ようやく2年目だ。
これと同時に、幾つかの出来事からも1年になる。

・部活に行かなくなって1年
・起きる→大学で勉強する→飯を食う→帰る→勉強、風呂、1日の締めの食欲と性欲を満たすなど→寝る、の生活になって1年
・金>>>女の不等式が確立されて間もなく1年(時々不等号の数は50個になったり1個になったりするが、大小関係は変わらない)
・服のチョイスがテキトーになって1年
などなど

僕も立派なキチガイみたいな人間になった、ということだ。
ふん、悪くない。



最近、特殊相対性理論の復習が終わった。
特殊って大したことやってないなと思った。
ローレンツ変換が導く結果は確かに現象論として面白いし、主張された二つの原理はほーん、ってなってまあ楽しい。
だがしかし、なんかこう、数式をめちゃくちゃにいじくりまわすことがないように思えて、つまらんな。と感じたのである。統計物理学の方が楽しい。
個人的印象だけど。
それにEinsteinを誹謗中傷する気もない。
そもそも特殊相対性理論を発表したEinsteinはこれ以外にもあまりにも多くの業績を残していて、ちょっとついていけないっす…という感じだ。彼は任意の慣性系から見て天才であるに違いない。おそらく非慣性系から見ても天才だろう。

一般相対論は4年前期に授業があるから、それまでのお楽しみになるか、フライングで始めるか…うーん…



それから、ネットの相対論の解説ページを見ていて「うーん」感が否めなくなった。

いや、サイトを作っている方々は頑張っている方だとは思う。
だけど、なんかなあ…あんまり腑に落ちないんだな、これが。当たり障りの知識を書いて終わり。という感が感じ取れて、ちょっと好きになれない。

じゃあ自分で書けよ。という話になるのかもしれないが。
それもそうだな。俺が納得できるような物理をやってない人向けの相対論の解説サイトを作ってもいいのかもしれない。
気が向いたら書こう。


そう言って、書くべき物理解説項目が増えていく。今溜まっているのはこの四つ。多いよ。
・天文で使う座標系
pythonでよく使う用語集
・反変、共変成分
・特殊相対論←New!

気が向いたら進めよう。今学期も、ド暇ではないからな。



一方、最近は少し勉強に飽きた感がある。
集中に欠ける瞬間が増えたように思う。
原因はわかってるんだが…この場では言わないことにしよう。俺以外には関係ないことだから。

幸い、勉強自体は嫌にはなってないんだが、やはり1年体を動かしてないと刺激が足りなくなる。
何か、刺激が欲しい。
USJに行けば解決だな。

誰かUSJ行こう。

雑感

人と話すのがヘタクソになった気がする。
特に、理学部じゃない人と喋るとき(これは気のせいかも)。

何がヘタかって、話の切り出し方、話の盛り上げ方、話の締め方。
全部か。

少しだけど、困ったなあ

ベクトルの反変性、共変性

について記事を書こうと思った。
texに前書きを書き終え、さあ本題だ!と思った瞬間。
僕の使っている本について、
「この本のこの部分、斜交座標で書いてるけど曲線座標じゃダメなの?」と感じた。
曲線座標のページを開いた。
眺めた。

モヤモヤが解決した。

「もう記事書かなくてもよくね??」

ということで、さっさとモヤモヤをノートに書いて、それを解決して、相対論の勉強の続きを始めよう。

未解決問題その1<銀メダル>

「まっしーの未解決問題」
このコーナーは、筆者が時々思いついてしまう、自分ではどうしても解決できないのだが他人から見れば「馬鹿じゃねえのお前www」で済む可能性のある問題を、このブログに遭遇した数少ない方々に解を求めてみようという、みなさんが得することはほとんどないが僕は得する可能性のあるコーナーである。
僕は明快な日本語による解を求めているので、なるべく客観的、傍観的な日本語の解を思いついた方は是非コメントをください。
逆に、解が偏見による予備知識を前提にしていたり、主観的であるにもかかわらず"絶対あってるのだ!"という体で書かれている場合に関しては、全力で燃やさせていただきます。
主観的意見に関しては、「個人的感想なんですが」などと枕詞を添えていただければそれでokです。

今回は、栄えある第一回。

今年の夏はリオオリンピックでわりかし盛り上がった。メダル41個だっけ。フツーにすごいと思う。
僕がTwitterをやっていた頃はリオの治安がどうのこうのと騒いでいる界隈があって、また別の界隈には東京五輪を中止せよとかいう凄まじい大志を抱いている界隈もあって、いやあtwitterやめるとそういうのに遭遇することも滅多にないから気楽だなあ!と実感しているところである。
リオは財政が危うかったらしいがどうにか無事に終わったし、パラリンピックも目下のところでは順調に進んでいるようだし、たぶん東京五輪もなんとかなるでしょう。たぶん。

さて、前置きはこのくらいにしよう。本日の未解決問題はこちら。

吉田沙保里選手が決勝で敗れ、銀メダルに終わってしまった。
このときの、吉田選手がテレビに向かって「金メダル取れなくてごめんなさい」と放ったインタビュー映像が、僕の中ではとても印象に残っている。
多くのみなさんと考えていることはおそらく一緒だろう。
「いや、銀でもすごいよ、謝らなくていいのよ」
お昼ご飯を食べながらテレビを見ていたのだが、たまたま一緒だった人が、Twitterでも同様の声で溢れていると言っていた。

ここで終われば良かったんだけどな。

その日の数日前後。いつだか忘れた。
僕を含め3人で話しているとき、たまたま今話題の蓮舫さんの話になった。
で、ふと思ったのである。

数年前、民主党政権による「事業仕分け」があった。
もう思いついた人もいるかもしれない。
蓮舫さんといえば、理研スパコン開発事業(だった気がする)に対して

「2位じゃダメなんですか」

と言い放った人である。
この発言についての考察はしない。が、こう言及しておこう。

この発言は、批判されている。

まあ、ここだけ切り取られて広まったもんな、批判されるだろうn…んんん?

ここで僕は
「オリンピックの銀メダルを褒め称えるのと、蓮舫さんの発言を批判するのとは、どう違うのだ??」

と、僕は思ってしまったのである。



以下、僕の頭の中で考えていることをだらだら書き連ねる。

とりあえず僕が考えているのは、発言の時期が違う、という点だ。
リオ五輪は銀メダルを取った後の話である。一方、事業仕分けは順位がつく前の話である。
発言の時期が違うから同列に語るべきではないのかな、とも思う。

じゃあ、発言の時期を思考実験でずらしてみよう。

以下、思考実験
______________________________
インタビュアー「オリンピックへの意気込みを教えてください!」
選手「そうですね、銀メダルを目標に頑張りたいと思います」

世界機関「日本のスパコン矢澤にこ”は世界第2位!」
理研「ああ…2位か…日本の皆さんごめんなさい」
おっさん「2位でダメなの?」
______________________________
思考実験終わり

…しまらない。特に「銀メダルを目指します」という発言がなされたときの後味ね。
でも、これって批判されるんだろうか。
優勝候補の選手の発言がこうなら「もっと熱くなれよ!」とかいうヤジが飛ぶのかもしれない。
しかし、もしこの選手がまだまだ伸びしろのある若手で、それどころかこの選手の出る種目には海外の屈強な優勝候補が何人もいる、とかいうケースだったらどうなるんだろう。

いい例がある。陸上の男子短距離で考えてみればより具体的で想像もつくんではなかろうか。ボルトに勝てと言われても、まずアメリカの選手に勝てるかもわからん。そんな感じである。

そうやってみてみると、僕の個人的実感としては、こっちのケースではそんなに批判しない人も割といる気がするのだ。

(ちなみにスパコンの件だが、これは蓮舫さんの発言のおかげで注目されているようなもんだし、もし事業仕分けの対象外になっていたら誰も気にしない状態であってもおかしくない。そういう意味でこのおっさんは非常に貴重な存在である)

それからもう一個違うものがある。発言者が当事者かそうでないか。
リオ五輪は選手自身が宣言したものだが、スパコンの場合は理研から見て外部の人間である一人の政治家に指図される形で言われたものだ。
じゃあこれも逆のケースを思考実験してみよう。

以下、思考実験
______________________________
選手「金メダルを目指したいと思います」
インタビュアー「銀メダルじゃダメなんですか?」

理研「我々のスパコンは1位を目指します」
______________________________
思考実験終わり

実験の仕方が間違ってる気がする。なかったことにしよう。
実験って難しいんですよ。
これ、選手の順位が2位になった後に外部の人間から何かを言われるVS理研スパコンが一位を目指すと意気込む という構図にしないといけないんだけど、”選手の順位が2位になった後に外部の人間から何かを言われる”ケースが思いつかなかった。
ので、この思考実験は中止。



以上が僕の頭の中で考えていることである。



ここまでごちゃごちゃ書いたが、僕が言いたいのは「みなさん蓮舫の発言叩いてる割にはオリンピック選手の銀メダルは褒めてるではないか、どういう心理なの?」ということである。



少し頑張れば答えが出そうなのだが、やっぱりわからん。ってなるので、このブログに遭遇した数少ない皆様にも考えてみてほしい。
考えずに答えが出る話なのかもしれないけど。

長くなったので今回はこれでおしまい。
僕はもっと短い文章でまとめる力をつけなければならないようだ。

【Python】イミフな言葉を自分なりに整理

僕はプログラミングが苦手である。これを言うのは4回目くらいだろうか。

なぜ苦手かというと原因はいろいろあるが、一番最初に苦手意識を持ってしまったときに感じたのは「用語がいちいち抽象的でわかりにくい」ということだと思っている。
例えば、pythonを習い始めたときに最初の方でぶち当たった壁。

"モジュール"

英語で"module"と訳す。訳せてねえじゃねえか。

ということで、公式?のヘルプページを見る。

(以下引用)
モジュールは Python の定義や文が入ったファイルです。ファイル名はモジュール名に接尾語 .py がついたものになります。モジュールの中では、(文字列の) モジュール名をグローバル変数 __name__ で取得できます。例えば、お気に入りのテキストエディタを使って、現在のディレクトリに以下の内容のファイル fibo.py を作成してみましょう:
(ここまで)

6. モジュール (module) — Python 3.5.2 ドキュメントより)

今読めば「ああー…」というくらいに理解できるけど、プログラミングを触り始めた頃にこんなもの読んだ時は「意味わかんねえーよ死ねバーカ!」ってなるしかなかったものである。
すまないが、マジでわからんのよ。
他にも例はたくさんあるけど、後で喋る。

で、"モジュール"の具体例を見ても"numpy"、"matplotplib"のどこがモジュールなのかわからなかったのである。

ということで、1年前の僕のようなプログラミング用語わからん難民をこれ以上生み出さないよう、以下にプログラミング特有の言葉をできるだけ身近な例によって説明する。
なお、pythonの用語に絞ってるので、そこはご勘弁ください。


【モジュール】
潜在能力。普段はその能力を使えないが、人間に宣言(あるいは、命令)されると突然使えるようになる。
"matplotlib.pyplot"というモジュールで説明する。

普段、pythonはグラフを描くことができない。だから

X = [1,2,3,4,5]
Y = [2,4,6,8,10]
plt.plot(X,Y)
plt.show()

なんてコードを書いても

NameError: name 'plt' is not defined

と、「なんだよpltって。知らねえよ」と怒られる。

ところが、pythonはグラフを描く能力を奥底に秘めている。普段はそれを発揮しないのだが、人間から「それ、使え」と言われると使えるようになるのだ。
つまり、

import matplotlib.pyplot as plt

という一文を最初につけるだけで、グラフを描いてくれる。
as plt の部分は、"matplotlib.pyplot"っていちいち書くのめんどいからpltって略させて。の意味である。

だから、もし君が西木野真姫ちゃん推しならば

import matplotlib.pyplot as maki

と書けば真姫ちゃんの名前を呼びながらコードを書くことができる。もしかして、これ、真姫ちゃんに「グラフ書いて〜」などと命令している感じになるんだろうか。
悪くないかも。

少し話がずれたが、要するに、pythonはグラフを描くという"matplotlib.pyplot"という名前の潜在能力を持っている。モジュールとはこういった潜在能力の総称である。

【会話モード】
Macの場合、ターミナルで
python
とタイプしてエンターキーをパチーンと叩くと会話モードに移行する。
どういうことかというと、普通は何らかのエディタを用いて

import matplotlib.pyplot as plt
X = [1,2,3,4,5]
Y = [2,4,6,8,10]
plt.plot(X,Y)
plt.show()

と書いたファイル"makichandaisuki.py"を用意して、ターミナルで実行するとスクリプトを全て実行しようとする。
したがって、スクリプト内に一箇所でもエラーがあると、多くても、エラーのあった行の直前までしか実行されない。

一方、会話モードは一行ずつ実行する。ので、

>>>import matplotlib.pyplot as plt
>>>X = [1,2,3,4,5]
>>>Y = [2,4,6,8,10]
>>>plt.plot(x,y)

まできてエラーを起こしても、Y=の行まではパソコンが覚えていてくれる。

この様子が会話しているように見られる。だから「会話モード」という名前がついている。

【配列】
そのうち、扱い方を含めてちゃんと書く。僕はリストの処理は比較的慣れているが、配列の処理は不慣れなのである。
pythonにおいてリストと配列の違いって分かりにくいと思う。だって、グラフ書くとき、どっちでもいけるし、似てるじゃん。
(そう思うのは僕だけなんだろうか)

単純に言うと、リストは「数字または文字を一列に並べただけ」のもの。
一方、配列は「行列」である。線形代数で散々扱う、あの行列だ。
線形代数の教科書の初っ端の方で、行列の定義を見て欲しい。おそらく、”〜このような配列をm×n行列と定義する”という表現があると思われる。配列という言い回しは、ここからきているのだ。
したがって、配列はどんな形でも構わない。1×10でも、3×3でも、5×2678でもいい。たまたま1行の配列に関してはリストと形が一緒に見えるだけなのである。

なんで配列と訳したのか…行列の方がわかりやすいだろう…
日本にpythonを導入した人が英語が苦手だった、ということにでもしておこう。


二日連続で更新。珍しい。