- •Учреждение образования
- •Лабораторная работа №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 |