НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. Р.Е.Алексеева Лабораторная работа по вычислительной математике №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; }