1行に複数の数式を書いた場合の数式番号(改善求む)

短い数式を複数行にわたって書くのを避ける場合には,1行にまとめて書く必要があるでしょう(特に枚数制限がある論文).数式番号の付け方について自分なりに考えて書いたので,まとめておきます.ただし,タイトルにある通り,未解決の部分があるので策があればコメントなり追記なりしてください.

例えば,3行にわたる数式

y&=Ax+B\\
A&=a^2\\
B&=b^2

の2行目と3行目をまとめて2行にすることを考える.何も考えずにただ数式だけをまとめる,つまり

y&=Ax+B\\
A&=a^2,\,B=b^2

としてしまうと,当然ダメで

と2行目に2つの数式があるにも関わらず,番号は1つしかつかない状態になってしまう.

そこで,どうするかといえば少々荒っぽいが,任意の数式番号を表示する\tag{}とカウンタ変数を表示する\thecounterまたは\arabic{counter}(どっちもcounter部にカウンタ変数名),変数の値を変える\addtocounter{counter}{#}を組み合わせる.つまり,

y&=Ax+B\\
A&=a^2,\,B=b^2
\stepcounter{equation}
\tag{\theequation-\addtocounter{equation}{1}\arabic{equation}}

とする.そうすれば,

のように数式番号をつけることができる.

注意すべき点は,

  • まず初めに\stepcounter{equation}でカウンタを1つ増やすこと.番号が表示されて初めてカウンタが増えるので,これをしないと前の数式と番号がかぶってしまう.
  • 数式番号に章番号を含む場合には前半の表示には\theequation,後半の表示には\arabic{equation}を使う必要があること.ちゃんと調べてないが,前者のコマンドは章番号も併せて表示することになっていると思われる.

問題点と改善点は,

  • 1行に1つのラベルしか付けられないので,参照がうまくできないこと.
  • やはり1行に1つの番号しか付けられないので,(2),(3)や(2)-(3)のように括弧を並べるような表示ができないこと.

華祥 (中華料理)

コウシンとは打って変わって、ちょっと時間があるときにリッチな中華(といっても値段は別に高くない)を食べたい時におすすめなのが華祥。

場所は東大路と御影通りの交差点の北東角です。

何でもシェフの田口さんは陳建民の下で修業をし、東京の高級北京料理店「華都飯店」で料理長をしていたというつわもの。厚生労働大臣表彰や京都府現代の名工京都府優秀技能者表彰)の受賞者にもなってことがあるらしい。

そんな田口さんと若い兄ちゃん二人がメインで厨房で料理を作り、取り囲むようにカウンターに座って料理が出てくるのを待つというスタイル。

メニューは様々あるが、中でも人気なのが鶏ネギ中華そば。
透明感のあるスープがあっさりとしていて、食べやすいです。(こってり好きの私もおいしく頂きました)
さらに麺類に関してはプラスαでご飯や炒飯、唐揚げとのセットが手ごろに食べられて、学生の持ち金でも問題なく高級感ある食事ができます。
厨房をのぞいていると、その仕事の丁寧さが素人めにも伝わってくるような感じの店で、幸せな気分を味わえるんじゃないでしょうか。

店名:華祥 (カショウ)
ジャンル:中華料理、ラーメン、餃子
TEL 075-723-5185
住所:京都府京都市左京区田中里ノ内町41-1
営業時間11:00〜14:00/17:30〜22:00 (21:30 LO)
ランチ営業、日曜営業
定休日:水曜日

コウシン 百万遍店 (中華料理)

さっと中華を食べたい場合におすすめの中華料理屋、コウシン百万遍店(他に店舗があるのか分かりません)です。
研究室からの行き方は北部キャンパスへの移動に使う北門から出て信号渡る⇒西進⇒ファミマの西隣にある赤い看板の店。片方の看板にはKOUSHIN、もうひとつにはKOUSHIAとか書いているが気にしない。

定食は一定期間ごとに刷新(といってもローテーションでまわしてる感じですが)され、8つの選択肢から選ぶことができます。
8つのうち630円の定食が3つ、735円のが3つ、840円のが2つ占めていることが多いようです。
定食の代表例としては、630円のものにレバニラ定食、若鶏とピーマン炒め定食、野菜炒め定食
735円のものに麻婆豆腐定食、玉子と豚肉炒め定食、唐揚げの香り炒め定食、
840円のものにエビマヨ定食、八宝菜定食などがあります。
(記憶が完全でないので名前とか間違ってる可能性もありますが)

