/* 三重対角行列の LU 分解 (pivoting なし) */ void trilu(int n, double *al, double *ad, double *au) { int i, nm1 = n - 1; /* 前進消去 (forward elimination) */ for (i = 0; i < nm1; i++) { al[i + 1] /= ad[i]; ad[i + 1] -= au[i] * al[i + 1]; } } /* LU 分解済みの三重対角行列を係数に持つ三項方程式を解く */ void trisol(int n, double *al, double *ad, double *au, double *b) { int i, nm1 = n - 1; /* 前進消去 (forward elimination) */ for (i = 0; i < nm1; i++) b[i + 1] -= b[i] * al[i + 1]; /* 後退代入 (backward substitution) */ b[nm1] /= ad[nm1]; for (i = n - 2; i >= 0; i--) b[i] = (b[i] - au[i] * b[i + 1]) / ad[i]; } |
「『発展系の数値解析』に加えること」に説明してある。連立1次方程式については、他に
http://nalab.mind.meiji.ac.jp/~mk/labo/text/heat-fdm-0-add.pdf
「連立1次方程式I -- 計算量と直接法」(5章、特に§5.7)が参考になる。
http://nalab.mind.meiji.ac.jp/~mk/labo/text/linear-eq-1.pdf
桂田 祐史