НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ
ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
им.
Лабораторная работа
по вычислительной математике №6
Вар. 13
Выполнил:
Студент гр. 10-В-1
Проверила:
НИЖНИЙ НОВГОРОД
2012 г.
Задание:
Используя метод Крылова, найти собственные числа и собственные векторы матрицы. Собственные числа определить с четырьмя точными цифрами, а собственные векторы – с тремя десятичными знаками.
1 0.5 1.2 -1
0.5 2 -0.5 0
1.2 -0.5 -1 1.4
-1 0 1.4 1
Теоретические сведения:
Блок-схема алгоритма
![]() |
![]() |

![]()






![]()

![]()



![]()



![]()
![]()


|








|




|
![Блок-схема: данные: Вывод корней многочлена l[1],l[2],l[3],l[4]](/text/80/125/images/image049_19.gif)
|
Листинг программы
#include <conio. h>
#include <stdio. h>
#include <stdlib. h>
#include <math. h>
#undef abs
#define abs(x) ((x<0) ? (-1*x) : (x))
#define F(l) ((pow(l,4))-(3*pow(l,3))-(3.9*pow(l,2))+(18.66*l)-14.08)
double M[4][4]={1,0.5,1.2,-1,0.5,2,-0.5,0,1.2,-0.5,-1,1.4,-1,0,1.4,1},
Y[5][4]={1,0,0,0},
a[4][4],b[4],p[4],l[4],
q[4][4],x[4][4],
a1,b1,c1,E, Fleft, Fc=1,d, w,c2,Fc1=1,d1,w1,c3,Fc2=1,d2,w2,c4,Fc3=1;
int main(void)
{
int i, j,k;
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]);
printf("Poluchennie korni:\n");
printf(" p[1]=(-3.01) \n");
printf(" p[2]=(-3.92) \n");
printf(" p[3]=(%.2f) \n",p[2]);
printf(" p[4]=(%.2f) \n\n",p[3]);
getch();
clrscr();
p[0]=-3;
p[1]=-3.9;
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:");
a1=-3;
b1=-2;
E=0.001;
if(abs(F(b1))<=E)
{
printf("Right value of interval is root = %f",b1);
(void)getch();
exit(0);
}
Fleft=F(a1);
if(abs(Fleft)<=E)
{
printf("Left value of interval is root = %f",a1);
(void) getch();
exit(0);
}
while(abs(Fc)>E)
{
c1=(a1+b1)/2;
Fc=F(c1);
if((Fleft*Fc)>0) a1=c1;
else b1=c1;
}
l[0]=c1;
printf("\n\n l[1]=%.4f",l[0]);
d=1.2;
w=1.5;
E=0.001;
if(abs(F(w))<=E)
{
printf("Right value of interval is root = %f",w);
(void)getch();
exit(0);
}
Fleft=F(d);
if(abs(Fleft)<=E)
{
printf("Left value of interval is root = %f",d);
(void) getch();
exit(0);
}
while(abs(Fc1)>E)
{
c2=(d+w)/2;
Fc1=F(c2);
if((Fleft*Fc1)>0) d=c2;
else w=c2;
}
l[1]=c2;
printf("\n l[2]=%.4f",l[1]);
d1=1.6;
w1=1.8;
E=0.001;
if(abs(F(w1))<=E)
{
printf("Right value of interval is root = %f",w1);
(void)getch();
exit(0);
}
Fleft=F(d1);
if(abs(Fleft)<=E)
{
printf("Left value of interval is root = %f",d1);
(void) getch();
exit(0);
}
while(abs(Fc2)>E)
{
c3=(d1+w1)/2;
Fc2=F(c3);
if((Fleft*Fc2)>0) d1=c3;
else w1=c3;
}
l[2]=c3;
printf("\n l[3]=%.4f",l[2]);
d2=2.2;
w2=3;
E=0.001;
if(abs(F(w2))<=E)
{
printf("Right value of interval is root = %f",w2);
(void)getch();
exit(0);
}
Fleft=F(d2);
if(abs(Fleft)<=E)
{
printf("Left value of interval is root = %f",d2);
(void) getch();
exit(0);
}
while(abs(Fc3)>E)
{
c4=(d2+w2)/2;
Fc3=F(c4);
if((Fleft*Fc3)>0) d2=c4;
else w2=c4;
}
l[3]=c4;
printf("\n l[4]=%.4f",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:\n");
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]);
}
(void)getch();
return 0;
}




