Текст подпрограммы и версий adh0r_c.zip , adh0d_c.zip , adh0c_c.zip |
Тексты тестовых примеров tadh0r_c.zip , tadh0d_c.zip , tadh0c_c.zip |
Вычисление определителя симметричной матрицы модифицированным методом квадратного корня (модифицированным методом Холецкого).
Симметричная матрица А раскладывается в произведение А = UTDU, где U - верхняя треугольная матрица, на главной диагонали которой стоят единицы, D - диагональная матрица, с помощью модифицированного метода квадратного корня. Предпологается, что главные миноры матрицы А отличны от нуля. Определитель матрицы А вычисляется как определитель матрицы D и записывается в виде:
det A = D1*2D2, где 0.0625 ≤ D1 < 1
R.S.Мartin, G.Рeters, J.Н.Wilkinson, Symmetric Decomposition of a Рositive Definite Мatrix, Numer. Матн, 7, 1965.
int adh0r_c (real *a, real *d1, integer *d2, real *s, integer *n)
Параметры
a - | вещественный двумерный массив размера n на n, содержащий исходную симметричную матрицу; |
d1 - | вещественная переменная, в которой запоминается мантисса определителя; |
d2 - | целая переменная, в которой запоминается двоичный порядок определителя; |
s - | вещественный вектор длины n, используемый как рабочий; |
n - | заданный порядок исходной матрицы (тип: целый). |
Версии
adh0d_c - | вычисление определителя симметричной матрицы, заданной с удвоенной точностью, модифицированным методом квадратного корня. |
adh0c_c - | вычисление определителя эрмитовой матрицы модифицированным методом квадратного корня. |
Вызываемые подпрограммы
afh0r_c - | треугольное разложение неособенной симметричной матрицы модифицированным методом квадратного корня. |
afh0d_c - | треугольное разложение неособенной симметричной матрицы, заданной с удвоенной точностью, модифицированным методом квадратного корня. |
afh0c_c - | треугольное разложение эрмитовой матрицы модифицированным методом квадратного корня. |
Замечания по использованию
1. |
В подпрограмме adh0d_c параметры a, d1, s имеют тип double. | |
2. | В подпрограмме adh0c_c параметр a имеет тип complex. |
int main(void) { /* Local variables */ extern int adh0r_c(float *, float *, int *, float *, int *); static float a[25] /* was [5][5] */; static int i__, j, n; static float s[5], d1; static int d2; #define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6] for (i__ = 1; i__ <= 5; ++i__) { for (j = i__; j <= 5; ++j) { a_ref(i__, j) = (float) i__; /* l3: */ a_ref(j, i__) = (float) i__; } } n = 5; adh0r_c(a, &d1, &d2, s, &n); printf("\n %15.8f \n",d1); printf("\n %5i \n",d2); return 0; } /* main */ Результат: d1 = 0.0625, d2 = 4, т.е. det a = 0.0625*24 = 1.