НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ

ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

им.

Лабораторная работа

по вычислительной математике №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

Теоретические сведения:

Блок-схема алгоритма

 

Блок-схема: данные: Вывод векторов

Y(0), Y(1), Y(2), Y(3), Y(4)
 

 

 

Блок-схема: знак завершения: КонецБлок-схема: данные: Вывод собственных векторов X1, X2, X3, X4

x[i][j]+=q[k][i]*Y[3-k][j]

 
Блок-схема: подготовка: k=0;k<4;k++



Блок-схема: подготовка: j=0;j<4;j++



Блок-схема: подготовка: i=0;i<4;i++



Блок-схема: данные: Вывод q[i][j]

q[i][j]=l[j]*q[i-1][j]+p[i]

 
Блок-схема: подготовка: j=0;j<4;j++



Блок-схема: подготовка: i=1;i<4;i++



Блок-схема: данные: Вывод q[0][i]

q[0][i]=1

 
Блок-схема: подготовка: i=0;i<4;i++Блок-схема: данные: Вывод корней многочлена l[1],l[2],l[3],l[4]

Решаем характеристический многочлен матрицы

F(l)= l4 -3*l3 -3.9*l2 + 18.66*l -14.08

методом деления отрезка пополам

 
Овал: 1

Листинг программы

#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;

}