vector alg_new_vector(int n) { vector v; v = alg_newvec(n); if (v == NULL) alg_error("alg error"); return v; }
double alg_matinv(int n, matrix a, matrix a_inv) { int i, j, k, ii; double t, det; int *ip; /* 行交換の情報 */ ip = (int *)malloc(sizeof(int) * n); if (ip == NULL) alg_error("記憶領域不足"); det = alg_lu(n, a, ip); if (det != 0) for (k = 0; k < n; k++) { for (i = 0; i < n; i++) { ii = ip[i]; t = (ii == k); for (j = 0; j < i; j++) t -= a[ii][j] * a_inv[j][k]; a_inv[i][k] = t; } for (i = n - 1; i >= 0; i--) { t = a_inv[i][k]; ii = ip[i]; for (j = i + 1; j < n; j++) t -= a[ii][j] * a_inv[j][k]; a_inv[i][k] = t / a[ii][i]; } } free(ip); return det; }
double alg_det(int n, matrix a) { double det; /* 行列式 */ int *ip; /* 行交換の情報 */ ip = (int *)malloc(sizeof(int) * n); /* 記憶領域確保 */ if (ip == NULL) alg_error("記憶領域不足"); det = alg_lu(n, a, ip); /* LU分解 */ free(ip); /* 記憶領域の解放 */ return det; /* 行列式 */ }
double alg_gauss(int n, matrix a, vector b, vector x) { double det; /* 行列式 */ int *ip; /* 行交換の情報 */ ip = (int *)malloc(sizeof(int) * n); /* 記憶領域確保 */ if (ip == NULL) alg_error("記憶領域不足"); det = alg_lu(n, a, ip); /* LU分解 */ if (det != 0) alg_solve(n, a, b, ip, x); /* 連立方程式を解く */ free(ip); /* 記憶領域の解放 */ return det; /* 戻り値は行列式 */ }