Сообщество IT-специалистов
Ответы на любые вопросы об IT
Профессиональное развитие в IT
Удаленная работа для IT-специалистов
#include <clocale> #include <iostream> #include <cmath> class mGauss { private: int IM, h, sm; double MaxA, Sum; double **chA; double *chB; public: mGauss(double **A, double *B, int m) { sm=m; chB = new double[m]; chA = new double *[m]; for (int i=0; i<m; i++) { chA[i]=new double [m]; } for (int r = 0; r<m; r++) { for (int c = 0; c<m; c++) { chA[r][c] = A[r][c]; } } for (int r = 0;r<m;r++) { chB[r]=B[r]; } } int ved(int i) // функция определения ведущего уравнения { int g,h,k; double MaxA, temp; MaxA=0; h = -1; for (k = i; k < sm; k++) { if (fabs(chA[k][i]) >fabs(MaxA)) { MaxA = chA[k][i]; h = k; } if (h == -1) { std::cout <<" Матрица вырождена \n "; } return h; } } void perestanovka(int IM, int i) // функция перестановки уравнений системы { double temp; if (IM != i) { for (int j = i; j < sm; j++) { temp = chA[i][j] ; chA[i][j] = chA[IM][j]; chA[IM][j] = temp; } temp = chB[i]; chB[i] = chB[IM]; chB[IM] = temp; } } void rkoef(int i, int l) // функция пересчета коэффициентов { float Q; Q=chA[l][i] / chA[i][i] ; chA[l][i] = 0; for (int j=i+1; j < sm; j++) chA[l][j] = chA[l][j] - Q*chA[i][j]; chB[l] = chB[l] - Q*chB[i]; } void prgauss() // функция прямого хода метода Гаусса { int i, l, IM; float Q; for (i=0;i<sm;i++) { IM = ved(i); perestanovka(IM, i); for (l=i+1;l<sm;l++) rkoef(i,l); } } void obgauss(double* C) // функция обратного хода метода Гаусса { int k, j; C[sm-1] = chB[sm-1] / chA[sm-1][sm-1]; for(k=sm - 2; k>=0; k--) { Sum = chB[k]; for (j=k+1; j<sm; j++) Sum = Sum - chA[k][j]*C[j]; C[k] = Sum / chA[k][k]; } } ~mGauss() { delete [] chB; for (int i=0; i<sm; i++) { delete [] chA[i]; } delete [] chA; chA=nullptr; } }; void vvod (double *ax, double *ay, int fxn, int fyn); void vivodxy (double *ax, double *ay, int fxn, int fyn); void vivod (int nn,double *array); void vivodA(int mm, double **arrA); double FI0(); double FI1(double *ax, int i); double FI2(double *ax, int i); float FI(double *ax1, int i, int k); void koeff (double **Ak, double *ax, double *Bk, double *ay, int mm, int nn); void Y1_kr_d(double *Y1, double *C, double *D, int nn, double *ax, double *ay); int main() { int xn, yn, k, l, m ,n; double x, y; std::cout << "Введите количество x, которое вы хотите ввести: "; std::cin >> xn; std::cout << '\n'; std::cout << "Введите количество y, которое вы хотите ввести: "; std::cin >> yn; std::cout << '\n'; double *arrx = new double [xn]; double *arry = new double [yn]; std::cout<<"m = "; std::cin >> m; std::cout<<"n = "; std::cin >> n; double *B=new double[m]; double **A=new double* [m]; for (int i=0; i<m; i++) { A[i]=new double [n]; } vvod(arrx,arry,xn,yn); vivodxy(arrx,arry,xn,yn); koeff(A, arrx, B, arry, m, n); delete [] arrx; delete [] arry; for (int i=0; i<m; i++) { delete [] A[i]; } delete [] A; A=nullptr; delete [] B; double *Y1 = new double [n]; double *D = new double [n]; double *C= new double [n]; mGauss Obj(A, B, m); Obj.prgauss(); Obj.obgauss(C); Y1_kr_d(Y1,C,D,n,arrx,arry); return 0; } void vvod (double *ax, double *ay, int fxn, int fyn) { std::cout << "\nВведите значения чисел массива x: "; for (int i = 0; i < fxn; i++) { std::cin >> ax[i]; } std::cout << "\nВведите значения чисел массива y: "; for (int i = 0; i < fyn; i++) { std::cin >> ay[i]; } std::cout << "\n"; } void vivodxy (double *ax, double *ay, int fxn, int fyn) { std::cout << "Массив x: "; for (int i = 0; i < fxn; i++) { std::cout << ax[i] <<" "; } std::cout << "\n"; std::cout << "Массив y: "; for (int i = 0; i < fyn; i++) { std::cout << ay[i] <<" "; } std::cout << "\n"; } void vivod (int nn,double *array) { for (int i = 0; i < nn; i++) { std::cout << array[i] <<" "; } std::cout << "\n"; } void vivodd (int mm, double **arr) { int k, l; for (k = 0; k < mm; k++) { for (l = 0; l < mm; l++) { std::cout << arr[k][l] << " "; } std::cout << "\n"; } } double FI0() { return 1; } double FI1(double *ax, int i) { return ax[i]; } double FI2(double *ax, int i) { return pow(ax[i],3); } float FI(double *ax1, int i, int k) { if (k == 0) return FI0(); if (k == 1) return FI1(ax1, i); if (k==2) return FI2(ax1, i); } void koeff (double **Ak, double *ax, double *Bk, double *ay, int mm, int nn) { int k,l; std::cout<<"Матрица А: "<<std::endl; for (k = 0; k < mm; k++) { for (l = 0; l < mm; l++) { Ak[k][l]=0; for (int i = 0; i < nn; i++) { Ak[k][l]=Ak[k][l]+FI(ax, i, k) * FI(ax, i, l); } } } vivodd (mm, Ak); std::cout << "Вектор столбец: "; for (k = 0; k < mm; k++) { Bk[k]=0; for (int i = 0; i < nn; i++) { Bk[k]=Bk[k]+ay[i]*FI(ax, i, k); } } vivod(k, Bk); } void Y1_kr_d(double *Y1, double *C, double *D, int nn, double *ax, double *ay) { double kr=0,k=0,Dmax; int IM=0; for (int i=0; i<nn; i++) { Y1[i]=C[i]*FI(ax, i, k)+C[i+1]*FI(ax, i, k+1)+C[i+2]*FI(ax, i, k+2); D[i]=ay[i]-Y1[i]; kr=kr+D[i]*D[i]; std::cout << "Y1 = "; vivod(i,Y1); std::cout<< "\n"; vivod(i, D); std::cout<< "\n"; std::cout << "kr = " << kr << "\n"; } Dmax=D[0]; for (int i=0; i<nn; i++) { if (fabs(D[i])>Dmax) { Dmax=D[i]; IM=i; std::cout << "Dmax= "<<Dmax<<"IM = "<<IM; } std::cout<< "\n"; } }