
- •Учреждение образования
- •Лабораторная работа №1 Тема: «Прямые методы решения систем линейных алгебраических уравнений»
- •Изученные теоретические вопросы: Метод Гаусса
- •Решение:
- •Лабораторная работа №2
- •Изученные теоретические вопросы:
- •Лабораторная работа №3
- •Изученные теоретические вопросы:
- •Лабораторная работа №4
- •Изученные теоретические вопросы: Метод квадратного корня
- •Лабораторная работа №5
- •Изученные теоретические вопросы: Метод отражений
- •Лабораторная работа №6 Решить систему линейных алгебраических уравнений методом вращений.
- •Изученные теоретические вопросы:
- •Решение:
- •Лабораторная работа№7 Тема: «Прямые методы решения систем линейных алгебраических уравнений»
- •Изученные теоретические вопросы: Метод ортогонализации
- •Лабораторная работа №8
- •Изученные теоретические вопросы: Метод сопряженных градиентов
- •Лабораторная работа № 9
- •Лабораторная работа № 10
- •Решение:
Изученные теоретические вопросы: Метод отражений
Этот
метод основан на разложении матрицы
системы в произведение унитарной матрицы
на верхнюю треугольную. Матрица
называется унитарной, если она
удовлетворяет уравнению
,
где
- матрица, сопряженная с
.
Вещественные унитарные матрицы называются
ортогональными.
По своей структуре метод отражений близок к методу Гаусса, но исключение проводится с помощью матриц отражения, которые являются унитарными и эрмитовыми. Достоинством метода отражений является единая схема вычислительного процесса, не зависящая от структуры матрицы.
Пусть
и
произвольные вектор-столбцы, причем
вектор
имеет единичную длину. Тогда найдется
такой вектор
,
что построенная по нему матрица отражения
переведет вектор
в вектор, коллинеарный вектору
,
т.е.
.
Вектор
строится по правилу
,
где
,
,
.
Будем преобразовывать расширенную матрицу систему по правилу
,
с
помощью умножения слева на последовательность
матриц отражения
.
Для построения матрицы
на первом шаге метода в качестве вектора
берется первый столбец расширенной
матрицы, а в качестве вектора
- координатный вектор
.
В силу выбора векторов
и
все координаты первого столбца расширенной
матрицы, кроме первой, после выполнения
первого шага метода будут равны нулю.
Пусть
уже построена матрица
,
у которой
,
,
.
Теперь в качестве
и
берутся вектора
,
,
где
в векторе
единица стоит на
-ом
месте. После выполнения
-го
шага метода отражений получим матрицу
,
у которой все элементы, стоящие ниже
главной диагонали, в первых
-ом
столбцах будут равны нулю. Невозможность
выполнения очередного шага связана
только с равенством нулю вектора
,
а это невозможно, так как матрица
является невырожденной.
После
-
шага получим матрицу, первые
столбцов которой образуют верхнюю
треугольную матрицу
.
Система уравнений, соответствующая
полученной расширенной матрице,
равносильна исходной системе (4.1).
Значения неизвестных находятся аналогично
обратному ходу метода Гаусса
,
,
Решение:
void main(){
printf("vvedite razmernost matrix\n");
int n;
scanf("%d",&n);
printf("vveddite matrix\n");
float A[3][4];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%f",&A[i][j]);
printf("vvedite svobodnie chleni\n");
for(int i=0;i<n;i++)
scanf("%f",&A[i][n]);
float s[10],l[10],fabsa,scala=0,a,p;
float U[10][10],A2[10][10],w[10];
for(int k=0;k<n-1;k++){
for(int i=0;i<n;i++){
s[i]=A[i][k];
l[i]=0;
}
for(int i=0;i<k;i++)
s[i]=0;
l[k]=1;
fabsa=0;
for(int i=0;i<n;i++)
fabsa+=s[i]*s[i];
fabsa=pow(fabsa,0.5);
scala=0;
for(int i=0;i<n;i++)
scala+=s[i]*l[i];
if(scala>0) a=-fabsa;
else a=fabsa;
p=pow(2*pow(fabsa,2)+2*fabsa*fabs(scala),0.5);
for(int i=0;i<n;i++)
w[i]=(s[i]-a*l[i])/p;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
U[i][j]=0;
for(int i=0;i<n;i++)
U[i][i]=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
U[i][j]-=2*w[i]*w[j];
for(int i=0;i<n;i++)
for(int j=0;j<n+1;j++)
A2[i][j]=0;
for(int i=0;i<n;i++)
for(int j=0;j<n+1;j++)
for(int r=0;r<n;r++)
A2[i][j]+=U[i][r]*A[r][j];
for(int i=0;i<n;i++)
for(int j=0;j<n+1;j++)
A[i][j]=A2[i][j];
for(int i=k+1;i<n;i++)
A[i][k]=0;
}
float x[10];
float sum=0;
int i;
for(i=n-1;i>-1;i--){
sum=0;
for(int k=i;k<n;k++)
sum+=A[i][k]*x[k];
x[i]=(A[i][n]-sum)/A[i][i];
}
printf("poluchenue korni\n");
for(int i=0;i<n;i++)
printf("%.2f\n", x[i]);
getch();
}
Результат:
Введенные данные |
Полученный результат |
Проверка |
|
-8.30 0.17 -2.76 |
-2,7 1,5 -1.20 |