個人的には餃子を食べたいのでなかれば王将より遥かにボリュームあってコストパフォーマンスいいと思います。

ここの店や料理の特徴は

  • とにかく注文してから料理が出てくるまでが速い!牛丼屋とかと遜色ない速さ(どうやって作ってるのか謎)
  • 定食には唐揚げ2個、中華スープ、漬物、ごはんがつく(メインの料理が唐揚げのときは、付属の唐揚げの代わりにキャベツの千切りにしょうゆがかかったサラダ的なものが追加される)
  • 昼は夜にはない日替わりメニューがある。また昼限定の丼物も6種類ほどあって630円以下と安く量も多い。
  • また、昼にいくとポイントカードにスタンプが貯められる。3回目で1食分が半額、6回目で1食分がまるまるタダになるので相当お得。
  • さらに昼だけご飯おかわりし放題。
  • 味がちょい濃いめ。
  • 食いきれないと判断したら持ち帰り用のプラスチックパックがもらえる。
  • 実は二階にも座席があって主に宴会に使われている(混んでいるときは二階で食事することもある)
  • たまに変なクラブ音楽みたいなのが聞こえてくる。(クラブそんな行ったことないけど)
  • 大きいテーブルと小さいテーブルがあって、小さいテーブルに4人で座った場合は4つのトレイを卍型に配置しないとテーブル上におさまらない。
  • お客さんに中国人らしき人が多い。店主も中国人。ウェイターもたぶん中国人。

店名:コウシン 百万遍店 (宏シン KOU-SHIN)
ジャンル:中華料理
TEL:075-721-8530
住所:京都府京都市左京区田中門前町102
営業時間:11:30〜14:30/17:00〜23:00
定休日:月曜?

m-file上のデータの保存あれこれ

MATLABでデータを保存したり書き出したりする際にsave関数やcsvwrite,dlmwriteを使用する人は多いんじゃないでしょうか。
こう言った関数を使用する際、プログラムを何回かまわしてるうちに前に保存していたmatファイルあるいはcsvファイル,txtファイルを上書きしてしまった!なんてことはよくあるはず(私だけ?)

そこでほぼ間違いなく上書きしてしまわないような方法を紹介。
その最善の策は「ファイル名自体に計算した日時が書き込まれるようにする」ことです。
全くの同タイミングで計算が行われない限りは、上書きされようがありません。

“日時の表示”に使う関数は“fix(clock)”というものです。
これによって自動的に1×6のベクトルが作成されるのですが、このベクトル内の情報が左から順に「年(西暦)」「月」「日」「時」「分」「秒」となっています。
要はこれを“num2str”など“変数を文字列に変換する”関数を使って、ファイル名に書き込んでやればいいというわけ。

一例を示します。(外部サイトのプログラムを参考にしました)


clockdata=fix(clock);
%% 年,月,日,時間,分,秒
clocky=num2str(clockdata(1));
if clockdata(2)<10
clockm=['0', num2str(clockdata(2))];
else
clockm=num2str(clockdata(2));
end
if clockdata(3)<10
clockd=['0', num2str(clockdata(3))];
else
clockd=num2str(clockdata(3));
end
if clockdata(4)<10
clockh=['0', num2str(clockdata(4))];
else
clockh=num2str(clockdata(4));
end
if clockdata(5)<10
clockmin=['0', num2str(clockdata(5))];
else
clockmin=num2str(clockdata(5));
end
if
clockdata(6)<10
clocksec=['0', num2str(clockdata(6))];
else
clocksec=num2str(clockdata(6));
end

filename=['〜〜〜',clocky,'_',clockm, clockd,'_', clockh, clockmin, '.mat']; %matファイルで保存する場合

% csvファイルでデータを保存するとき
filename=['〜〜〜',clocky,'_',clockm, clockd,'_', clockh, clockmin, '.csv'];
csvwrite(filename,[a;b;c]) % 大した精度が必要ないとき
dlmwrite(filename,[a;b;b], 'precision', '%.8f') % 精度が欲しいとき

% 変数全部をmatファイルで保存するとき
save (filename)

% 変数a,b,cのみをmatファイルで保存するとき
save (filename,'a','b','c')

