TvRockの設定(with PT2)

2011/03/21未分類import

地上波チューナ設定

視聴・録画アプリ

C:\Software\PT2\up0517

実行アプリ(視聴用)

TVTest.exe
↓オプション
/d BonDriver_PT-T.dll /DID A

実行アプリ(録画用)

TVTest.exe
↓オプション
/d BonDriver_PT-T.dll /DID A

録画先フォルダ

D:\My-Video\MPEG

BSチューナ設定

視聴・録画アプリ

C:\Software\PT2\up0517

実行アプリ(視聴用)

TVTest.exe
↓オプション
/d BonDriver_PT-S.dll /DID B

実行アプリ(録画用)

TVTest.exe
↓オプション
/d BonDriver_PT-S.dll /DID B

録画先フォルダ

D:\My-Video\MPEG

GSLで簡単プログラミング2

2011/02/15未分類import

GSLで簡単プログラミング2

球面調和関数の計算

gnuplotやその他多くのプログラムでは標準関数に近い関数だけど,
これをGSLを利用してやってみようと思いました.以下実装例です.

ループごとにファイル保存なんてことをしているので,実行速度は非常に低速です.
CPUには優しいプログラム(ワライ)です.
今後のプログラムは配列・構造体を導入したりとかして,より速いものにします.
#include <stdio.h>
#include <math.h>		//BSD系のC標準数学ライブラリ.
#include <gsl/gsl_sf.h>		//特殊関数のヘッダファイル
#include <gsl/gsl_math.h>	//数学の基本的な関数のヘッダファイル
#include <gsl/gsl_complex.h>	//複素数に関する宣言や定義のヘッダファイル
#include <gsl/gsl_complex_math.h>//複素数を扱った関数のヘッダファイル
 
int main(void)
{
	double theta = 0;	//角度theta.初期値を一応設定.
	double phi =0;		//角度phi.初期値を一応設定.
	double YY;		//球面調和関数Y.spherical harmonics
	
	//球面調和関数の直交座標系変換した値.
	double xx_sh;		
	double yy_sh;
	double zz_sh;

	int l=3;
	int m=0;		//lとm.量子数に対応ですね.
	
	//途中計算で作った変数.数式はTeX記法でやってます.わからない人は適当に調べてね!
	//球面調和関数は,Wikipediaによれば次の式.
	//Y_{l}^{m}(\theta, \phi) = (-1)^{(m+|m|)/2} 
	//\sqrt{ \frac{2l+1}{4\pi} \frac{(l-|m|)!}{(l+|m|)!} \,} P_l^{|m|}(\cos\theta) \, e^{im\phi}
	//これを分解して見通しをよくする.

	//(-1)^{(m+|m|)/2}に対応
	double minus1_mm_2;
	//\frac{2l+1}{4\pi}に対応
	double frac_2l1_4pi;
	//\frac{(l-|m|)!}{(l+|m|)!}における,分子に対応
	double l_minus_abs_m;
	//\frac{(l-|m|)!}{(l+|m|)!}における,分母に対応
	double l_plus_abs_m;
	//(\cos\theta )\exp (im\phi)に対応
	double cos_theta;
	double exp_imphi;

	int i,j;		//ループ用変数.
	int stop_i=100;	//ループの停止値.まあ設定する必要もない気がするけど作った….
	
	FILE *outputdata;	//データ保存用ストリーム.
	FILE *outputdata_xyz;	//データ保存用ストリーム.

	outputdata = fopen("outputdata.txt", "w");	//データ保存ファイル,オープン
	fprintf(outputdata, "#theta\tphi\tYY\n");

	outputdata_xyz = fopen("outputdata_xyz.txt", "w");	//データ保存ファイル,オープン
	fprintf(outputdata_xyz, "#xx_sh\tyy_sh\tzz_sh\n");


	outputdata = fopen("outputdata.txt", "a");
	outputdata_xyz = fopen("outputdata_xyz.txt", "a");	//データ保存ファイル,オープン

	//計算用forループ.2重になっている.
	for (i=1 ; i<=stop_i ; i++){
		phi = phi + 0.0628;
	for (j=1 ; j<=stop_i ; j++){
		theta = theta + 0.0628;
		minus1_mm_2 = pow(-1, (m+abs(m))/2);
		frac_2l1_4pi = (2*l +1)/(M_PI_4);
		l_minus_abs_m = gsl_sf_fact(l-abs(m));
		l_plus_abs_m = gsl_sf_fact(l+abs(m));
		
		//cos_theta_exp_imphi = cos(theta)*gsl_expm1();
		cos_theta = cos(theta);
		exp_imphi = GSL_REAL(gsl_complex_exp(gsl_complex_rect(0, m*phi)))+GSL_IMAG(gsl_complex_exp(gsl_complex_rect(0, m*phi)));
		//複素数の扱いで転けた(2011年2月15日,4:49).寝ます.

		//本番の計算.球面調和関数の計算.
		YY=frac_2l1_4pi*sqrt(frac_2l1_4pi*(l_minus_abs_m/l_plus_abs_m))*gsl_sf_legendre_Plm(l,m,cos_theta)*exp_imphi;
		
		//↓極座標から直交座標系に変換する.
		xx_sh = YY * sin(theta) * cos(phi); 
		yy_sh = YY * sin(theta) * sin(phi);
		zz_sh = YY * cos(theta);
		
		//データ保存用の部分↓
		fprintf(outputdata, "%f\t%f\t%f\n", theta,phi,YY);
		fprintf(outputdata_xyz, "%f\t%f\t%f\n", xx_sh,yy_sh,zz_sh);
		printf("iが%d回目,jが%d回目の計算結果:Y(%f,%f) = %.18e\n", i, j, theta, phi, YY);
	
	}
	theta = 0;//ここで初期化しなければthetaの値がめちゃめちゃに大きくなる.
	}


	fclose(outputdata);	//ファイルをクローズ.
	fclose(outputdata_xyz);
	return 0;
}
//バグ.複素数の負値の扱いがおかしい.
//また,mを負値にするとエラーで止まる.

