Mathematica覚書
論文用の図をキレーに作るため、Mathematicaと格闘して一日終わる…
Mathematicaは7にアップグレードしてからなんか挙動が怪しい。グラフを書かせると、字化けするようになった。EPSなら大丈夫なんだがMathematicaのEPSとイラレが相性超悪なのでEPSで出されても…。なんでだ…。たぶんデフォルトのフォントがうちの機会と相性悪いんだろう。
そんなわけで、グラフのラベル等のオプションを覚書
たとえば、
Plot[Sin[x], {x, 0, 10},
LabelStyle ->
Directive[Orange, FontFamily -> "Courier", FontSize -> 20]]
こんなふうにすると、ラベルの文字がオレンジ色で、FontはCourierでサイズは20ptの図ができる。
基本的に、Labelの文字の設定はLabelStyleってのを使う。そのなかでFontのオプションはFontFamilyやらFontSizeやらいろいろあるんだが、組み合わせて使うには、Directiveってのを使う必要があるそうな。それにしてもMathematicaの解説サイトのわかりにくさはありえねー。
2009年4月24日金曜日
Mathematicaメモ
投稿者 hanky&panky 時刻: 22:32 0 コメント
ラベル: Mathematica
2008年9月2日火曜日
Mathematicaメモ:その2?
Mathematicaで、複数の手続きをまとめて一つの関数として扱いたいときには
f[i_]:=( x=i*2;
y=i*i;
val=Sin[x]Cos[y];
Write[out,val]
)
のように=の後を()でくくる。手続きの間には;を入れる。忘れるとエラー出る。これでFrotranでいうところのFunctionに相当するようなブツが作れる。
Mathematica内では基本的に変数名はグローバルに扱われる。なので長いのを作ってると変数名に困る。これを回避する一つの方法がModuleブロックである。
Module[{x,y},
Isin=NIntegrate[Sin[x],{x,-1,1}];
Icos=NIntegrate[Cos[y],{y,-1,1}]
]
みたいな感じでつかう。Module[{局所変数の組},手続き]。積分変数とか、一時的に使う変数をModuleブロック内の局所変数にできるので、積分変数にいちいちx1とかy1とかわけわからん名前つけて混乱するのを避けることができる。
今週は教授陣が揃って出張なので、マイペースな感じ。大学の端末のほうが性能良いから登校してるけど。こないだ出したプロシーディングがアクセプトだった。やれやれ。でもその考察がちょっと間違ってるかもしれないことが今日やった計算が示唆している。おぅ・・・どうしたものか。
投稿者 hanky&panky 時刻: 21:55 0 コメント
ラベル: Mathematica, PC, 研究
2008年8月29日金曜日
Mathematica:補間とか
NRGとかの数値計算の結果は基本的に離散的データである。スペクトルをプロットした場合、たとえば有効な近藤温度の指標がほしいとかで、ピークの半値幅が欲しくなるときとかも多々ある。そんなわけで、離散データを補間、近似多項式ゲッツ⇒半値幅の計算をMathematicaでやってしまう方法を探してみた。
補間を自力でやろうとするとスプライン補間法の勉強とかで数日つぶれたり、実装でまた数日つぶれそうなのでとても1から自力とかやる気になれない。MathematicaはInterpolationっていう補間を全部やってくれてしまう関数を持っている。
基本的な使い方は
Interpolation[{{1,2},{2,2.4},{3,4.4}}]
のように、データをリストの形式で代入する。多次元でもおk。
データを手でいちいち代入するとかそんなメンドクサイことをするはずもなく、普通はファイルに用意しておいて、それをテーブルとしてインポートして代入するという方法をとるわな。そうしたいときは、
Import["spec.dat(みたいなファイル名)","Table"]
f=Interpolation[%]
のようにするといい。Mathematicaでは%は直前の結果という意味になる。
さてInterpolationの返す値はInterpolatingFunctionという関数である。通常の関数と同じように扱える近似多項式である。デフォルトでは3次の多項式で近似される模様。次数はオプションで変えることができるけど、あまり次数を上げるとすげー振動しだすと聞く。そんなわけで、半値幅もInterpolatingFunctionの最大値を求めて、その半分になるx座標をもとめてやればいいんでは?というのが私の考え。半値幅を出すのにもっといい方法があるのかもしれないけど、いまんとここれぐらいしか考え付かない。
関数の最大値を求めるFindMaximumと、方程式の根を求めるFindRootを使えばこれが実現できる。
m=FindMaximum[f[x],{x,0}]
FindRoot[f[x]==m[[1]]/2.0,{x,0.0001}]
みたいに。
FindMaximumの第二要素でその近傍での極大を求めるという設定。この関数の返す値は、{{値、その座標}}というリストになっているので、FindRoot内では第一要素を取り出して使っている。
FindRootの第二要素はその点から根を求めていくための基準点で、ここをうまくとってやらないと、欲しい部分での解が出なかったりするので要注意。
そうそう、B4が1人、近藤効果とRKKY相互作用の競合in2重量子ドットの論文をゼミ課題に選んだ。おぉ~私のやってることとがっつりかぶるぜ。後輩が近藤効果を自発的に選ぶのは初めてだな。(ボスが押し付けた例はあれど)結構勉強するのしんどいだろうから、つぶれないようにいろいろ配慮したほうが良いかもなぁ。しょっぱなから2不純物近藤問題を理解しろとかきついやろうし。このまま近藤方面を邁進してくれて私が作ったプログラムとかお蔵入りせず使ってくれると嬉しいんだが。
投稿者 hanky&panky 時刻: 21:53 0 コメント
ラベル: Mathematica, PC, 研究
2008年6月12日木曜日
Mathematica_その1
TA等でわずかばかりの収入があるのを目ざとく大阪市はチェックしとるんですな。市民税を払えという通知が家に来ていてがっくりです。学生をあまりいぢめないでください。払ったところでお偉いがたのタクシー代に(ry
ここんとこMathematicaにぞっこんです。いじりだすと、つかえねーなんて一時期いっててごめん、って感じのハイスペック実感です。使いにくい原因はWeb上の、Excite先生級の直訳らしき理解しづらい説明文+独特の文法。(+使ってるよそさんの借り物サーバーではXWindow使えないから。)なんかそのうち研究室の人間に教えなあかんことになりそうなので、理解したことをぼちぼち書き留めておこうかと。なんかなんでも最初にやり始めるのは損な役回りだと思いつつ。
Mathematicaは関数型プログラミング言語の体裁をとっているらしく(?)、いままで手続き型に慣れきってきた身には違和感ありまくり。全てが式として処理されますってなんじゃそりゃーって感じです。変数宣言ないし、サブルーチンのような単位も「式」としてくくってしまう、なんか若干気持ち悪い。ぜんぶFortranで言うところのfunctionで記述するのねって思って自分を納得させる。
繰り返し
Forが使える。
基本的な文法は
For[i=0,i<10,i++,操作] のように、開始、終了条件、インクリメント、本文。 操作は複数でもよく、その場合、;で手続きを区切る。 Forにかぎらず、基本的に手続きの区切りは;で示す。なので、そのほかのプログラミング言語の体裁に似た形式で記述することができる。
条件分岐
IfはCやFortranと同じ様な感じだが、else if に相当する操作がない。
なので分岐が複数の場合はWhichを用いると良い。
If[条件式,Trueの場合の手続き,Falseの場合の手続き]
リスト
Mathematicaでは配列等は全部リストという構造で総称されるぽい。挙動を見た感じ、C++のvectorに似ているかも。リストという名前ではあるが、添え字がついていて、添え字で要素を指定して操作できる。
リストの宣言はとくになんかする必要もなく
{a,b,c}
みたいに書けば、a,b,cの要素をもつリストが生成される。ふつー配列には何か名前をつけて使用するが、そういうときには
l={a,b,c}
のように、代入文で書いてやる。
さて作ったリストに値を付け加えるには
AppendTo[l,x]
のようにする。(似たようなのにAppendがあるが、これは付け加えた先を再構成しないっぽく、For文の中で使うとうまく行かなかったりしたので、AppendToのほうがいいと思う。)
こうするとlは
{a,b,c,x}
のようになっているはず。
ここに挙げた機能を投入してみた例
out=OpenWrite["test.txt"]
l={1,2,3}
AppendTo[l,4]
For[i=1,i<5,i++,
If[Mod[i,2]==0,
AppendTo[l,i]]
]
Write[out,l]
実行すると、test.txtに{1,2,3,4,2,4}ていう出力ができるはず
リスト関係はいろいろややこしい機能てんこ盛りなのでぼちぼちまた書き溜めていこう。
投稿者 hanky&panky 時刻: 22:20 0 コメント
ラベル: Mathematica