ポータブル(2)

また、アイツがやってきた。一年ぶりぐらいだろうか? いやな奴である。 と、書き始めると、借金取りの怖い人かと思われちゃうな。

洗面所で歯を磨き、夜の散歩にでも出かけようとしてたんだ。そしたら、ギクリと嫌な感じの音がした。

もう、速攻で冷蔵庫よりアイスノンを取り出して、腰に当てましたよ。

寝返りがうてない、要介護老人の出来上がり。介護度4ぐらいですかね。女房には、未来の予習演習だと 馬鹿にされるは、おつかいにも行けない、使えない野郎の認定は下るはで大変デスダ。

パソコンやろうと、椅子に座ると最初痛いけど、そのうちに慣れてしまって固まってしまう。椅子から 立ち上がるのは恐怖ですよ。机に手を置き、そっと静かに手の力を借りて立ち上がる。

移動は、腰に手を当て、前かがみになって。。。女房にみっともないと怒られた。そこで、頑張って直立不動の 体勢になったよ。その状態で固まったのはいいんだけど、歩けない。しょうがないので、ロボット歩き(足を 延ばしたまま、横から前に足を回して進む)した。5分で行ける歯医者まで、15分かかった。ふうぅー。

あーーー、早く直らんかな。

Python sf

インターネットをずっとワッチしてたら、またご同輩を見つけたよ。道の駅へ休日に行くと、ご同輩に 会えるのと一緒かな。彼らはほとんどがパイプ職人さんだったりします。おいらも、塩ビの職人にでも なろうかな。

今回見つけたポータブルは、一行野郎でサイエンス方面が得意な方でした。 python sf

説明書の中に、電荷がどうのとか、lambda がλと書けるよとか、電気の単位付き数値が使えるよとか、 嬉しい機能が満載。早速入れてみようとしたら、 vpythonってのも必要なのね。入れてみたよ。 デモが付いてた。面白いな。こんなに簡単にグラフィクが出来るならちょっとはまっちゃうかもよ。

from __future__ import division
from visual.graph import *

# Bruce Sherwood, Jan. 1, 2008
# Use points object to make a pixel-like plot of a fractal

XMIN = -2
XMAX = 0.5
YMIN = -1
YMAX = 1
g = gdisplay(width=750, height=600, xmin=XMIN, xmax=XMAX, ymin=YMIN, ymax=YMAX)
pixels = gdots(shape='square', size=2)
# Scale factor: 2 units (YMAX-YMIN) equals 600 screen pixels
# Plot 2 by 2 gdots points 2*(2units/600pixels) apart:
r = 2*2/600

# Mandelbrot set (see Wikipedia, for example):
max_iteration = 100
for y0 in arange(YMIN, YMAX, r): # range over all pixel positions
    for x0 in arange(XMIN, XMAX, r):
        z = z0 = complex(x0,y0)
        iteration = 0
        while ( abs(z) < 2 and iteration < max_iteration):
            z = z*z+z0
            iteration += 1
        # Leave points black if the iteration quickly escapes:
        if (.1 < iteration/max_iteration < 1):
            c = color.hsv_to_rgb((iteration/max_iteration-.1,1,1))
            pixels.plot(pos=(x0,y0), color=c)

これ、例に出てた、フラクタル図を描くやつ。複素平面なのね。Pythonにもってこいだな。

そんでもって、入れといた方がいいモジュールにsympyってのもあるんか。こやつは、シンボリックな数式処理を可能にします。 って、書いてあるよ。これって昔、Lispとかでやった、数式を展開したり、微分したりするやつかな? REDUCE (数式処理システム)が動けば、一人前のLispとして認定されますって、よく言われてたな。

sympy

sympyが本家なのね。入れてみた。 ドキュメントは、ここにある。tar玉から入れると、サンプルも 付いてきた。ちょっと遊んでみる。

>>> from sympy import *
>>> x = Symbol('x')
>>> limit((1 + 1/x)**x, x, oo)
E
>>> E.evalf()
2.71828182845905

これ極限の計算だ。第一引数の関数で、第二引数の変数を、第三引数で与えられる所まで計算するとどうなるか。 答えはEって事ですね。複利の計算とかに出てくるんだな。

ちょいとメモしとくと、Symbolは、文字列をインターンするんだな。evalfは、定数を浮動小数点に直すやつか。 piも有るな。

>>> a,b,c,x,y = symbols('a b c x y')
>>> expand((x + y)**2)
x**2 + 2*x*y + y**2

今度は、まとめてシンボルを登録してみた。そして式を展開してみた。昔、さかんに式の展開とかを やらされましたな。

>>> expand(x * y, complex=True)
-im(x)*im(y) + I*im(x)*re(y) + I*im(y)*re(x) + re(x)*re(y)

complexをTrueにすると、複素数として展開してくれます。sympyでは虚数単位に I を使うのね。

