C言語による数値計算プログラミング演習

Similar documents
DVIOUT

PowerPoint Presentation

C言語による数値計算プログラミング演習

Microsoft PowerPoint - ip02_01.ppt [互換モード]

Microsoft PowerPoint - CSA_B3_EX2.pptx

画像処理工学

プログラミング基礎

Taro-再帰関数Ⅲ(公開版).jtd

PowerPoint Presentation

C言語による数値計算プログラミング演習

memo

第6章 実験モード解析

Microsoft Word - no15.docx

Microsoft Word - NumericalComputation.docx

数学 t t t t t 加法定理 t t t 倍角公式加法定理で α=β と置く. 三角関数

スライド 1

プログラミング実習I

情報処理演習 B8クラス

Taro-ファイル処理(公開版).jtd


main.dvi

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

PowerPoint プレゼンテーション

Microsoft PowerPoint - 第3回2.ppt

02: 変数と標準入出力

振動学特論火曜 1 限 TA332J 藤井康介 6 章スペクトルの平滑化 スペクトルの平滑化とはギザギザした地震波のフーリエ スペクトルやパワ スペクトルでは正確にスペクトルの山がどこにあるかはよく分からない このようなスペクトルから不純なものを取り去って 本当の性質を浮き彫

Microsoft Word - Cプログラミング演習(10)

C言語による数値計算プログラミング演習

第 4 週コンボリューションその 2, 正弦波による分解 教科書 p. 16~ 目標コンボリューションの演習. 正弦波による信号の分解の考え方の理解. 正弦波の複素表現を学ぶ. 演習問題 問 1. 以下の図にならって,1 と 2 の δ 関数を図示せよ δ (t) 2

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

PowerPoint Presentation

ファイル入出力