また,変数の値を変えてforループを用いて計算を何回もする場合、1ループごとにデータを保存したいという場合も同じような考え方で使用したパラメータの値をファイル名に書き込むこともできる。
例えばa=1:10、b=1:10、c=1:10としてforループによって何回も計算をするような例を次に示す。

for a=1:10
for b=1:10
for c=1:10
d=a+b^2+c^3;
filename=['data_a',num2str(a),'_b',num2str(b),'_c',num2str(c),'.mat'];
save (filename,'d')
end
end
end

Fletcher-Reeves法サンプルプログラム

無制約最適化問題で使われる(?)Fletcher-Reeves法のプログラム例を載せます.アルゴリズム習得用で組んだものです.
手法自体は適当に調べました.
http://people.equars.com/~marco/poli/phd/node54.html

例:天井からばね定数1のばねによって連結された4つの重量1の質点の平衡点を求める.ポテンシャルエネルギーを目的関数とする最小化問題.

global k mg L
mg=1;%おもりの重量
L=1;%ばね自然長
y=[1 2 3 4]';%初期値
k=1;%ばね定数
  gF=zeros(4,2);%betaを計算するために2列用意
gF(:,1)=gradF(y);
%↓目的関数Fの定義
F=@(y) (k/2)**1/(gF(:,1)'*gF(:,1));%betaが定義される
      s=-gF(:,2)+beta*s;
    end
    %y_{i+1}=y_{i}+alpha*s;
    %ここでalhpaはF(y_{i+1})を最小化する値
    %alphaを少しずつ大きくしながら探索する
    num_roop2=100;%Fを最小化するalphaに到着するのに十分な値
    step=0.1;%探索の歩幅
    F_temp=zeros(2,1);%一時的な目的関数
    F_temp(1)=F(y);%出発点
    for ii=1:num_roop2;%ループするよ
      F_temp(2)=F(y+step*ii*s);%1歩先のF
      if F_temp(2)>=F_temp(1);%もし1歩先のFの方が大きいなら
        break%繰り返し計算を終了する
      else%まだFが小さくなりそうなら
        F_temp(1)=F_temp(2);%参照するFを置き換える
      end
    end
    y=y+step*(ii-1)*s;%この半直線上でFを最小化するy
    gF(:,1)=gF(:,2);%繰り返しのために勾配を置き換え
end
if jj==num_roop1;%もし収束していないなら
  fprintf('計算は収束していない')%その旨を表示
end

====================================================
====gradF.m=========================================
====================================================
function out=gradF(y)
  global k mg L
  out(1)=k*(y(1)     -L)-k*(y(2)-y(1)-L)-mg;
  out(2)=k*(y(2)-y(1)-L)-k*(y(3)-y(2)-L)-mg;
  out(3)=k*(y(3)-y(2)-L)-k*(y(4)-y(3)-L)-mg;
  out(4)=k*(y(4)-y(3)-L)           -mg;

これによって,最適解[5 9 12 14]が得られます.もちろん力のつり合い等で求めた解と一致します.

*1:y(1)-L)^2+(y(2)-y(1)-L)^2+(y(3)-y(2)-L)^2+(y(4)-y(3)-L)^2)-mg*sum(y); count=0;%カウント(一周目かどうかが分かればよい) num_roop1=100;%収束するのに十分な値 for jj=1:num_roop1;   gF(:,2)=gradF(y);%勾配   if max(abs(gF(:,2)))<=1e-3;%収束判定     break   end      %探索方向sを決定する     if count==0;%もし一周目なら       s=-gF(:,2);%betaは0;     else%2周目以降なら       beta=(gF(:,2)'*gF(:,2

0を通る点を探す

実験などから得たシグナルで,0を通る点を探したい時には find関数 を使いましょう.例えば,時間軸のベクトルがt,シグナルのベクトルがvだとして,plot(t,v)で以下のようなチャートが得られたとする.

このシグナルvから,0を通過する直前のインデックスを取得するには以下のようにすればよい.

q = v(1:end-1).*v(2:end);
index = find(q <= 0);
plot(t,v,'b-', t(index),v(index),'ro');

こうすると,以下のようなチャートが得られる.

ちなみに,find関数 は0以外の要素のインデックスを取得する関数です.他にもいろいろ使い道があると思うので,覚えておくと良いと思います.