Подпрограмма: asg9r_c
Назначение
Решение вещественной системы линейных алгебраических
уравнений A*x = b или AT*x = b
с матрицей A общего вида
методом Гаусса с выбором ведущего элемента по столбцу.
Математическое описание
Для заданной вещественной квaдpaтной матрицы А порядка N
выполняется треугольная факторизация
L- 1*А = U ,
где U - веpхняя тpеугольная матpица, и затем последовательно
pешаются cиcтемы:
L*y = B
(для системы АT*x = b решается UT*y = b) и
U*x = y
(для АT*x = b решается LT*x = y) .
Дж.Форсайт, М.Малькольм, К.Моулер. Машинные методы
математических вычислений. М., Мир, 1980.
Использование
int asg9r_c (real *a, integer *m, integer *n, integer *nlead,
real *b, integer *ltr, integer *l, integer *ierr)
Параметры
a -
|
вещественный двумерный массив размера m на n, в
котором задается исходная матрица; на выходе на
соответствующих местах находятся элементы
матрицы U и поддиагональные элементы матрицы
исключения метода Гаусса Li ,
i = 1, ..., n - 1 ;
|
m -
|
первая размерность массива a в вызывающей
подпрограмме (тип: целый);
|
n -
|
порядок матрицы системы (тип: целый);
|
nlead -
|
целый вектор длины n, содержащий на выходе
информацию о выполненных в ходе факторизации
перестановках (см. замечания по использованию);
|
b -
|
вещественный вектор длины n, в котором задается
правая часть системы; на выходе содержит
вычисленное решение системы (см. замечания по использованию);
|
ltr -
|
задается вид решаемой системы (тип: целый), при этом:
|
ltr = 0 -
|
если решается система A*x = b ;
|
ltr ≠ 0 -
|
если решается система AT*x = b;
|
l -
|
признак решаемой системы (тип: целый), при этом:
|
l = 0 -
|
если система с данной матрицей решается впервые;
|
l ≠ 0 -
|
если система с данной матрицей решается повторно;
|
ierr -
|
целая переменная, содержащая на выходе
информацию о прохождении счета, при этом:
|
ierr=65 -
|
если m ≤ 0 или
n ≤ 0 ;
|
ierr=66 -
|
если в процессе счета возникло
переполнение (это говорит о том, что либо
некоторые элементы матрицы U, либо
некоторые компоненты решения превосходят
по абсолютной величине максимальное
представимое на данной машине число);
|
ierr=-k -
|
если в результате факторизации в k - ой
строке матрицы U диагональный элемент
равен нулю (это свидетельствует о
вырожденности матрицы A). Если таких
строк у матрицы U несколько, то
значение k полагается равным номеру последней из них;
|
ierr=67 -
|
если система несовместна (см. замечания по использованию).
|
Версии
asg9d_c -
|
решение системы линейных алгебраических
уравнений A*x = b или AT*x = b
методом Гаусса с выбором ведущего элемента по столбцу для
вещественных A и b, заданных с удвоенной точностью.
|
asg9c_c -
|
решение системы линейных алгебраических
уравнений A*x = b или AT*x = b
методом Гаусса с выбором ведущего элемента по столбцу для
комплексных A и b.
|
Вызываемые подпрограммы
afg5r_c -
|
подпрограмма треугольной факторизации матрицы A;
|
utafsi_c -
|
подпрограмма выдачи диагностических сообщений.
|
Замечания по использованию
| 1.
|
В подпрограмме asg9d_c массивы a и b имеют тип double,
для треугольного разложения матрицы A
вызывается подпрограмма afg5d_c.
|
| 2.
|
В подпрограмме asg9c_c массивы a и b имеют тип
complex, для треугольного разложения матрицы a
вызывается подпрограмма afg5c_c.
|
| 3.
|
На выходе k - ый элемент вектора nlead равен номеру
строки, переставленной на k - ом шаге факторизации с
k - й строкой матрицы A. Так как факторизация Гаусса
требует n - 1 шагов, то nlead (n) = n .
|
| 4.
|
Если задано l ≤ 0, т.е.
система решается повторно,
то треугольная факторизация не выполняется, и
поэтому в качестве матрицы A при обращении к подпрограмме
нужно взять результат предыдущего обращения к asg9r_c
или к afg5r_c.
|
| 5.
|
Если вырабатывается значение переменной ierr,
отличное от нуля, то выдается соответствующее
диагностическое сообщение и, если ierr > 0, то происходит
выход из подпрограммы. Если система совместна, но матрица
A вырождена (ierr < 0), т.е. для некоторых номеров k
U (k, k) = 0., то полагается
x (k) = 1.
|
Пример использования
int main(void)
{
/* Initialized data */
static float a[16] /* was [4][4] */ = { 7.9f,8.5f,4.3f,3.2f,5.6f,-4.8f,
4.2f,-1.4f,5.7f,.8f,-3.2f,-8.9f,-7.2f,3.5f,9.3f,3.3f };
static float b[4] = { 7.f,7.f,7.f,7.f };
/* Local variables */
static int ierr;
extern int asg9r_c(float *, int *, int *, int *, float *, int *,
int *, int *);
static int i__, l, m, n, nlead[4], ltr;
#define a_ref(a_1,a_2) a[(a_2)*4 + a_1 - 5]
m = 4;
n = m;
ltr = 0;
l = 0;
for (i__ = 1; i__ <= 4; ++i__) {
printf("\n %15.7e %15.7e %15.7e %15.7e \n",
a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3), a_ref(i__, 4));
}
for (i__ = 1; i__ <= 4; ++i__) {
printf("\n %15.7e \n", b[i__-1]);
}
asg9r_c(a, &m, &n, nlead, b, <r, &l, &ierr);
printf("\n %5i %5i %5i %5i \n",
nlead[0], nlead[1], nlead[2], nlead[3]);
for (i__ = 1; i__ <= 4; ++i__) {
printf("\n %15.7e %15.7e %15.7e %15.7e \n",
a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3), a_ref(i__, 4));
}
printf("\n %5i \n", ierr);
for (i__ = 1; i__ <= 4; ++i__) {
printf("\n %15.7e \n", b[i__-1]);
}
return 0;
} /* main */
Результат:
| 8.5 -4.8 0.8 3.5 |
| -0.92941 10.06118 4.95647 -10.45294 |
a_ref = | -0.50588 -0.65879 -9.40171 2.40526 |
| -0.37647 -0.04046 -0.73072 12.65817 |
nlead = (2, 2, 4, 4)
| 1.023054 |
| 0.273777 |
b = | -0.462957 |
| -0.003275 |