基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習) 2. 数値演算の注意点 (説明と実習) 3. 繰り返しfor, whileの使い方 (説明と実習) 4. 応用問題 (実習) 5. gnuplot(グラフィックソフト)の使い方 (実習)
4.2 円周率の定義の仕方(通常、この様にします) 数学関数を用いた練習(教科書例題4.1~4.5) 4.1 三角関数の引数(ラジアン) 4.2 円周率の定義の仕方(通常、この様にします) 4.3 ceil(小数点切り上げ関数)の使い方 4.4 pow(べき関数)の使い方 4.5 ベクトルの内積(計算機ではベクトルを成分にして処理します) C言語では複素数の取り扱いはない(実数、虚数部に分解) 数値計算では割り算の極限操作は困難です (0/0は計算が困難) P33参照
# include<stdio.h> # include<math.h> int main(void){ 複素数と極限操作 虚数 ”i” の 計算(失敗例) Sin(x)/xの計算 #include <stdio.h> #include <math.h> int main(void){ double x; double y; x=0.5; y=sin(x)/x; printf("%lf",y); return 0; } # include<stdio.h> # include<math.h> int main(void){ double x; x=sqrt(-1.0); printf("%lf",x); return 0; } 数字を小さく してみましょう z = a + ib ⇒ a,bは別々に取り扱う (Fortranは複素数あり) X=0の計算はできない
2. 大きく桁の違う数字の足し算、引き算には注意 浮動小数点のエラー P34、プログラム例4.2を実行してみましょう 出力形式をlf ⇒ 17.15lfに変更してみてください (17桁中、小数点が15ケタ) 浮動小数点には必ず誤差が付きまとう。この誤差を成長 させないようにプログラムを組まないといけない! 代表的な注意点 1. 小さい数字どうしの割り算に注意 2. 大きく桁の違う数字の足し算、引き算には注意
#include <stdio.h> int main(void){ int i; for(i=1;i<=10;i++){ For, whileによる繰り返し (1) for(初期化 ; 条件式 ; 処理式){ 実行文 } 1. for 文 #include <stdio.h> int main(void){ int i; for(i=1;i<=10;i++){ printf("i=%d\n",i); } return 0; i はカウンタ変数 i = 1からスタート (初期化) i は10以下の条件 (条件式) i =i+1の計算を行う (処理式) printf を実行する できた人は例題7.1を実行。和の計算を勉強してください。
For, whileによる繰り返し (2) while(条件式){ 実行文 } 2. while 文 #include <stdio.h> int main(void){ int i,s; s=0; i=1; while(i<=100){ s+=i; ++i; printf("i=%d s=%d\n",i-1,s); } return 0; i はカウンタ変数(整数型) i は100以下の条件 (条件式) s = s+i (和の計算) i=i+1 (カウンタの計算) Printfの実行
応用問題 1. 計算の仕方 2. 計算結果の出力 xの値 cosh(x)の値 sinh(x)の値 tanh(x)の値 双曲線関数 sinh(x), cosh(x), tanh(x)をx=-3~3の領域で計算せよ。 1. 計算の仕方 双曲線関数は数学関数に無い ⇒ 数学関数の組み合わせで作る。 xの刻み幅は0.1、カウンタiは-30~30までfor文を実行する。 2. 計算結果の出力 結果の出力は任意だが、グラフにすることを考え、以下の様に並べよう。 xの値 cosh(x)の値 sinh(x)の値 tanh(x)の値 ●●● ●●● ●●● ●●●
3. 計算結果のファイルへの保存 計算結果のファイルへの保存は (実行ファイル).exe > (出力ファイル) 4. gnuplotの準備 1. すべてのプログラムからgnuplotを見つける。 2. gnuplotをコピーし、自分の作業フォルダにショートカットを作成する 3. gnuplotのアイコンをダブルクリックし、gnuplotを立ち上げる 4. pwdのコマンドを入力し自分の作業フォルダへ移動する
gnuplotの動かし方 以下のコマンドを入力すべし gnuplot > plot “出力ファイル” using 1:2 with lines ⇒ 出力ファイルの一列目をx軸データ、二列目をy軸データ として、データ間を直線で結んだグラフが描かれる ( cosh(x)のグラフ ) 引き続き以下のコマンドを入力すべし gnuplot > replot “出力ファイル” using 1:3 with lines ⇒ sinh(x)のグラフを描く(三列目がy軸) gnuplot > replot “出力ファイル” using 1:4 with lines ⇒ tanh(x)のグラフを描く(四列目がy軸)
双曲線関数計算 の解答例 #include <stdio.h> #include <math.h> int main(void){ double dx,x,y1,y2,y3; int i,j,n; n=30; dx = 0.1; for(i=-30;i<=n;i++){ x=(double) i * dx; y1=( exp(+x)+exp(-x) ) / 2.0; //coh y2=( exp(+x)-exp(-x) ) / 2.0; // sinh y3=( exp(+x)-exp(-x) ) / ( exp(+x)+exp(-x) ); // tanh printf("%lf %lf %lf %lf\n",x,y1,y2,y3); } return 0; 双曲線関数計算 の解答例