vm_Lab7x

advertisement
НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ
ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
им. Р.Е.Алексеева
Лабораторная работа
по вычислительной математике №7
Вар. 13
Выполнил:
Студент гр. 10-В-1
Сидоренко О.О.
Проверила:
Чернова Т.С.
НИЖНИЙ НОВГОРОД
2012 г.
Задание:
Используя метод Крылова, найти собственные числа и собственные векторы
матрицы. Собственные числа определить с четырьмя точными цифрами, а
собственные векторы – с тремя десятичными знаками.
1,6
1
1,4
1
1
1
0,5
2
1,4
0,5
2
1,2
1
2
1,2
0,5
Теоретические сведения:
Блок-схема алгоритма
Начало
Вывод векторов
Y(0), Y(1), Y(2), Y(3), Y(4)
Вывод системы уравнений, полученной
из векторов Y(0), Y(1), Y(2), Y(3), Y(4)
да
нет
aii=0
Перестановка уравнений
For ( int k=(i+1),k<n,k++)
For ( int i=n,i>n,i--)
c=aki /aii , aki =0
For ( int j=(i+1),j<n,j++)
s=0
akj =akj - c*aij
For ( int j=(i+1),j<n,j++)
bk = bk -c*bi
s= s + aij*xj
pi= (bi -s)/aii
Вывод решений системы
уравнений p[1],p[2],p[3],p[4]
1
1
Решаем характеристический многочлен матрицы
F(l)= l4 -3*l3 -3.9*l2 + 18.66*l -14.08
методом деления отрезка пополам
Вывод корней многочлена
l[1],l[2],l[3],l[4]
i=0;i<4;i++
q[0][i]=1
Вывод q[0][i]
i=1;i<4;i++
j=0;j<4;j++
q[i][j]=l[j]*q[i-1][j]+p[i]
Вывод q[i][j]
i=0;i<4;i++
j=0;j<4;j++
k=0;k<4;k++
x[i][j]+=q[k][i]*Y[3-k][j]
Вывод собственных
векторов X1, X2, X3, X4
Конец
Листинг программы
#include
#include
#include
#include
<conio.h>
<stdio.h>
<stdlib.h>
<math.h>
float
M[4][4]={1.6,1,1.4,1,1,1,0.5,2,1.4,0.5,2,1
.2,1,2,1.2,0.5},
Y[5][4]={1,0,0,0},
a[4][4],b[4],p[4],E=0.0001,l[4],
q[4][4],x[4][4];
int main(void)
{
int i,j,k;
#define f(x)
((pow(x,4))+(p[0]*pow(x,3))+(p[1]*pow(x,2)
)+(p[2]*x)+p[3])
float m,n,o;
E=0.0001;
m=-2;
n=-1;
clrscr();
for(k=0;k<5;k++)
{for(i=0;i<4;i++)
{for(j=0;j<4;j++)
{Y[k+1][i]+=M[i][j]*Y[k][j];
}
printf("Y[%d][%d]=%f\n",k,i,Y[k][i]);
}
}
for(k=0;k<5;k++)
printf("\nY%d=|%.3f|\n
|%.3f|\n
|%.3f|\n
|%.3f|",k,Y[k][0],Y[k][1],Y[k][2],Y[k][3])
;
for(i=0;i<4;i++)
{
b[i]=-(Y[4][i]);
for(j=0;j<4;j++)
a[i][j]=Y[3-j][i];
}
getch();
clrscr();
printf("reshim sistemu:\n");
printf("
%.3fp1+%.3fp2+%.3fp3+%.3fp4=%.3f\n",a[0][0
],a[0][1],a[0][2],a[0][3],b[0]);
printf("
%.3fp1+%.3fp2+%.3fp3+%.3fp4=%.3f\n",a[1][0
],a[1][1],a[1][2],a[1][3],b[1]);
printf("
%.3fp1+%.3fp2+%.3fp3+%.3fp4=%.3f\n",a[2][0
],a[2][1],a[2][2],a[2][3],b[2]);
printf("
%.3fp1+%.3fp2+%.3fp3+%.3fp4=%.3f\n",a[3][0
],a[3][1],a[3][2],a[3][3],b[3]);
float c,s=0;
for(k=0;k<3;k++)
for(i=k+1;i<4;i++)
{
c=a[i][k]/a[k][k];
a[i][k]=0;
for(j=k+1;j<4;j++)
a[i][j]=a[i][j]-c*a[k][j];
b[i]=b[i]-c*b[k];
}
p[3]=b[3]/a[3][3];
for(i=2;i>=0;i--)
{
for(j=i+1;j<=3;j++)
s=s+a[i][j]*p[j];
p[i]=(b[i]-s)/a[i][i];
}
printf("\nMetod Gausa\n");
printf("Privodim matricu koef. k treug.
vidu:\n");
printf(" (%.4f) (%.4f) (%.4f) (%.4f) |
(%.4f)\n",a[0][0],a[0][1],a[0][2],a[0][3],
b[0]);
printf(" (%.4f) (%.4f) (%.4f) (%.4f) |
(%.4f)\n",a[1][0],a[1][1],a[1][2],a[1][3],
b[1]);
printf(" (%.4f) (%.4f) (%.4f) (%.4f) |
(%.4f)\n",a[2][0],a[2][1],a[2][2],a[2][3],
b[2]);
printf(" (%.4f) (%.4f) (%.4f) (%.4f) |
(%.4f)\n",a[3][0],a[3][1],a[3][2],a[3][3],
b[3]);
}
if (fabs(f(n))<=E)
{
printf("n=%f koren",n);
(void) getch();
exit(0);
}
while((fabs(f(0)))>E)
{
o=(m+n)/2;
if(((f(m))*f(o))>0)
m=o;
else n=o;
}
l[0]=o;
printf("\nl[1]=%.3f",l[0]);
o=-3;
m=-0.5;
n=0.5;
while((fabs(f(o)))>E)
{
o=(m+n)/2;
if(((f(m))*f(o))>0)
m=o;
else n=o;
}
l[1]=o;
printf("\nl[2]=%.3f",l[1]);
o=-3;
m=0.5;
n=1.5;
while((fabs(f(o)))>E)
{
o=(m+n)/2;
if(((f(m))*f(o))>0)
m=o;
else n=o;
printf("Poluchennie korni:\n");
printf(" p[1]=(%.4f) \n",p[0]);
printf(" p[2]=(%.4f) \n",p[1]);
printf(" p[3]=(%.4f) \n",p[2]);
printf(" p[4]=(%.4f) \n\n",p[3]);
getch();
clrscr();
printf("xarakteristicheskiy mnogochlen
matrici:");
printf("\n\nD(l)=pow(l,4)+(%.3f*pow(l,3))+
(%.3f*pow(l,2))+(%.3f*l)+(%.3f)",p[0],p[1]
,p[2],p[3]);
printf("\n\nreshim
uravnenie:\npow(l,4)+(%.3f*pow(l,3))+(%.3f
*pow(l,2))+(%.3f*l)+(%.3f)=0\n",p[0],p[1],
p[2],p[3]);
printf("\nkorni:");
if (fabs(f(m))<=E)
{
printf("m=%f koren",m);
(void) getch();
exit(0);
}
l[2]=o;
printf("\nl[3]=%.3f",l[2]);
o=-3;
m=4;
n=5.5;
while((fabs(f(o)))>E)
{
o=(m+n)/2;
if(((f(m))*f(o))>0)
m=o;
else n=o;
}
l[3]=o;
printf("\nl[4]=%.3f",l[3]);
getch();
clrscr();
for(i=0;i<4;i++)
{
q[0][i]=1;
printf("\nq[0][%d]=%.3f",i+1,q[0][i]);
}
for(i=1;i<4;i++)
{for(j=0;j<4;j++)
{q[i][j]=l[j]*q[i-1][j]+p[i];
printf("\nq[%d][%d]=%.3f",i,j+1,q[i][j]);
}
}
getch();
clrscr();
printf("sobstvennie vektora matrici:");
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
{for(k=0;k<4;k++)
x[i][j]+=q[k][i]*Y[3-k][j];
}
printf("\nX%d=|%.3f|\n
|%.3f|\n
|%.3f|\n
|%.3f|",i+1,x[i][0],x[i][1],x[i][2],x[i][3
]);
}
getch();
return 0;
}
Download