//--------------------------------------------------------------------------- // Klasa obsługująca macierze NxN #include #include #include //#include #include #pragma hdrstop #include "Mattrix.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- //---------------------------------------------------------- __fastcall HMattrix::HMattrix( int dim) { try { // TEST FOR EXCEPTIONS. aM = new long double* [dim]; // STEP 1: SET UP THE ROWS. for (int j = 0; j < dim; j++) aM[j] = new long double[dim]; // STEP 2: SET UP THE COLUMNS } catch (...) { // ENTER THIS BLOCK ONLY IF xalloc IS THROWN. // YOU COULD REQUEST OTHER ACTIONS BEFORE TERMINATING MessageBox(0, L"Brak pamięci (alokacja dla macierzy). Bye ...", L"Błąd!", MB_OK); exit(-1); } for (int i = 0; i < dim; i++) for (int j = 0; j < dim; j++) aM[i][j] = (long double)0; nDim=dim; } //---------------------------------------------------------- __fastcall HMattrix::~HMattrix() { if (aM){ for (int i = 0; i < nDim; i++) delete[] aM[i]; // STEP 1: DELETE THE COLUMNS delete[] aM; // STEP 2: DELETE THE ROWS } } //---------------------------------------------------------- void __fastcall HMattrix::StoreColumn(long double *aCol, int col) { for (int j = 0; j < nDim; j++) aM[col][j] = aCol[j]; } //---------------------------------------------------------- void __fastcall HMattrix::StoreRow(long double *aRow, int row) { for (int i = 0; i < nDim; i++) aM[i][row] = aRow[i]; } //---------------------------------------------------------- void __fastcall HMattrix::StoreElement(long double val, int i, int j) // i=row, j=col { aM[i][j]= val; } //---------------------------------------------------------- void __fastcall HMattrix::StoreElement(long double *val, int i, int j) // i=row, j=col { aM[i][j]= *val; } //---------------------------------------------------------- void __fastcall HMattrix::StoreMattrix(HMattrix *M) { int dim=nDim; if (M->nDimnDim; for(int i=0; iM(i,j); } //---------------------------------------------------------- long double ** __fastcall HMattrix::GetM() { return aM; } //---------------------------------------------------------- long double __fastcall HMattrix::M(int i, int j) { long double val=0; if (iDet(); long double nDetN; // return 1; if (nDet==(long double)0) return 0; HMattrix *aMn; for (int i=0; iStoreMattrix(M); aMn->XchCol(i, aB); nDetN=aMn->Det(); result[nDim-i-1]=nDetN/nDet; delete aMn; } return 1; } //---------------------------------------------------------- //------------------------------------------------------ // wartość wielomianu 3-stopnia dla punktu x double __fastcall Polynom3Value(double x, long double *Cn) { return(x*x*x*Cn[3]+x*x*Cn[2]+x*Cn[1]+Cn[0]); } //------------------------------------------------------ // wielomian stopnia trzeciego bool __fastcall Polynom3(ePoint *aData, int count, long double *result) { long double nX6 = eSup(aData,count,6); long double nX5 = eSup(aData,count,5); long double nX4 = eSup(aData,count,4); long double nX3 = eSup(aData,count,3); long double nX2 = eSup(aData,count,2); long double nX1 = eSup(aData,count,1); long double nX3Y= eSup(aData,count,3,1); long double nX2Y= eSup(aData,count,2,1); long double nXY = eSup(aData,count,1,1); long double nY1 = eSup(aData,count,0,1); // macierz dla m.n.kw. HMattrix *aM = new HMattrix(4); long double r0[] = {nX6, nX5, nX4, nX3}; long double r1[] = {nX5, nX4, nX3, nX2}; long double r2[] = {nX4, nX3, nX2, nX1}; long double r3[] = {nX3, nX2, nX1, count}; aM->StoreRow(r0,0); aM->StoreRow(r1,1); aM->StoreRow(r2,2); aM->StoreRow(r3,3); long double aB[]={nX3Y, nX2Y, nXY, nY1}; // bcd aCN[4]={bcd(0),bcd(0),bcd(0),bcd(0)};==result bool retval=equation(aM, aB,4, result ); delete aM; return(retval); } //---------------------------------------------------------- // ax^2+b bool __fastcall Polynom2ab(ePoint *aData, int count, long double *result) { long double nX3 = eSup(aData,count,3); long double nX2 = eSup(aData,count,2); long double nX1 = eSup(aData,count,1); long double nXY = eSup(aData,count,1,1); long double nY1 = eSup(aData,count,0,1); // macierz dla m.n.kw. HMattrix *aM = new HMattrix(2); long double r0[] = { nX3, nX1}; long double r1[] = { nX2, count}; // long double r2[] = // long double r3[] = aM->StoreRow(r0,0); aM->StoreRow(r1,1); // aM->StoreRow(r2,2); // aM->StoreRow(r3,3); // long double aB[]={nX3Y, nX2Y, nXY, nY1}; long double aB[]={ nXY, nY1}; bool retval=equation(aM, aB,2, result ); delete aM; return(retval); } // ax^2+bx+c bool __fastcall Polynom2abc(ePoint *aData, int count, long double *result) { long double nX4 = eSup(aData,count,4); long double nX3 = eSup(aData,count,3); long double nX2 = eSup(aData,count,2); long double nX1 = eSup(aData,count,1); long double nXY = eSup(aData,count,1,1); long double nY1 = eSup(aData,count,0,1); long double nX2Y= eSup(aData,count,2,1); // macierz dla m.n.kw. HMattrix *aM = new HMattrix(3); long double r0[] = {nX4, nX3, nX2}; long double r1[] = {nX3, nX2, nX1}; long double r2[] = {nX2, nX1, count}; // long double r3[] = aM->StoreRow(r0,0); aM->StoreRow(r1,1); aM->StoreRow(r2,2); // aM->StoreRow(r3,3); // long double aB[]={nX3Y, nX2Y, nXY, nY1}; long double aB[]={ nX2Y, nXY, nY1}; bool retval=equation(aM, aB,3, result ); delete aM; return(retval); } //---------------------------------------------------------- //------------------------------------------------------ // trochę matematyki long double __fastcall eSup(ePoint *aData, int count, int nI, int nJ) { long double nSuma=0; for (int i = 0; ix=(long double) x; dt->y=(long double) y; } //------------------------------------------------------