
- •Учреждение образования
- •Лабораторная работа №1 Тема: «Прямые методы решения систем линейных алгебраических уравнений»
- •Изученные теоретические вопросы: Метод Гаусса
- •Решение:
- •Лабораторная работа №2
- •Изученные теоретические вопросы:
- •Лабораторная работа №3
- •Изученные теоретические вопросы:
- •Лабораторная работа №4
- •Изученные теоретические вопросы: Метод квадратного корня
- •Лабораторная работа №5
- •Изученные теоретические вопросы: Метод отражений
- •Лабораторная работа №6 Решить систему линейных алгебраических уравнений методом вращений.
- •Изученные теоретические вопросы:
- •Решение:
- •Лабораторная работа№7 Тема: «Прямые методы решения систем линейных алгебраических уравнений»
- •Изученные теоретические вопросы: Метод ортогонализации
- •Лабораторная работа №8
- •Изученные теоретические вопросы: Метод сопряженных градиентов
- •Лабораторная работа № 9
- •Лабораторная работа № 10
- •Решение:
Изученные теоретические вопросы: Метод ортогонализации
Решение
системы уравнений с невырожденной
матрицей
сводится к нахождению такого вектора
,
который имеет последнюю координату,
равную единице, и ортогонален к линейно
независимым векторам
.
Применим
правило Шмидта для построения
ортонормированного базиса пространства,
натянутого на заданные линейно независимые
векторы. Обозначим через
ортогональный базис подпространства
,
а через
- ортонормированный в евклидовой метрике
базис того же подпространства. Так как
векторы
нормированы, то их можно представить в
виде
,
.
На
первом шаге метода положим
,
.Пусть
для некоторого шага
уже построен ортогональный базис
и ортонормированный базис
подпространства
.
Вектор
будем искать как линейную комбинацию
векторов
Условие
ортогональности вектора
к ортогональным векторам
или, что то же самое, к векторам
дает
.
Поэтому
.
Таким
образом, с помощью этого итерационного
процесса и соотношения строится
ортонормированная система векторов
.
Векторы
являются базисом подпространства
.
Следовательно, решение исходной системы
имеет вид
,
,
где
и
- соответственно
-я
и
я
координаты вектора
.
Решение:
void main(){
float k,y,q,r,t;
float A[5][5],K[5][5],S[5],B[5][5],X[5],C[5],U[5],V[5][5];
int i,j,j1,jj,n,p,l;
printf("Vvedite razmernost kvadratnoi matricx\n");
scanf("%d",&n);
printf("Vvedite matricix\n");
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
scanf("%f",&A[i][j]);
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
K[i][j]=A[i][j];
for(l=0;l<=n;l++)
{
for(i=0;i<=n;i++)
S[i]=K[l][i];
if(l==0)
{
for(i=0;i<=n;i++)
U[i]=S[i];
}
else
{
for(p=0;p<=n;p++)
U[p]=S[p];
for(j1=0;j1<l;j1++)
{
r=0;
for(jj=0;jj<=n;jj++)
r+=S[jj]*B[jj][j1];
C[j1]=-r;
for(jj=0;jj<=n;jj++)
U[jj]+=C[j1]*B[jj][j1];
}
}
r=0;
for(i=0;i<=n;i++)
r+=U[i]*U[i];
q=sqrt(r);
for(i=0;i<=n;i++)
B[i][l]=U[i]/q;
}
for(i=0;i<=n;i++)
B[i][n]=B[i][n]/B[n][n];
for(i=0;i<n;i++)
X[i]=-B[i][n];
printf("poluchennie korni\n");
for(i=0;i<n;i++)
printf("%.2f\n",X[i]);
getch();
}
Результат:
Введенные данные |
Полученный результат |
Проверка |
|
2.09 -0.57 0.28
|
2.7 -1.5 1.2
|
Лабораторная работа №8
Решить систему методом сопряженных градиентов
Изученные теоретические вопросы: Метод сопряженных градиентов
Метод
сопряженных градиентов предназначен
для решения систем линейных алгебраических
уравнений с симметричной положительно
определенной матрицей. Матрица
называется положительно определенной,
если скалярное произведение
для всех ненулевых векторов
.
Для того чтобы матрица
была положительно определенной необходимо
и достаточно, чтобы все ее главные миноры
были положительны.
Предположим,
что заданы два вектора
и
.
Последовательные приближения
к решению системы будем строить по
формулам
,
,
где
.
Решая
систему двух уравнений с двумя неизвестными
и
,
получаем
,
Выберем
начальные вектора
и
для метода сопряженных градиентов.
Пусть
- произвольный вектор. Построим вектор
,
где вектор
выбирается по направлению
так, чтобы векторы
и
были ортогональными, т.е.
.
Обозначим
.
Для
выполнения условия ортогональности
векторов
и
достаточно потребовать, чтобы
.
Можно
показать, что при таком выборе векторов
и
итерации
метода сопряженных градиентов обрываются
не позднее, чем на
-ом
шаге, давая точное решение системы (
- порядок системы).
Решение:
void main() {
int i,j,k=0,n;
float t,tt,t1,e,q,d,z;
float A[10][10];
float Y[10],B[10],X[10],R[10],P[10],U[10];
textcolor(12);
clrscr();
printf("Vvedite razmernost matrix\n");
scanf("%d",&n);
printf("Vvedite matrix\n");
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%f",&A[i][j]);
printf("Vvedite svobodnie chleni vektora B\n");
for(i=0; i<n; i++)
scanf("%f",&B[i]);
//Проверка матрицы на симметричность
for (i=0; i<n; i++)
for (j=0; j<n; j++)
if (A[i][j]!=A[j][i])
{
printf("\n Matrica ne yavlyaetsya simmetrichnoi!");
getch();
return;
}
X[0]=1;
for (i=1; i<n; i++)
X[i]=0;
i=0;
while (i<n)
{
t=0;
for (j=0; j<n; j++)
{
Y[i]=t+A[i][j]*X[j];
t=Y[i];
}
R[i]=Y[i]-B[i];
i++;
}
t=0;
for (i=0; i<n; i++)
t=t+R[i]*R[i];
i=0;
while (i<n)
{
tt=0;
for (j=0; j<n; j++)
{
Y[i]=tt+A[i][j]*R[j];
tt=Y[i];
}
i++;
}
e=0;
for (i=0; i<n; i++)
e=e+Y[i]*R[i];
q=-t/e;
for (i=0; i<n; i++)
P[i]=q*R[i];
for (i=0; i<n; i++)
X[i]=X[i]+P[i];
k=1;
while (k<n)
{
i=0;
while (i<n)
{
Y[i]=0;
for (j=0; j<n; j++)
Y[i]=Y[i]+A[i][j]*X[j];
R[i]=Y[i]-B[i];
i++;
}
i=0;
while (i<n)
{
t=0;
for (j=0; j<n; j++)
{
Y[i]=t+A[i][j]*R[j];
t=Y[i];
}
i++;
}
i=0;
while (i<n)
{
t=0;
for (j=0; j<n; j++)
{
U[i]=t+A[i][j]*P[j];
t=U[i];
}
i++;
}
t=0;
for (i=0; i<n; i++)
t=t+R[i]*R[i];
tt=0;
for (i=0; i<n; i++)
tt=tt+R[i]*P[i];
t1=0;
for (i=0; i<n; i++)
t1=t1+Y[i]*P[i];
e=0;
for (i=0; i<n; i++)
e=e+Y[i]*R[i];
d=0;
for (i=0; i<n; i++)
d=d+U[i]*P[i];
z=(t*t1-tt*e)/(d*e-t1*t1);
q=(tt*tt-t*d)/(d*e-t1*t1);
for (i=0; i<n; i++)
{
P[i]=z*P[i]+q*R[i];
X[i]=X[i]+P[i];
}
k++;
}
printf("\nkorni\n");
for (i=0; i<n; i++)
printf("%.2f\n",X[i]);
getch();
}
Результат:
Введенные данные |
Полученный результат |
Проверка |
|
2.09 -0.57 0.28
|
2.7 -1.5 1.2
|