ラベル python の投稿を表示しています。 すべての投稿を表示
ラベル python の投稿を表示しています。 すべての投稿を表示

2007年10月2日火曜日

またまたpythonで!

pythonで実はデータをプロットする事が出来ます。
Matlibplotというツールをインストールするとグラフを書くことが出来ます。

y=exp(-(x-0.5)^2)をプロットしてみましょう。
http://matplotlib.sourceforge.net/

----python---script---

import math
def gaussfunc(x,a,b):
return math.exp(-a*(x-b)*(x-b))
from pylab import *
x = arange(-2.0, 2.0, 0.01)
y=[]
for e in x:
y.append(gaussfunc(e,1.0,0.5))

plot(x, y, linewidth=1.0)
show()

----python script----

上のスクリプトを実行すると、したのようなグラフが出てきます。Gauss関数を変えられるようにしています。




次に三次元関数z=exp(-1.0*x^2-0.1*y^2)*(xy+x+y)をプロットしてみると…

----python---script---


import math
from pylab import *
def gaussfunc(x,y,a,b):
return exp(-a*(x)*(x)-b*(y)*(y))

dx, dy = 0.05, 0.05
x = arange(-3.0, 3.0, dx)
y = arange(-3.0, 3.0, dy)
X,Y = meshgrid(x, y)
Z = gaussfunc(X, Y,1.0,0.5)*(Y*X+X+Y)
im = imshow(Z,origin='lower' ,alpha=.9)

cset = contour(Z, arange(-2.0,2.0,0.1), origin='lower' )

clabel(cset,
inline=1,
fmt='%1.1f',
fontsize=10)
hot()
colorbar()
show()



----python script----

このグラフはしたのようなグラフになります。ちょっと奇妙ですね(^^;)


自動的に等高線が引けるので、二次元マップを書くときには便利です。
二次元平面を細かいグリッドで切ることで、二次元の配列と考える事が出来ます。
そのグリッド上でのZの値を求めるために、XとYすら二次元配列と考える仕様になっていて、
XやYには二次元配列の要素で各xとyの値が代入されます。それをZに関数を通して
ほおりこむことで各グリッドでの値の計算しています。

Zの値を求めるときにはmathモジュールではなくて、pylabについているモジュールを
使う必要があるようです。

実体として、Zは二次元配列その物となります。二次元データがあれば、
上のimshowを使って絵をかけるし、等高線も自動的に引くことが可能です。

2007年9月25日火曜日

なんだかガウス関数

昔の著名な数学者、ガウスさんが作った関数として、ガウス関数という物があります。

wikipediaによく記述されていますが、至る所でこの関数が現れてきます。

正規分布を用いる統計学や、グリーン関数論、量子力学、統計力学等など、
初等的な関数扱いされています。

ガウス関数の説明をするためには、ネイピア数と指数関数などの高校数学だけで充分です。
wikipediaの説明に任せますw

なので、pythonで、ガウス関数をば。
f(x)=exp(-x*x)

----python---script---

import math
def gaussfunc(x):
return math.exp(-x*x)

----python script----

となります。これを次はガウス積分に使えますw
積分方法は台形公式を使ってしまいましょう。
----python---script---

import math
def gaussfunc(x):
return math.exp(-x*x)

def integrate(a,b,n):
integ=0.0
for i in range(0,n):
w=float(b-a)/n
x0=a+float(i)*w
x1=a+float(i+1)*w
y=w*(gaussfunc(x0)+gaussfunc(x1))*0.5
integ+=y
return integ
print integrate(0,100,1000)

----python script----

ガウス関数を0から無限大まで積分すると積分公式から円周率の二乗根を2で割った数になります。


ここで、integrate(0,100,1000)で、意味しているのは
0から100まで積分し、積分区間を1000で割った数(0.1刻み)という条件で、
台形公式を微小領域に適応するという事です。

そうすると、答えは
0.88622692545275794
となります。
円周率の二乗根を2で割った数は
0.88622692545275794
なので、17桁会うくらいの精度で計算出来ています。
よって円周率を求めるプログラムは
----python---script---

import math
def gaussfunc(x):
return math.exp(-x*x)

def integrate(a,b,n):
integ=0.0
for i in range(0,n):
w=float(b-a)/n
x0=a+float(i)*w
x1=a+float(i+1)*w
y=w*(gaussfunc(x0)+gaussfunc(x1))*0.5
integ+=y
return integ

a=integrate(0,100,1000)
print a*a*4

----python script----
となって、
3.14159265359
と求まります。

このプログラムだと、16桁以降が怪しいですけどね。

高校生にもおすすめプログラム言語ですね、pythonは。
windowsだとエディタが無いと辛いけどね

2007年9月6日木曜日

windowsでpython