Taro-プログラミングの基礎Ⅱ(公

例 e 指数関数的に減衰する信号を h( a < + a a すると, それらのラプラス変換は, H ( ) { e } e インパルス応答が h( a < ( ただし a >, U( ) { } となるシステムにステップ信号 ( y( のラプラス変換 Y () は, Y ( ) H ( ) X (

Microsoft PowerPoint - 配布資料・演習18.pptx

Microsoft PowerPoint - kougi2.ppt

6 6.1 sound_wav_files flu00.wav.wav 44.1 khz 1/44100 spwave Text with Time spwave t T = N t N 44.1 khz t = 1 sec j t f j {f 0, f 1, f 2,, f N 1

Taro-スタック(公開版).jtd

p = 1, 2, cos 2n + p)πj = cos 2nπj 2n + p)πj, sin = sin 2nπj 7.1) f j = a ) 0 + a p + a n+p cos 2nπj p=1 p=0 1 + ) b n+p p=0 sin 2nπj 1 2 a 0 +

Microsoft PowerPoint - 14th.ppt [互換モード]

Microsoft PowerPoint - H22制御工学I-10回.ppt

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

cp-7. 配列

Microsoft Word - Cプログラミング演習(12)

Microsoft PowerPoint - H22制御工学I-2回.ppt

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

kiso2-06.key

C 2 / 21 1 y = x 1.1 lagrange.c 1 / Laglange / 2 #include <stdio.h> 3 #include <math.h> 4 int main() 5 { 6 float x[10], y[10]; 7 float xx, pn, p; 8 in

Transcription:

11. 離散フーリエ変換 時間領域における連続関数 x(t) は, 周波数領域の連続関数 (f) を介して, フーリエ変換 (Fourier transform) : i2π ft ( f) = xte ( ) dt 逆フーリエ変換 (inverse Fourier transform): 2 x() t = ( f) e i π ft df と展開される x(t) は区間 [,T] 以外では とすると, フーリエ変換における無限区間 [, ] での積分は有限区間 [,T] での積分となる この区間を 等分 ( 小区間幅 :T s =T/, 等分点 :t j =jt s (j=,1,,)) して複合台形則により数値積分を行い, さらに周波数 f k =k/t (k=,1,,-1) において評価すると, ( ) 1 i2 π kj/ 2 k = s j + s j= ( f ) T x( t ) e O T を得る この式を T s で割って y(f k )=(f k )/T s とおいたものが, 離散フーリエ変換 (discrete Fourier transform, DFT) である x(t j )=x j, y(f k )=y k と記せば,DFT は, 時間領域における時間間隔 T s ( サンプリングタイムとよぶ ) の 点のデータ Tを周波数領域における周波数間隔 f 1 =1/T( 基本周波数とよぶ ) の 点のデータ x = [ x, x1, L, x 1] y= [ y, y1,l, y 1] T i2 π / w = e に変換するものであり, 回転因子 を用いて, 以下のように書ける 1 kj yk = x jw ( k =,1, L, 1) j = 行列 ベクトル表示を行うと, 1 1 1 L 1 1 2 1 1 w w L w 2 4 2( 1) y = Fx, F = 1 w w L w M M M M ( 1) 2( 1) ( 1)( 1) 1 w w L w となる 逆離散フーリエ変換 (inverse discrete Fourier transform, IDFT) は,y から x を求めるプロセス であり, 次のようになる 1 x = y w ( j =,1, L, 1) 1 jk j k k = これは, 行列 ベクトル表示により次のように書ける 1 1 1 L 1 1 w w L w x = F F = w w w M M M M 1 w w L w 1 2 ( 1) 1 1 1 2 4 2( 1) y, 1 L 周期性 : k k± j w = w ( j=,1, L ) ( 1) 2( 1) ( 1)( 1) 回転因子 w は 1 の 乗根である その k 乗あるいは-k 乗 (k=,1,,-1) もすべて 1 の 乗根であり, これらはそれぞれ複素平面上の単位円の角度干 2πk/(k=,1,,-1) における点である 回転因子の演算には, 次の性質 および が偶数のときには原点対称性 : k+ /2 w = w がある =8 のときの回転因子の例を図示する 高速フーリエ変換 (fast Fourier transform, FFT) とは, 上記の変換を効率よく計算するアルゴリズムであり, 時間間引き型 FFT と周波数間引き型 FFT がある 1 k

11.1 時間間引き型 FFT 時間間引き型 FFT とは,DFT の右辺 ( 時間領域におけるデータ ) を以下のように x k が偶数と奇数のグループに並べ替えて, データ点数 の DFT をデータ点数 /2 の DFT に分解していき, 演算量を減らすものである 1 /2 1 /2 1 kj (2 r ) k (2r+ 1) k () k (1) k j 2r 2r+ 1 k k j= r= r= y = x w = x w + x w = + w ( k =,1, L, 1) /2 1 () rk ' () () k' = x2 rw /2, k' + /2 = k' r = /2 1 (1) rk ' (1) (1) k' = x2r+ 1 w /2, k' + /2 = k' r = データ総数が =2 m の場合,p 段目ではデータ点数 p =2 p の DFT グループが n g =/ p =2 m-p 個ある p 段の最初に おいて, 各グループ毎に前半には偶数列要素, 後半には奇数列要素を順に配置すると,p 段第 i グループ (i=,1,,n g -1) の前半 ( 偶数列要素 ) は p-1 段の第 2i グループ要素, 後半 ( 奇数列要素 ) は p-1 段の第 1 グル ープ要素に相当する p 段 i グループの第 k 要素を新たに p i,k (k=,1, p -1) と記すと,w k+p/2 p =-w k p より p p 1 j p 1 i, j = 2 i, j + w 2 1, (,, 1) p i+ j i = L ng p p 1 j p 1 ( j,, /2 1) i, j+ p/2 = 2 i, j w = L p 1, j p と分解されることになる これを p=1 から始め,p=m まで繰り返せばよい =2 3 =8 の場合の例を示す 最後の第 3 段では,8 点の DFT グループ ( 第 グループ ) が 1 組存在し, この順番で周波数領域における値 y k となっている 3 2 2 i, = 2 i, + w8 1, 3 2 1 2 i,1= 2,1 i + w8 1,1 3 2 2 2 i, 2= 2 i, 2+ w8 1, 2 3 2 3 2 i, 3= 2 i, 3+ w8 1, 3 3 2 2 ( i = ) i, 4= 2 i, w8 1, 3 2 1 2 i, 5= 2 i, 1 w8 1, 1 3 2 2 2 i, 6= 2 i, 2 w8 1, 2 3 2 3 2 i, 7= 2 i, 3 w8 1, 3 ここで右辺の ( 2,, 2,1, 2,2, 2,3 ) は偶数項 (x,x 2,x 4,x 6 ) をデータに持つ第 2 段の第 DFT グループ,( 2 1,, 2 1,1, 2 1,2, 2 1,3 ) は奇数項 (x 1,x 3,x 5,x 7 ) をデータに持つ第 2 段の第 1DFT グループである このように, 第 2 段では,4 点の DFT グループが 2 組存在し, さらに次のように分解される 2 1 1 i, = 2 i, + w4 1, 2 1 1 1 i,1= 2,1 i + w4 1,1 (,1) 2 1 1 i = i, 2= 2 i, w4 1, 2 1 1 1 i, 3= 2 i, 1 w4 1, 1 右辺の ( 1,, 1,1 ), (1 1,, 1 1,1 ), (1 2,, 1 2,1 ), (1 3,, 1 3,1 ) はそれぞれの偶数項 (x,x 4 ), 奇数項 (x 2,x 6 ), 偶数項 (x 1,x 5 ), 奇数項 (x 3,x 7 ) をデータに持つ第 1 段の第,1,2,3DFT グループである つまり第 1 段では,2 点の DFT グループが 4 組存在し, さらに次のように分解される 1 i, = 2 i, + w2 1, (,1,2,3) 1 i = i,1= 2, i w2 1, 実際の計算は第 1 段から始めて第 2 段を行い, 第 3 段で終了する データ処理の流れは以下のように書ける 2

第 1 段の最初において与えるべきデータ x k の順番 ( 添え字番号 k の順番 ) は,,1,,7 を表す 2 進数 () 2, (1) 2, (1) 2, (11) 2, (1) 2, (11) 2, (11) 2, (111) 2 のビットを逆転させたもの ( 以下 ) となっている () 2, (1) 2, (1) 2, (11) 2, (1) 2, (11) 2, (11) 2, (111) 2 = =4 =2 =6 =1 =5 =3 =7 アルゴリズム 11.1.1 DFT のアルゴリズムは以下のとおり ただし,Y, k, w p j は複素数である 1) ビット逆転により,=2 m 点の入力データ x i ( 対応する時間は t i =it s ) の順序を並べ替え, その結果を変数, 1,, -1 にセットする for i= to -1 データ数 =2 m だけ繰り返す bit := i i を 2 進数で表したときのビットを逆転して変数 bitr にセット bitr := ; C 言語の左右シフト演算子 <<, >>, 論理積演算子 &, 論理和演算子 を用いる for k=1 to m bitr := bitr << 1 bitrを左に1ビットだけシフト bitr := bitr (bit & 1) bitの1ビット目をbitrの1ビット目にセット bit := bit >> 1 bitを右に1ビットだけシフト if i<bitr then i < bitr のときのみ,i 番目とbitr 番目のデータを入れ換え Y := i 注 : 既に交換済みのものを再度交換すると元に戻るので i := bitr bitr := Y 2) 偶数列と奇数列への分解の統合を m 段繰り返す 次に示すのはアルゴリズムの原型であり,w p j の計算を効率よく行うべく更に改良できる for p=1 to m 第 p 段 :p=1,,m p := 2 p p: 各グループのデータ点数 g := /p ng: グループ数 for i= to ng-1 for j= to p/2-1 k := p i + j l := k+p/2 Y := w j p l l := k -Y k := k +Y この結果, k が DFT の y k ( 対応する周波数は f k =k/(t s )) となる なお,IDFT も全く同じアルゴリズムにより計算できる DFT との相違は回転因子 w を w -1 に置き換え, 最後に (1/) を乗じることのみである プログラム 11.1.1 C 言語のコンパイラによっては, 複素数を扱えないものもある ここでは, 構造体により complex 型を定義する 1 2 /* FFT (Fast Fourier Transform) program */ /* with Complex type supplied */ 3

3 4 5 6 7 8 9 1 11 12 13 14 15 16 17 18 19 2 21 22 23 24 25 26 27 28 29 3 31 32 33 34 35 36 37 38 39 4 41 42 43 44 45 46 47 48 49 5 51 52 53 #include <stdio.h> #include <math.h> #define PI 3.14159265358979323 #define MA 8192 /* MA = 2^13 =8192 */ typedef struct /* 複素数を扱うための complex 型構造体を定義 */ double re; double im; complex; complex comp_set(double x, double y) /* 複素数の実部と虚部のセット */ complex z; z.re = x; z.im = y; return(z); complex comp_add(complex x, complex y) /* 複素数の加算 */ complex z; z.re = x.re + y.re; z.im = x.im + y.im; return(z); complex comp_sub(complex x, complex y) /* 複素数の減算 */ complex z; z.re = x.re - y.re; z.im = x.im - y.im; return(z); complex comp_mul(complex x, complex y) /* 複素数の乗算 */ complex z; z.re = x.re * y.re - x.im * y.im; z.im = x.re * y.im + x.im * y.re; return(z); complex comp_div(complex x, complex y) /* 複素数の割算 */ complex z; 4

54 55 56 57 58 59 6 61 62 63 64 65 66 67 68 69 7 71 72 73 74 75 76 77 78 79 8 81 82 83 84 85 86 87 88 89 9 91 92 93 94 95 96 97 98 99 1 11 12 13 14 double c; c = y.re * y.re + y.im * y.im; z.re = ( x.re * y.re + x.im * y.im)/c; z.im = (-x.re * y.im + x.im * y.re)/c; return(z); void fft_time(complex *x, int n, int M, int idft) complex w,wj,y; float dth; int i,j,k,l,p,bit,bitr,sign,np,np2,ng; for(i=;i<n;i++) /* bit 逆転 : i ==> bitr */ bit =i; bitr=; for(k=;k<m;k++) bitr = bitr << 1; /* bitrを左に 1ビットだけシフト */ bitr = bitr (bit & 1); /* bitの1ビット目を bitrの1ビット目にセット */ bit = bit >> 1; /* bitを右に 1ビットだけシフト */ if(i<bitr) /* i < bitr のときのみ, データを入れ換える */ y = x[i]; x[i] = x[bitr]; x[bitr]= y; if(!idft) /* DFT */ sign=-1; else /* IDFT */ sign= 1; np=1; for(p=1;p<=m;p++) np *= 2; /* p 段目のデータ点数 :np = 2^p */ np2 = np/2; ng =n/np; /* p 段目のグループ数 :ng = n/np */ dth =PI/np2; /* dtheta = 2PI/np */ w = comp_set( cos(dth), sign*sin(dth) ); wj = comp_set( 1.e,.e ); for(j=;j<np2;j++) for(i=;i<ng;i++) k =np*i+j; 5

15 16 17 18 19 11 111 112 113 114 115 116 117 118 119 12 121 122 123 124 125 126 127 128 129 13 131 132 133 134 135 136 137 138 139 14 141 142 143 144 145 146 147 148 149 15 151 152 153 154 155 l =k+np2; y =comp_mul( wj, x[l] ); x[l]=comp_sub( x[k], y ); x[k]=comp_add( x[k], y ); wj = comp_mul( wj, w ); if(idft) /* IDFT */ for(i=;i<n;i++) x[i].re /= (float)n; x[i].im /= (float)n; void main(void) complex x[ma]; float time_smpl,sp,time[ma],freq[ma],single_re,single_im; int n,m,i,spectrum,idft=; char fname[3][3]; /* ファイル名用領域 */ FILE *fpin, *fpout; /* ファイルポインターの宣言 */ printf("fast Fourier Transform\n"); printf("* umber of data n=2^m : n, M? "); /* データ点数 :n = 2^M */ scanf("%d%d", &n, &M); /* ファイル名の入力 */ printf("input file name for data ==> "); scanf("%s",fname[]); /* idft= のときは後者 (DFT) を, それ以外のときは前者 (IDFT) を出力 */ printf("output file name for %s complex data ==> ", idft?"idft":"dft"); scanf("%s",fname[1]); printf("output file name for %s spectrum data ==> ", idft?"idft":"dft"); scanf("%s",fname[2]); /* ファイルオープンとエラー処理 */ if( (fpin=fopen(fname[],"r"))==ull ) printf(" ファイルをオープンできません \n"); exit(1); for(i=;i<n;i++) if(!idft) /* data for DFT */ fscanf(fpin, "%g%g",&time[i], &single_re); single_im=.; else /* data for IDFT */ fscanf(fpin, "%g%g%g",&time[i], &single_re, &single_im); x[i]=comp_set(single_re, single_im); 6

156 157 158 159 16 161 162 163 164 165 166 167 168 169 17 171 172 173 174 175 176 177 178 179 18 181 182 183 184 185 186 187 188 189 19 191 192 193 194 195 196 197 198 199 2 21 22 23 24 25 26 fclose(fpin); printf("\n* input data were read from file: %s\n",fname[]); /* set of sampling time */ if(!idft) /* DFT: time[]... time */ time_smpl = time[1]-time[]; else /* IDFT: time[]... frequency */ time_smpl = 1./((time[1]-time[])*n); fft_time(x, n, M, idft); /* FFT */ printf("!!! %s finished!!!\n", idft?"idft":"dft"); if(!idft) /* DFT: set frequency */ for(i=;i<n;i++) freq[i]=(float)i/(time_smpl * n); else /* IDFT: set time */ for(i=;i<n;i++) freq[i]=(float)i*time_smpl; /* 変換結果を複素数でファイル出力 */ if( (fpout=fopen(fname[1],"w"))==ull ) printf(" ファイルをオープンできません \n"); exit(1); for(i=;i<n;i++) fprintf(fpout,"%13.6g\t%13.6g\t%13.6g\n",freq[i],x[i].re,x[i].im); fclose(fpout); printf("* complex output were written to file: %s\n",fname[1]); /* 出力スペクトルの種類の選択 */ printf("\ninput spectrum o.:.phase, 1.amplitude, 2.power spectrum? "); scanf("%d",&spectrum); /* 変換結果を各種スペクトルでファイル出力 */ if( (fpout=fopen(fname[2],"w"))==ull ) printf(" ファイルをオープンできません \n"); exit(1); for(i=;i<n;i++) if(spectrum==) sp = atan2( x[i].im, x[i].re ); else if(spectrum==1) sp = sqrt( x[i].re*x[i].re + x[i].im*x[i].im ); else if(spectrum==2) sp = x[i].re*x[i].re + x[i].im*x[i].im; fprintf(fpout,"%13.6g\t%13.6g\n",freq[i],sp); fclose(fpout); printf("* spectrum output were written to file: %s\n",fname[2]); 7

実行例 時間 t[s] における変位 x[mm] が sin 波による合成 ( 下式 ) により与えられるとする x( t) = a + a sin(2 πν t) + a sin(2 πν t) + a sin(2 πν t) + a sin(2 πν t) 1 1 2 2 3 3 4 4 ここで, 各振幅と周波数は以下のように設定する a = 2 a1 = 5 ν1 =.8 a2 = 2 ν 2 = 1.35 a3 = 1 ν 3 = 3 a = 1.5 ν = 1 4 4 サンプリングタイム T s を.1[s] として =2 1 =124 個のデータを ( エクセルなどにより ) 計算してテストデータとし, ファイル test1.txt に格納する テストデータの時間と変位を以下に図示する ファイル test1.txt の中身 ( 時間と変位 ) 2.1 3.489723.2 4.634185.3 5.2173.4 5.23414.5 4.875495.6 4.482857.7 4.384178.8 4.783693.9 5.67879.1 6.8647.11 7.99741.12 8.735432 : : : : 1.2 3.649625 1.21 4.547769 1.22 5.1384 1.23 5.215783 変位 x [mm] 12 1 8 6 4 2-2 -4-6 -8 2 4 6 8 1 12 時間 t [sec.] DFT の結果を以下に示す ------------------------- 実行開始 ----------------------- Fast Fourier Transform * umber of data n=2^m : n, M? 124 1 入力データ点数 124は2の1 乗 input file name for data ==> test1.txt 入力データファイル名 output file name for DFT complex data ==> test1_complex.txt 出力データ ( 複素数 ) ファイル名 output file name for DFT spectrum data ==> test1_spectrum.txt 出力データ ( スペクトル ) ファイル名 * input data were read from file: test1.txt!!! DFT finished!!! * complex output were written to file: test1_complex.txt input spectrum o.:.phase, 1.amplitude, 2.power spectrum? 1 出力スペクトルの選択 * spectrum output were written to file: test1_spectrum.txt ------------------------- おしまい ----------------------- 8

出力スペクトルファイル (test1_spectrum.txt) から振幅スペクトルをエクセルに読み込み, 図示する この変換におけるサンプリングタイムは T s =.1[s], サンプリング点数は =124, サンプリング区間 ( サンプリングを行った全時間 ) は T=T s =1.24[s] である したがって基本周波数は f 1 =1/T=.97656[Hz] であり, ファイルのデータをチェックすると出力周波数は基本周波数の倍数 kf 1 (k=,1, -1) であることが確認される サンプリング周波数は f s =1/T s =1[Hz] であり, 結果の周波数の範囲は [,f s ) となっていることが確認される 振幅スペクトル図には, 中央 (f=f s /2) に関して対称となる特性が現れている サンプリング定理によると, ある波形に含まれる最大周波数を f max とすると, その波形を復元するには 2f max よりも高い周波数 f s でサンプリングする必要がある したがって計算された周波数の範囲 [,f s ) のうち意味を持つのは,[, f s /2) の範囲である グラフには, 周波数.8, 1.35, 3, 1 近傍にピークがあり, 入力波が適正にフーリエ変換されたことがわかる 振幅スペクトル ファイル test1_spectrum.txt の中身 ( 周波数と振幅 ) 2134.7.97656 87.6652.195312 92.7724.292969 12.58.39625 119.471.488281 149.884.585938 211.732.683594 384.64.78125 2398.48.87896 587.984.976562 281.25 1.7422 25.96 1.17188 195.394 1.26953 282.767 1.36719 916.352 1.46484 14.21 1.5625 49.6984 : : : : : : 98.735 282.767 98.8281 195.394 98.9258 25.96 99.234 281.25 99.1211 587.984 99.2188 2398.48 99.3164 384.64 99.4141 211.732 99.5117 149.884 99.694 119.471 99.77 12.58 99.847 92.7724 99.923 87.6652 3 25 2 15 1 5 2 4 6 8 1 3 25 2 15 1 5 3 25 2 15 1 5 周波数 Hz] 2 4 6 8 1 12 14 周波数 [Hz] 1 2 3 4 5 周波数 [Hz] 9

