Метод квадратного корня

Контрольная работа - Компьютеры, программирование

Другие контрольные работы по предмету Компьютеры, программирование

 

 

 

 

 

 

 

Лабораторная работа

 

по курсу

 

Численные методы

 

 

Метод квадратного корня

 

 

Задание

 

Для матрицы А составить процедуры:

разложения матрицы на множители;

решения СЛАУ ах=b;

нахождения определителя матрицы А;

нахождения обратной матрицы.

методом квадратного корня.

Вывести в файл:

все входные данные задачи;

разложенную на множители матрицу А;

обратную к А матрицу;

определитель матрицы А;

решение системы Х;

следующие проверки:

правильность разложения (невязку),

невязку нахождения решения,

невязку обращенной матрицы.

Входные данные задачи вводятся из файла, содержащего размерность задачи, матрицу А, вектор В.

 

1. Описание используемого метода

 

Суть метода квадратного корня состоит в следующем. Пусть дана линейная система, где А=(aij) - симметричная квадратная матрица порядка nxn, т.е. АT=(aji)=A; b=(b1,…, bn) - вектор правых частей системы, x=(x1,…, xn) - вектор-столбец неизвестных.

Расчетные формулы.) разложения матрицы на множители.

Рассмотрим матрицу A в виде

= SТDS, (1)

 

где

s11s12s13…s1n0s22s23…s2nS =00s33.s3n…000…snnii > 0, i = 2…n

 

S - верхнетреугольная матрица с положительными элементами на главной диагонали.= diag (d11, …, dnn); dii = 1, i = 1..n - диагональная матрица с элементами на главной диагонали 1.Т - транспонированная к S матрица (нижнетреугольная).

Тогда, производя перемножение матриц SТ, D и S, получим уравнения для определения элементов aij матрицы A и, преобразовав их, получим следующие уравнения:

(2)

(3)

(4)

квадратный корень матрица программа

Если sii?0, то det(A) = det(SТ) det(D) det(S) ? 0, и система имеет единственное решение.

Если матрица A является положительно определенной, то матрица D будет единичной.

б) решения СЛАУ Ax=b.

Если разложение получено, то, применив формулу (1), получим:

ТDSx=b

 

Положив DSx=y, сводим решение системы к последовательному решению двух систем с треугольными матрицами: STy=b и DSx=y.

Из первой найдем yi:

 

(5)

 

Затем, зная yi, из второй системы находим xi:

 

(6)

 

в) нахождения определителя матрицы А.

Как уже отмечалось выше, det(A) = det(SТ) det(D) det(S) = det(D) (det(S))2

 

det(S) = (s11*s22*… *snn),(D) = (d11*d22*… *dnn)

 

Отсюда находим:

 

(7)

 

г) нахождения обратной к А матрицы.

Пусть H - обратная к А матрица. Тогда

 

AH=E (8)

 

E - единичная матрица nЧn.

Т.к. уравнение (8) матричное, необходимо записать его в векторном виде, представив матрицы Н и Е в виде систем векторов:

 

E=[e1, e2,…, en], ei - вектора 1Чn (единичные орты)

H=[h1, h2,…, hn], hi - вектора 1Чn(9)

 

Используя систему (9), преобразуем матричное уравнение (8) в систему:

 

, m = (1,2,…, n)

 

Отсюда

 

, m = (1,2,…, n)

 

Таким же образом, как и при решении СЛАУ, положим и , из чего найдем:

 

, m = (1,2,…, n)

, m = (1,2,…, n)

 

Таким образом, будет найдена матрица Н, обратная к А.

Перемножение матриц

 

2. Листинг программы

 

// -

#include

#pragma hdrstop

#include

#include

#include

#include

#include

#include

#include

#include

#include

// -

#pragma argsusedint n=4;FindD (float A[n] [n], float S[n] [n], float D[n] [n], int i)

{float c=0, b=0; int l;(l=0; l<=i-1; l++)=c+S[l] [i]*S[l] [i]*D[l] [l];= A[i] [i] - c;(b==0) D[i] [i]=0;{(b<0) D[i] [i]=-1;D[i] [i]=1;};=0;

}FindSij (float A[n] [n], float S[n] [n], float D[n] [n], int i, int j)