スクリプトなどのプログラムエディタとして知られているらしいgeanyというソフトは、python用エディタとして使うのには優れています!

http://geany.uvena.de/Main/HomePage


自動でtab補完をしてくれるので、楽にプログラムを組むことが可能です。
pyhtonだけ対応しているわけではないですが、優秀でなおかつ軽いソフトです。


http://ymasuda.jp/python/biopython/index.html


biopythonというものもあるようです。バイオ系計算処理などをこなす
モジュール群です。PDBからデータをとってきたりと、結構重宝するソフト
らしいです。


でも、やっぱ自分が意図したことをやるには自分で作らないとね!geanyのおかげでwindows上でpythonを動かす環境はすべてそろいました。

geany MSYS(cygwinでもよい)と、pythonのパッケージがあれば!

例えば、長い文書を(あるセンテンスで区切って、それぞれの名前で保存する)なんて事もスクリプトで解決できます。たとえば、いっぱいある画像を、PILを使って、すべて同じ加工方法で別名保存を行うなど。人がやれば一個一個アプリで開いて作業する事を、短時間で正確にやってしまいます。

でも、情報はほとんど英語なんだよな(涙)

2007年8月19日日曜日

python講座(2)ベクトルの演算

pythonの講座を続きものにします。

前回はリストの成分にリストを指定できて、二次元配列様に使用できる事をやったので、そのつづきです。今回はclassをつかって、複数のベクトルを呼び出せるような配列を作り、それらの演算を行う方法を示します。簡単な内積と外積を行います。

pythonは最初に
# coding : shift-jis
というように先頭の行にどういうコードでファイルを作ったかをかく必要があります。

次にclassを定義して、その後メイン部分という流れです。


----------------------script02.py----------------------
# coding : shift-jis

#クラス定義部分:型宣言みたいなもん。

class hoge2:

"Class definitions for vecters"

def __init__(self,i):
# i個分のリストを予約しておく。
self.v=["各ベクトル"]
for i in range(i):
self.v.append(None)
return

def ins(self): #要素を増やす
self.v.append(None)
return

def vecins(self,i,b): #ベクトルの成分を代入
self.v[i]=b
return

def naiseki(self,a,b): #二つのベクトルの内積
return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]

def gaiseki(self,a,b): #二つのベクトルの外積
x=a[1]*(1.0*b[2])+a[2]*(-1.0*b[1])
y=a[0]*(-1*b[2])+a[2]*b[0]
z=a[0]*b[1]+a[1]*(-b[0])
return [x,y,z]



#メインプログラム部分



#hoge2型でxを宣言

x=hoge2(3) #三種類のベクトルを定義しますよという意味

#ベクトルのタイトルを0番目のリストにいれた。

print x.v[0]



#xの各要素にベクトルをリストとして代入
x.vecins(1,[1.0,0.0,0.0]) #x方向のベクトルと同じ
x.vecins(2,[0.0,1.0,0.0]) #y方向のベクトルと同じ
x.vecins(3,[0.0,0.0,1.0]) #z方向のベクトルと同じ

#各要素を表示すると、ちゃんとベクトルになっている。
print x.v[1],x.v[2],x.v[3]

#各要素のベクトル成分で演算が出来る。

#ベクトルの内積の定義
print x.v[1][0]*x.v[2][0]+x.v[1][1]*x.v[2][1]+x.v[1][2]*x.v[2][2]

#ベクトルの内積を関数で計算
print x.naiseki(x.v[1],x.v[2])

#ベクトルの外積を関数で計算
print x.gaiseki(x.v[1],x.v[2])

#あらたにベクトルを増やす
x.ins()
#増やしたベクトルの成分を代入
x.vecins(4,[1.0,2.0,3.0])

#あらたに定義した四番目のベクトルのy方向の要素を内積で計算
print x.naiseki(x.v[2],x.v[4])

x.ins()
x.vecins(5,[2.3,3.1,8.2])
#おなじように新たに定義したベクトルをつかって、外積を行う。
print x.gaiseki(x.v[4],x.v[5])
#順番をかえるとちゃんと反対向きのベクトルとなっているのが分かる。
print x.gaiseki(x.v[5],x.v[4])

----------------------script02.py----------------------


流れとしては、__init__をつかって最初にいくつかの分だけベクトルを定義します。その後insを使って、いくつでも増やすことが出きるようにしています。ベクトルの要素を代入する時はvecinsを使い、上の例ではx.v[i]というベクトルにしています。それらのベクトルを指定することで、内積や外積などをnaiseki,gaisekiで計算できる様にしています。

この様にclassを使ってやると、class内で定義されたself.のあらゆる変数や、関数を外部で呼び出して使うことが出来ます。class内で、self.v[0]としていたリストは外部ではx.v[0]となっています。さらにx.gaiseki()として、外部で関数を呼び出すことすら出来ます。


