Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "funcs.h"
- #include <bits/stdc++.h>
- #include <math.h>
- #include <stdio.h>
- using namespace std;
- double skpr(double m[], double p[], int n){
- double sum = 0;
- for (int i = 0; i < n; i++) sum += m[i] * p[i];
- return sum;
- }
- void mult(double **A, double *b, double *c, int size){
- for (int i = 0; i < size; i++) {
- c[i] = skpr(A[i], b, size);
- }
- }
- void sol(double **A, double *x, double *b, int n){
- int j=0; //счетчик шагов
- double err; //погрешность
- cout << "Start Gauss " << endl;
- double **AA = array_generator(n,n);
- for (int j=0; j < n; j++) for (int i=0; i < n; i++) AA[j][i]=A[j][i]; //дубликат таблицы
- double *bb = array_generator(n);
- for (int j=0; j < n; j++) bb[j]=b[j]; //дубликат таблицы
- double kf = 0;
- for (int j = 0; j < n - 1; j++){
- for (int i = j + 1; i < n; i++){
- kf = A[i][j] / A[j][j];
- for (int k = j; k < n; k++) {
- A[i][k] -= A[j][k] * kf;
- }
- b[i] -= b[j] * kf;
- }
- if (n<10){
- cout << "Step: " << j+1 << endl;
- vivod(A,x,b,n,1);
- cout << endl;
- }
- }
- double sum = 0;
- for (int i = n - 1; i >= 0; i--){
- sum = 0;
- for (j = i + 1; j < n; j++) {
- sum += A[i][j] * x[j];
- }
- x[i] = (b[i] - sum) / A[i][i];
- }
- // cout << "Step: " << j << endl; //шаги
- // vivod(A,b,x,n,1);
- // cout << endl;
- cout << "Result:" <<endl;
- vivod(AA,bb,x,n,0);
- err = check(A,b,x,n); //считаем погрешность
- printf_s("Err: %14e", err);
- cout << endl;
- array_destroyer(AA,n);
- }
- double check(double **A, double *b, double *x, int size){
- double *err;
- err = new double[size];
- mult(A, x, err, size);
- for (int i = 0; i < size; i++){
- err[i] -= b[i];
- }
- double maxerr = 0;
- for (int i = 0; i < size; i++){
- if (maxerr < fabs(err[i])) maxerr = fabs(err[i]);
- }
- delete[]err;
- return maxerr;
- }
- void vivod(double **A, double *b, double *x, int n, int c){ //Вывод матрицы (c-вывод Х или значения х)
- for (int j=0; j < n; j++){
- for (int i=0; i < n; i++){
- if (c==1) cout << setw(7) << fixed << setprecision(2)
- << A[j][i] << " * x" << ((i==n-1)?"":" + "); //магия таблицы
- else cout << setw(7)<< fixed << setprecision(2) << A[j][i] << " * " << setw(7)
- << fixed << setprecision(2) << x[i] << ((i==n-1)?"":" + "); //тоже магия таблицы
- }
- cout << " = " << b[j] << endl;
- }
- }
- int read_n(){
- int n;
- cout << "Please write size array:" << endl;
- cin >> n;
- return n;
- }
- double **array_generator_rand(int n, int m) {
- double **ptrary = new double * [n];
- srand(time(NULL));
- for (int i = 0; i < n; i++) {
- ptrary[i] = new double [m];
- for (int j=0; j < m; j++) ptrary[i][j]= rand() % 100;
- }
- return ptrary;
- }
- double **array_generator(int n, int m) {
- double **ptrary = new double * [n];
- for (int i = 0; i < n; i++) {
- ptrary[i] = new double [m];
- }
- return ptrary;
- }
- double *array_generator_rand(int n) {
- double *ptrary = new double [n];
- srand(time(NULL));
- for (int i=0; i < n; i++) ptrary[i] = rand() % 100;
- return ptrary;
- }
- double *array_generator(int n) {
- double *ptrary = new double [n];
- return ptrary;
- }
- void array_destroyer(double **ary, int n) {
- for (int i = 0; i < n; i++) {
- delete [] ary[i];
- }
- delete [] ary;
- }
- void array_destroyer(double *ary) {
- delete [] ary;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement