/* -*- C++ -*- */ /************************************************************************* * Copyright(c) 1995~2005 Masaharu Goto (root-cint@cern.ch) * * For the licensing terms see the file COPYING * ************************************************************************/ /* =========================================================================== -*- mode: c -*- Last Modified Time-stamp: <01/12/31 18:21:37 hata> sslib253.c Cint Version MATRIX OK! VECTOR NG! cint -03 で実行のこと 畑和彦 =========================================================================== */ /* *---------------------------------------------------------------------------- * ★ 科学技術計算サブルーチンライブラリー * p.89 2.5.3 実係数連立1次方程式 ガウス・ジョルダン法(GAUJOR) * 分割、module化 OK 確認済み * option base 0 ポインタによる引き数渡し * * 機能 係数が同じであるk組の実係数連立1次方程式 * A[m, m]・X[m,k] = B[m,k] * の解をgaussjordan法で一度に求める。 * 掃き出す際、軸(pivot)として列要素の絶対値最大を選択するため * 行列の入れ換えを行う * 書式 int gaujor(double *a, int l, int m, int n, double eps) * * 引き数 入出力 * a :a[L][N]なる実配列名で実係数連立1次方程式の係数行列および * 定数行列である。演算後は定数行列部、すなわちa[i][j], * i=0,1,2,...,M-1, j=M,M+1,M+2,...,N-1に解が得られる。 * 入力 * l :メインプログラムで宣言した配列Aの第1添字の値を、整定数か整 *  変数名で与える。 L≧M * m,n :配列Aの内、演算対象となる列数を、整定数か整変数名で与える * 但し、N=M+K、Kは定数行列の列数である。N>M 80≧M≧2 * eps :収束判定値を実定数か実変数名で与える。EPS>0 * 出力 * 関数値 :エラーフラグである。 * 0 : エラーなし * 1 : 掃き出しの途中、ピボット要素がepsより小さい * -1 : m<2, m>80, m≧n, eps≦0 のいずれかである * スレーブサブルーチン : なし *---------------------------------------------------------------------------- */ #include #include #include /* #define CGI */ #undef MATRIX // <-------- ここです。 //#define MATRIX // <-------- ここです。 #define MAIN #define NMAX 50 #define L 3 #define M 3 #define N 5 #define EPS 1.0e-16 int gaujor2(double a[NMAX][NMAX], int l, int m, int n, double eps); int gaujor(double *, int, int, int, double); #ifndef MATRIX int gaujor(double *a, int l, int m, int n, double eps) { int i,ii,j,k,lc,lr,iw; double wmax,w,pivot,api; static int work[80]; if(m<1 || m>79 || m>=n || eps<=0) return(-1); for(i=0; i=wmax){ wmax = w; lc = i; lr = ii; } } } pivot = *(a+lr*n+lc); api = fabs(pivot); if(api<=eps) return(-1); if(lc!=k){ iw = work[k]; work[k] = work[lc]; work[lc] = iw; for(i=0; i79 || m>=n || eps<=0) return(-1); for(i=0; i=wmax){ wmax = w; lc = i; lr = ii; } } } pivot = a[lr][lc]; api = fabs(pivot); if(api<=eps) return(-1); if(lc!=k){ iw = work[k]; work[k] = work[lc]; work[lc] = iw; for(i=0; i