流体力学計算のパッケージソフトというのもあるようで、ほとんどが商用の物が多いようですね。映画などで実績のある流体力学ソフト(real flow)というものがあります。
http://www.nextlimit.com/realflow/jp_index.htm
これは流体力学計算パッケージというよりは、バーチャルな流体(液体や流動固形物)をリアルに見せるためのレンダリングソフトのようです。値段がめちゃくちゃ高いし、高級なマシンが必要で、パッケージの内容を使いこなすのにすごく時間がかかりそうです。pythonを使って独自スクリプトを実装させることも可能なようですね。windows,Mac,linuxで動作するようです。日本沈没(みてないな、この映画は)でも、使われたソフトのようですね。

real flameっていうのがあれば面白いんだけどね。(ミッションインポッシブルで火のダンサーがイントロで出てくる。マドンナが主題歌で、主役やるはずだったのに蹴った映画の方)

2007年8月18日土曜日

python講座(1)二次元配列

pythonは蛇の名前がついたプログラム言語です。でも本当の由来はイギリスのコメディアンの名前らしい(モンティ・パイソン)。なので、大抵は蛇のアイコンなのだが、僕は蛇が嫌いなので、アイコンを各自変更する方が良いと思います。というか、python配布者さん、蛇じゃなくて、pyなら、「アップルパイ」とかのアイコンにしてくれ!!

初心者でもとっつき易い、敷居の低い言語として知られています。しかし、用途は多彩で、ubuntuというlinuxの開発にpythonのプログラムがよく使われているとか(本当かどうかは知らない)。決行いろんな所で使われているので、知っておいて損はなさそうだと思いました。
http://ja.wikipedia.org/wiki/Python

pythonの初歩的なマニュアル(おすすめはチュートリアルだがwindows向きではない)
http://www.python.jp/doc/2.3.5/index.html

pythonの利用目的はかなり多い。単なる文字列の定型処理だったり、GUIだったり、penGLつかえたり、blenderで使えたり、OpenOfficeで使えたり、行列計算や量子力学計算や、データのプロット等など、かなり多くをこなす。

データプロッター用言語として使うケース
http://matplotlib.sourceforge.net/

GUIアプリケーション作成をwxwidgetsを用いて行うケース(かなり幅が広い)
http://www.harukaze.net/~haruka/wxpython/index.html

ゲームなどの開発用途で使うケース
http://www.halb-katze.jp/pygt/index.html

インストール::
linuxではほぼ初期の段階でインストールされています。(fedora7とvine4.0ではそう。Macもそうらしい)Windowsではインストールする必要があります。
http://www.python.jp/Zope/download/pythoncore
詳しいインストール方法はgoogleで 「 python インストール windows」などと検索すると出てきたりします。上のリンクでpython-2.5.msiをダウンロードして、nextとfinishボタンをおすだけでよかったりします。

windows上でpythonをインストールしたり動かすのに詳しいサイトは沖データのページです。
http://www.okisoft.co.jp/esc/python/iron-python-intro.html
彼らのページではpythonを起動して、インタラクティブなプログラムや処理の仕方を行っているようです。プログラムをprog1.pyと保存して、コマンドプロンプトでpython prog1.pyと実行しても良いし、prog1.pywと名前を変更してダブルクリックで実行という形でもよい(この場合処理は行われるが、printで出力させたものはどこかに言ってしまいます。)


トータルでおすすめな入門サイト
http://ar.aichi-u.ac.jp/python/
このページは非常にお世話になったんですよ。pythonの使い方が非常に丁寧に書いてあります!!

まぁ、以上のようなpython関連の知識があるとして、pythonのプログラムメモをば書いていきます。

まずpythonで二次元配列を扱う例を。

-------------------script001.py------------------------

#-*- coding: shift_jis -*-

#リストを二次元配列として使う方法
a=[]
#リストの初期化
#aというリストが初期化された。このリストには
#要素が入っていないので代入する必要がある。
#リストの要素はリストでも構わない!
b=[]
b.append(1)
#要素を追加するときはappendという物を使う。
b.append(2)
b.append(3)
#以上の操作で、bというリストを作り、その要素を
#代入して、b=[1,2,3]というリストを作った。
a.append(b)
#これで、aというリストにbというリストをついかす
#る事ができる。
print a[0][0],a[0][1],a[0][2]
#これで、さっきのbの要素にアクセスできて、さらに
#その値を変更する事もできる。


-------------------script001.py------------------------

これを実行すると、
1 2 3
と表示されるはずです。

この様にして二次元配列を作ることが出来きますが、これは一次元のリストの要素がさらに一次元のリストなのです。

2007年8月17日金曜日

暑い!!!

昨日の夜、猫を見かけた。

ここ数日間暑いです。
うだるような暑さで、夜は寝苦しいです。