>>> simplify((x**2 + x * y)/x)
x + y

こちらは、式の簡約化です。昔、Schemeで同等のコードを見た事があるけど、結構大変だったような気が します。コードが載ってた本、もう処分しちまったかなあ。こういうのこそLispにうってつけだと思う んですが、何を血迷ったか、LispでWebなんてのがあって、それ、使い方間違ってるぞと思っちゃいますよ。

>>> factor(x**2 - y**2)
(x - y)*(x + y)

これ、因数分解って言うんでしたっけ。よく、練習させられたなあ。

>>> solve(a * x**2 + b * x + c, x)
[(-b + (-4*a*c + b**2)**(1/2))/(2*a), -(b + (-4*a*c + b**2)**(1/2))/(2*a)]

これ、方程式の解法です。第一引数の式は0とみなし、第二引数について求解します。二次方程式って、 解が2つなんだけど、ちと醜い。こういう時は、

>>> pprint(solve(a * x**2 + b * x + c, x))
         _____________   /       _____________\ 
        /           2    |      /           2 | 
 -b + \/  -4*a*c + b    -\b + \/  -4*a*c + b  / 
[---------------------, -----------------------]
          2*a                     2*a           

数学で使われる記号をASCIIアートで表現するって難しい。ここは是非、2chに巣くうAA職人さんに、頑張って 欲しいですだ。

次はお子様の夏休みの宿題です。

ツルとカメがあわせて8匹、足の数があわせて26本であるとき、ツルとカメは何匹(何羽)いるか。
ただしツルの足は2本、カメの足は4本である。

さあ、困った。おいらの固い頭じゃ解けないよ。豆腐の角に頭をぶつけて、冷やしてみよっかな。 まてまて、こういう時は、sympyにお任せよ。

>>> k,t = symbols('kame tsuru')
>>> solve([t + k - 8,  2 * t + 4 * k - 26], [t,k])
{kame: 5, tsuru: 3}

亀(k)と鶴(t)を宣言しました。鶴と亀が合せて8匹なんで、t + k = 8 なんだけど、8を移項して おく。もう一つの式も同様。2つの式をリストで与えて、第一引数にする。第二引数は、求解すべき変数を 与える。結果は、亀さん5匹、鶴さんは3羽でした。

答えを書く時、鶴さん3匹と書いちゃだめですよ。技術屋さんは単位が命ですからね。

次は微分・積分、優しいです。昔の苦労が嘘のよう。

>>> diff(sin(x),x)
cos(x)
>>> integrate(cos(x),x)
sin(x)

sin(x)を微分したら、cos(x)になり、それを積分したら元に戻りました。

>>> integrate(x, (x,0,3))
9/2

xをxについて下限0から上限3まで(定)積分したら、答えが有理数で返ってきました。数式処理っぽい 答えに満足ですだ。

>>> pprint(integrate(cos(x), (x,0,pi/4)))
  ___
\/ 2 
-----
  2  

ルートの所のはねの部分が円記号に化けてるけど、本来は、バックスラッシュで、綺麗なルートに なってます。

sympyには、この他にもいろいろな機能が有るようだけど、とりあえず割愛。詳細は、 Python Scientific Lecture Notes を参照。で、このページを読んでいたら、配列のスライスの話がバンバン出てくる。どこかで読んだ事 有るなあと思っていたら、ビューティフル・コード に、夜にも美しいコードっつう事で解説が出てた。 つながりで復習してみっかな。

Pythonxy

python sfからのリンクで知ったんだけど、pythonxyなんてのがあるのね。調べてみると、 科学計算のための楽々環境 python(x,y)で 絶賛されてる方がおられた。エクリスプまで付いた超重量級なやつみたい。これはもう、ポータブルとは とても言えないけど、試してみる鹿。

pythonxyへ行って、取ってきた。アーカイブが500Mを超えているよ。取りあえず 、USBに入れてみる。いろいろあって、3時間も入れるのにかかった。USBにインストール先を 指定したにもかかわらず、pythonのご本尊様は、ちゃっかりとCドライブに入っちゃったよ。 こりゃ、固定システムだな。しっかりとレジストリィーに爪跡を残してくれているし。。。

python(x,y)なんて言うランチャーがDeskTopに出てきた。括弧が付いてると、つい評価したく なるじゃないですか。罪作りなネーミングだ事。QtのSDKが有ったり、SciTEなんていうeditorが 有ったり、mingwでコンパイル出来たり、Tabで切り替え出来るコンソールが付いていたりします。

gnuplotが付いてました。グラフはgnuplotにお任せよーと思っていたら、 Veuszなんて言う、プロッティングシステムも有るのね。 どうやって使うんだろう?

WinMergeなんてのも有るぞ。diffツールと言うかバージョン管理ツールの一種なんかな? 使い切れないぞ。おいおいやってくかな。