確認のため, 更にプログラムの 127 行における変数 idft の初期設定を idft=1 とし,IDFT の計算を行う 入力データには先ほどの DFT で得られた結果 ( 複素数 ) のファイルを用いると,DFT での最初の入力波形が復元されるはずである ------------------------- 実行開始 ----------------------- Fast Fourier Transform * umber of data n=2^m : n, M? 124 1 入力データ点数 124は2の1 乗 input file name for data ==> test1_complex.txt 入力データファイル名 output file name for IDFT complex data ==> test1_idftcomplex.txt 出力データ ( 複素数 ) ファイル名 output file name for IDFT spectrum data ==> test1_idftspectrum.txt 出力データ ( スペクトル ) ファイル名 * input data were read from file: test1_complex.txt!!! IDFT finished!!! * complex output were written to file: test1_idftcomplex.txt input spectrum o.:.phase, 1.amplitude, 2.power spectrum? 1 * spectrum output were written to file: test1_idftspectrum.txt ------------------------- おしまい ----------------------- DFT の結果データ (test1_complex.txt) を入力して IDFT を行った結果, 複素数の実部には最初の入力波形がほぼ復元されており, 複素数の虚部は全てほぼ零に近い値となっており, 逆フーリエ変換が適正に行われたことがわかる ファイル test1_idftcomplex.txt の中身 ( 時間と変位 : 複素数の実部と虚部 ) 1.99999-6.87E-7.1 3.48972-6.62E-7.2 4.63418-4.5E-7.3 5.217-1.7E-8.4 5.2341 1.5E-7.5 4.87549-1.1E-7.6 4.48285-6.55E-7.7 4.38417-1.3E-6.8 4.78369-2.6E-6.9 5.67879-2.74E-6.1 6.865-3.11E-6.11 7.9974-3.2E-6.12 8.73543-2.69E-6 : : : : : : : : : 1.2 3.64962 1.55E-6 1.21 4.54776 9.96E-7 1.22 5.1383 2.37E-7 1.23 5.21577-3.98E-7 変位 [mm] 12 1 8 6 4 2-2 -4-6 -8 実部虚部 2 4 6 8 1 12 時間 [sec.] 参考文献 葉子 : 数値計算の基礎 解法と誤差, コロナ社 (27) Heath, Michael T.: Scientific Computing, An Introductory Survey, McGraw-Hill(22) 1