ようやくpythonのクラスの本格的な使い方を習得出来たので、
解析モジュールとして用意する事にし、数日間。

トポロジーファイル部分を読み込むことに成功
再計算用データセットから、座標と速度を読み込む事が出来た
各残基の運動エネルギーと自由度を算出し、温度を定義できた
全運動エネルギーと自由度と温度を計算できた

今度は
トラジェクトリから、ステップずつ座標を読み込む
各ポテンシャルとフォースを計算する
のが課題です。


クラスの使い方:::


#クラスの定義部分
class hoge:
" hoge hoge class "
def __init__(self):
print " hoge hoge instance is defined!"
self.say="hara hetta"
self.number=8
return
def calcc(self,number1,number2):
buf=number1+number2
return buf


#以下はプログラム実行部分

x=hoge()
# hogeを呼び出して、xという名前を付ける。
#特殊関数__init__をこの時に実行する。
#上の場合はただ、変数に値を入れているだけ。

print x.say
#xはhogeと同じで、selfというのをx
#で置き換えると、このように呼び出せる。

print x.number
#おなじく
s=x.calcc(1,2)
#hogeの中の関数calccを呼び出せる。因数
#をこのように付けてやることもできる。
print s
#関数calccの戻り値に二つの因数の和を指定し、
#上で変数sに代入したので、表示させてみる。



というようなもんです。
定型処理とかを独自で実装するにはクラスは便利ですよ〜!!

2007年8月10日金曜日

windowsでスクリプト

いっつもlinux上でばっかり作業しているので、windows上で何かやろうとすると、perlやcsh,bash等など無い物ばかり。さらにDOSのコマンドが少なくなった(windowsME以降かな?)ので、標準出力を得るのが難しい。一応開発環境もネット上から集めてくればwindows用にあるし、c言語つかってプログラム等を作ることも出来る。

で、c言語っていうのは…まだ始めたばかり(今まではやろうとしてはサボってた。必要がなさげだったし)だけど、意外にとっつきやすいですね。

でも、ちょっとしたときにコンパイル&実行なんて、やってられません。

そこで、簡単に使えるpythonを使うんですね(嘘)。pythonは結構C言語にも似ています。pythonはインタプリンター型ですが、関数型なので、Cに似た気がするんでしょうね。

と言う訳で、テキストファイルをそのままコピーするスクリプトです。
-------------------------------------------

import sys
def getdata(filename):
fileobj=open(filename,'r')
contents=fileobj.read()
fileobj.close()
return contents
def writedata(filename,contents):
fileobj=open(filename,'w')
fileobj.write(contents)
fileobj.close()
return

if __name__=="__main__":
data=getdata("text.txt")
writedata("text2.txt",data)


----------------------------------------
というのを昨日の寝る前に書いたんだけど、多分動くと思います。
テストしていませんが、text.txtというファイルの中身を読み出してdataという変数に代入して、text2.txtというファイルに中身を書き出してしまうスクリプトです。二つの関数をつくって、一方の関数はファイル名前を指定すれば中身を返す、もう一方はファイル名と中身をしていしてやれば、ファイルをつくって、中身を書き込むという用にしています。これをC言語で書き換えるのはやさしいらしいです。

でもね、こんなん、簡単に右クリックとかで出来そうだけどね。

追記::Windows Scriptなる物もあるようですね。でもみんな使うのはマクロという奴なんだろうなぁ。

2007年8月7日火曜日

sci-python

科学計算向けpython支援ソフトとしてsci-pythonというものがあります。
これらをインストールするのはwindowsの場合簡単で、
http://code.enthought.com/enthon/
からソフトをダウンロードして、ボタンを押すだけです。で、これでなにができるのかというと、通常のpythonパッケージでは出来ない事を一緒くたにあつめたパッケージなので、一個の簡単なインストールで入れられる事なんです。これをつかって、scipyを使うと科学計算が非常に手軽に出きるようです。パッケージにはpygameとかpyopenglとかゲーム作るツールは入って無いけど。

で、入れた後で、pythonシェルを使って次ようような計算が出きるんです。
ここで、四行python

from scipy import *
A=matrix([[1, 2, 1], [1, 5, 1], [1, 8, 3]])
linalg.inv(A)
linalg.det(A)

一行目::scipyに必要なのを読み込む
二行目::行列Aを定義している。
|1 2 1|
|1 5 1|
|1 8 3|
という行列をAとしている。
三行目::Aの逆行列を計算している。
四行目::Aの行列式を計算している。

これのさらにすごいのが、
pinrt A*linalg.inv(A)
をすると、単位行列が出てきます。行列の掛け算までできるのです。引き算やたし算も。
print A+A
print A-A
などなど。

あとはもっとすごい事が出きるらしいのですが、暇があったら書こうかなと思います。