{float c=0; int l;(l=0; l<=i-1; l++)=c+S[l] [i]*D[l] [l]*S[l] [j];((S[i] [i]==0)||(D[i] [i]==0)) {S[i] [j]==0;}S[i] [j]=(A[i] [j] - c)/S[i] [i]*D[i] [i];=0;

}FindSii (float A[n] [n], float S[n] [n], float D[n] [n], int i)

{float c=0; int l;(l=0; l<=i-1; l++) {=c+S[l] [i]*S[l] [i]*D[l] [l];};[i] [i]=sqrt (fabs(A[i] [i] - c));=0;

}Findy (float A[n] [n], float St[n] [n], float b[n], float y[n], int i)

{float c=0; int k;(k=0; k<=i-1; k++) {=c+St[i] [k]*y[k];};[i]=(b[i] - c)/St[i] [i];=0;

}Findx (float A[n] [n], float S[n] [n], float D[n] [n], float y[n], float x[n], int i)

{float c=0; int k;(k=i+1; k<n; k++) {=c+D[i] [i]*S[i] [k]*x[k];};[i]=(y[i] - c)/(D[i] [i]*S[i] [i]);=0;

}FindDet (float S[n] [n], float D[n] [n], float &DetA)

{float c=1, o=1; int k;(k=0; k<n; k++)=c*S[k] [k];(k=0; k<n; k++)=o*D[k] [k];=o*(c*c);=1; o=1;

}Umn (float A[n] [n], float x[n], float b[n], float r[n])

{float c=0;(int i=0; i<n; i++) {(int j=0; j<n; j++) {= c + (A[i] [j]*x[j]);

}[i]= c-b[i]; c=0;};

}Umnm (float A[n] [n], float S[n] [n], float M[n] [n])

{(int i=0; i<n; i++) {(int j=0; j<n; j++) {[i] [j]=0;(int k=0; k<n; k++)[i] [j]= M[i] [j]+ (A[i] [k]*S[k] [j]);

};

};

}main (int argc, char* argv[])

{const int n=4;A[n] [n];S[n] [n], St[n] [n], D[n] [n];b[n];i, j;(i=0; i<n; i++) {(j=0; j<n; j++) {[i] [j]=0; St[i] [j]=0; D[i] [j]=0;

};

};* f1, *f2;=fopen (input.txt, r);((f1=fopen (input.txt, r)) == 0) printf (file pust);{(i=0; i<n; i++) {(j=0; j<n; j++) {(f1, f, &A[i] [j]);(f1, \n);};};(i=0; i<n; i++) {(f1, f, &b[i]);(f1, \n);};(f1);=fopen (output.txt, w);(f2, A= \n);(i=0; i<n; i++) {(j=0; j<n; j++) {(f2, f, A[i] [j]);};(f2, \n);};(f2, b= \n);(j=0; j<n; j++) {(f2, f, b[j]);};

fprintf (f2, \n);

// поиск элементов S, D

bool B=true;(i=0; i<n; i++) {(j=i; j<n; j++) {(i==j) {(A, S, D, i);(A, S, D, i);((S[i] [i]==0)||(D[i] [i]==0)) B=false;

}

{(A, S, D, i, j);};};

};(B==false) fprintf (f2, Nedopustimaya matrica! DetA=0);{(i=0; i<n; i++) { // поиск элементов St(j=0; j<n; j++) {[i] [j]=S[j] [i];};

};(f2, S= \n);(i=0; i<n; i++) {(j=0; j<n; j++) {(f2, f, S[i] [j]);};(f2, \n);};(f2, D= \n);(i=0; i<n; i++) {(j=0; j<n; j++) {(f2, f, D[i] [j]);};(f2, \n);};

(f2, St= \n);(i=0; i<n; i++) {(j=0; j<n; j++) {(f2, f, St[i] [j]);};(f2, \n);};

// Решение СЛАУy[n], x[n];(i=0; i=0; i-)(A, S, D, y, x, i);(f2, y= \n);(j=0; j<n; j++) {(f2, f, y[j]);};(f2, \n);(f2, x= \n);(j=0; j<n; j++) {(f2, f, x[j]);};

fprintf (f2, \n);

// Нахождение оп