Написал прогу решение систем линейных алгебоаических уравнений методом Халецкого. Алгоритм вроде правильный, но есть проблемы в написании кода. Помогите отладить.... Ниже приведен листинг:
| Код | class slu { double *a, *b, *x; int size, key; public: // Конструктор slu (){ size=0; a=0;
b=0; x=0; } // Деструктор ~slu(){ if (size!=0){ delete [] a; delete [] x; } } void input(int M); // Ввод системы void syst(); // Поиск решения void print_x(); // Вывод корней системы };
|
Реализация методов:
| Код |
#include "stdafx.h" #include <iostream> #include "slu.h" #include <math.h> using namespace std;
void slu::input(int M) { int i,j,k,v, j_max; double d,r, max; size=M; double *b; //Ввод правой части b = new double[M]; for(i=0;i<M;i++){ cout << "b [ " << i << " ] : "; cin >> b [i]; }
double *a; //Ввод левой части a = new double [M*(M+1)]; for(i=0;i<M;i++){ for(j=0;j<M;j++){ cout << "a [" << i << "] [ " << j << "] : "; cin >> a[i*(M+1)+j]; } }
//Формирование матрицы,содеражей коэффициенты системы for(i=0;i<M;i++) a[i*(M+1)+M]=b[i]; delete [] b; }
void slu::syst() { int i,j,k,v,j_max,M; double d,r,max; M=size; key=1;
for (i=0; i<=M; i++){ max=a[i*(M+1)+i]; j_max=i; for (j=0; j<=M; j++){ if (fabs(a[j*(M+1)+i])>fabs(max)){ max=a[j*(M+1)+i]; j_max=j; } } }
if (j_max!=i){ for (j=0; j<M; j++){ r=a[j_max*(M+1)+j]; a[j_max*(M+1)+j]=a[i*(M+1)+j]; a[i*(M+1)+j]=r; } }
for(i=0; i<M; i++){ if (a[i*(M+1)+i]==0){ key=0; return; } }
for(i=0;i<M;i++){ for(j=i+1;j<M;j++){ v=0; d=a[i*(M+1)+0]/a[i*(M+1)+j]; for(k=1;k<M+1;k++){ if (a[i*(M+1)+k]!=d*a[j*(M+1)+k]){ v=1; key=key*v; } } } } if (key==0){ return; }
double *bb; bb = new double [M*M]; double *c; c = new double [M*M]; double s; //Вычисление 1-ого столбца матрицы b(по формуле(3)1 части) for ( i=0; i<M; i++ ) bb[i*M+0] = a[i*(M+1)+0]; //Формирование 1-ой строки матрицы c(по формуле(4) 1 части) for ( i=0; i<=M; i++ ) c[0*M+i] = a[0*(M+1)+i] / bb [0*M+0]; //Формирование остальных столбцов матрицы b и строк матрицы c (по формулам (3) и (4) 2 части) for ( j = 1; j <M;j++) { for ( i=j; i<M; i++ ) { s = 0; for ( k=0;k<=j+(-1); k++) s = s + bb[i*M+k]*c[k*M+j]; bb[i*M+j] = a[i*(M+1)+j]- s; } ; for ( i=j; i<=M; i++ ) { s = 0; for ( k =0; k<=j +(-1); k ++) s = s + bb[j*M+k] * c[k*M+i]; c[j*M+i] = ( a[j*(M+1)+i] +(-s) ) / bb[j*M+j]; } }; //Вычисление вектора y (по формуле(6)) double *y; y = new double [M];
for (i=0;i<M;i++) { s=0; for(k=0;k<=i-1;k++) s=s+bb[i*M+k]*y[k]; y[i]=1/bb[i*M+i]*(a[i*(M+1)+M]-s); } //Вычисление вектора x (по формуле (7)) double *x; x = new double [M];
for (i=M-1; i>=0 ;i--) { s=0; for (k=i+1;k<M;k++) s=s+c[i*M+k]*x[k]; x[i]=y[i]-s; } }
void slu::print_x() //Вывод решения системы { if (key==0){ cout << "Net resh"; } else{ int i,M; M=size; for(i=0;i<M;i++) cout <<"x [ " << i << " ] : " << x[i]<< endl; } }
|
Головная программа:
| Код | // SLU.cpp //
#include "stdafx.h" #include "slu.h" #include <conio.h> #include <iostream> using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { int M; cout << "Input size of system: "; cin >> M; slu n;
n.input(M); cout << "\n"; getch(); n.syst(); cout << "\n"; n.print_x(); getch(); return 0; }
|
|