//だけど,それっぽいグラフは書けた.
上の値設定の状態で,出力されるグラフは次のようになります.

Screenshot-Gnuplot_outputdata_xyz_l3m0.png

早速ですが,上の関数が不完全であることがわかります.l=3, m=0のとき,
この関数はグラフの形がもう一つ上下逆に組み合わさった形になるはずなのですが,
それが実現できていないのです.何で?
見ず知らずの人に尋ねるのも何とも言えないのですが,わかる方,よろしければコメントくださいませんでしょうか.お待ちしております.

ギャラリーとして,他の条件のグラフも載っけときます.
それっぽくはなってますね…….
Screenshot-Gnuplot_outputdata_xyz_l2m0.png


Screenshot-Gnuplot_outputdata_xyz_l2m1.png


Screenshot-Gnuplot_outputdata_xyz_l2m2.png

GSLで簡単プログラミング1

2011/02/14未分類import

GSLで簡単プログラミング1

マニュアルに載っているベッセル関数の例だけでは何だかよくわからないので,続きを書いてみる.
というか,この例だと,一点しかわからないので,データをテキストファイルに保存してくれるような,次のようなプログラムを書いてみた.
#include <stdio.h>
#include <gsl/gsl_sf.h>		//特殊関数のヘッダファイル
#include <gsl/gsl_math.h>	//数学の基本的な関数のヘッダファイル
 
int main(void)
{
	double xx = -500.0;	//x.初期値を一応設定.
	double yy = 0;		//y.初期値を設定
	int i;			//ループ用変数.
	int stop_i=10000;	//ループの停止値.まあ設定する必要もない気がするけど作った….
	
	FILE *outputdata;	//データ保存用ストリーム.

	outputdata = fopen("outputdata.txt", "w");	//データ保存ファイル,オープン
	fprintf(outputdata, "#xx\tyy\n");
	fclose(outputdata);				//データ保存ファイル,クローズ


	for (i=1 ; i<=stop_i ; i++){
		xx = xx + 0.1;
		yy=gsl_sf_bessel_J0(xx);
		outputdata = fopen("outputdata.txt", "a");
		fprintf(outputdata, "%f\t%f\n", xx,yy);
		printf("%d回目の計算結果:J0(%g) = %.18e\n", i, xx, yy);
		fclose(outputdata);
	}
	return 0;
}
はき出したテキストファイルを範囲指定してグラフ化すると,次のようになったり.
Graph0_gsl_sf_bessel_J0.png


Graph1_gsl_sf_bessel_J0.png

ある文字列を囲んでいる記号を別の記号に置換する

2011/02/01未分類import

ある文字列を囲んでいる記号(括弧やダブルクオーテーション)を別の記号に置換する

vim(というか正規表現)では次のように打つ.
:1467,1480s/"\(.*\)"/{\1}/g 
この例では,編集しているテキストファイルの1467から1480行の範囲にある,「""」で囲まれた文字列を「{}」(本当は半角の括弧)で囲むように置換している.
正規表現では,「\(」と「\)」に囲まれた文字列は,再利用することが出来る.
再利用する場合は,「\n」(nは1以上の自然数で,「\(」と「\)」で囲んだ順番をさす)を使う.

ある記号に囲まれた文字列に対して,その囲んでいる記号だけを変えたいことは結構あるので,これを覚えておくとルーチンワークを軽減できる.

応用例

LuaLaTeX等において,太字修飾していた文字列を,さらにサンセリフフォントに指定する例.後付けでこのような編集をすることは結構ある気がする.
:237,287s/\\textbf{\(.*\)}/\\textsf{\\textbf{\1}}/g 

履歴検索いろいろ 端末でCtrl+rとたたいた後に

2011/01/29未分類import

端末でCtrl+rとたたいた後に履歴検索

表題にあるとおり,仮想端末(ターミナル)でCtrl+rをたたくと,カーソル位置に次のような表示が出ます.
(reverse-i-search)`':
この状態で,「cd」と打ってみると,「`」と「'」の間に入力した文字列が,「:」よりも右にその文字列を含む最新の履歴が表示されます.
(reverse-i-search)`cd': cd HD-1920-16対9/
「cd」のあとにさらに,半角スペースで区切って,別の文字列を追加すると絞り込むことが出来ます.
多少,癖というか特有の決まりがあるようですが,それは操作していくことでわかると思われます.
この記事を書いている時点では,私はあまり把握できてません.

この記事は行っとけ! Ubuntu道場! ― 第35回~師範、ターミナル怖いです!~というサイトに掲載されていた情報を参照しました.
ありがとうございます.目から鱗でした.
あわせて,historyコマンドというものも活用するといいかと思われます.

別の履歴参照方向キーの↑と↓

端末で,方向キーの↑と↓を使って,履歴をさかのぼることが出来ます.上の記事でも触れています.
私もこれと下のタブ補完は知ってました.この二つを知っているだけでも端末操作はかなりはかどるようになります.

タブキーで補完

コマンドで引数をとるものを使うときや,長めのコマンドを入力するとき,途中まで入力した状態でTabキーを押すと,
シェルが適切な文字列で補ってくれます.
候補が多い場合は,タブキーをもう一回押すと候補のリストを表示してくれて,それを見ながら次の文字を入力していけます.
これを利用することで,キーボードをたたく回数が激減します.お薦めです.