Нужно найти определитель и обратную матрицу. Приведением к диагональному/треугольному виду. Алгоритм ясен мне как белый день, но с реализацией не всё хорошо (всё не хорошо, если быть точнее). Помогите пожалуйста на предмет обнаружения ошибок в коде, а то считает фигню какую-то
| Код | double det(double ** A, int N); double ** obr(double ** A, int N);
void main() { int N; cout<<"Vvedite N\n"; cin>>N; cout<<"Vvedite matricu A\n"; double ** a=new double*[N]; for (int i=0; i<N; i++) { a[i]=new double; for (int j=0; j<N; j++) cin>>a[i][j]; } cout<<endl; cout<<det(a, N)<<endl; obr(a, N); }
double det(double ** A, int N) { double ** A2=new double * [N]; for (int i3=0; i3<N; i3++) { A2[i3]=new double; for (int j3=0; j3<N; j3++) A2[i3][j3]=A[i3][j3]; } double razr; double r=1; for (int k=0; k<N-1 ; k++) { for (int i=0; i<N; i++) { for (int j=0; j<N; j++) { if (A[k][k]==0) { r=-r; for (int j1=0; j1<N; j1++) { A[k][j1]=A2[k+1][j1]; A[k+1][j1]=A2[k][j1]; } } razr=A[k][k]; if (i==k) { A2[i][j]=A[i][j]/razr; } else { A2[i][j]=A[i][j]-A[i][k]*A[k][i]/razr; } } } r=r*razr; for (int i2=0; i2<N; i2++) {for (int j2=0; j2<N; j2++) {A[i2][j2]=A2[i2][j2]; cout<<A[i2][j2]<<" ";} cout<<endl;}cout<<endl; } delete A2; double det; det=r*A[N-1][N-1]; return det; }
double ** obr(double ** A, int N) { double ** MB1=new double*[N]; double ** MB2=new double*[N]; for (int i0=0;i0<N;i0++) { MB1[i0]=new double; MB2[i0]=new double; for (int j0=0;j0<2*N;j0++) { if (j0<N) { MB1[i0][j0]=A[i0][j0]; MB2[i0][j0]=A[i0][j0]; } else { if (i0==j0-N) { MB1[i0][j0]=1; MB2[i0][j0]=1; } else { MB1[i0][j0]=0; MB2[i0][j0]=0; } } } } double razr; for (int k=0; k<N; k++) { razr=MB1[k][k]; for (int a=k; a<N; a++) { if (razr==0) { for (int b1=k; b1<N-2; b1++) for (int j2=0; j2<2*N; j2++) MB1[b1][j2]=MB1[b1][j2]-MB1[b1+1][j2]; } razr=MB1[k][k]; }
for (int i=0;i<N; i++) { for (int j=0;j<2*N; j++) { if (i==k) MB2[i][j]=MB1[i][j]/razr; else MB2[i][j]=MB1[i][j]-MB1[i][k]*MB1[k][j]/razr; } } for (int i1=0; i1<N; i1++) { for (int j1=0; j1<2*N; j1++) { MB1[i1][j1]=MB2[i1][j1]; cout<<MB1[i1][j1]<<" "; } cout<<endl; } cout<<endl; }
for (int i3=0;i3<N;i3++) for (int j3=0;j3<N;j3++) A[i3][j3]=MB1[i3][j3+N]; return A; }
|
|