Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
192
Добавлен:
08.12.2017
Размер:
3.68 Кб
Скачать
#include "Matrix.h"
#include "stdlib.h"
#include "math.h"
#include "string.h"
#include <iostream>
using namespace std;
Matrix::Matrix(int s,double* r,double* c)
{
	size = s;
	collumn = (double*)calloc(size, sizeof(double));//new long double[size];
	row = (double*)calloc(size, sizeof(double));;
	row[0] = r[0];
	collumn[0] = row[0];
	for (int i = 0; i < s; i++)
	{
		row[i] = r[i];
	collumn[i] = c[i];
	}
	x = (double*)calloc(size, sizeof(double));;
	y = (double*)calloc(size, sizeof(double));;
	left = (double*)calloc(size, sizeof(double));;
}

Matrix::Matrix(int n)
{
	size = n;
	row = (double*)calloc(size, sizeof(double));;
	collumn = (double*)calloc(size, sizeof(double));;
	x = (double*)calloc(size, sizeof(double));;
	y = (double*)calloc(size, sizeof(double));;
	left = (double*)calloc(size, sizeof(double));;
	row[0] = abs((rand() / 100) + 500);
	collumn[0] = row[0];
	for (int i = 1; i < n; i++)
	{
		row[i] = rand() / 100;
		collumn[i] = rand() / 100; 
	}
}

Matrix::Matrix(const Matrix & a)
{
	size = a.size;
	row = a.row;
	collumn = a.collumn;
	x = a.x;
	y = a.y;
	left = a.left;
}

Matrix& Matrix::operator=(const Matrix& a)
{
	return Matrix(a);
}
double * Matrix::Solve(double* a)
{
	double* x1 = (double*)calloc(size, sizeof(double));;
	for (int i = 0; i < size; i++)
		left[i] = a[i];
	double* y1 = (double*)calloc(size, sizeof(double));;
	double f = 0;
	double g = 0;
	double r = 0;
	double s = 0;
	double t = 0;
	x[0] = 1 / GetE(0);
	y[0] = x[0];
	for (int k = 1; k < size; k++)
	{
		f = 0;
		g = 0;
		r = 0;
		for (int i = 0; i < k; i++)
		{
			f += GetE(k - i) * x[i];
		}
		for (int i = -1; i > -k - 1; i--)
		{
			g += GetE(i) * y[-i - 1];
		}
		r = 1 / (1 - f * g);
		s = -r * f;
		t = -r * g;
		for (int i = 0; i < size; i++)
		{
			x1[i] = x[i];
			y1[i] = y[i];
		}
		for (int i = 0; i < size - 1; i++)
		{
			x[i] = x1[i] * r;
		}
		for (int i = 1; i < size; i++)
		{
			x[i] += y1[i - 1] * s;
		}
		for (int i = 0; i < size - 1; i++)
		{
			y[i] = x1[i] * t;
		}
		for (int i = 1; i < size; i++)
		{
			y[i] += y1[i - 1] * r;
		}
	}
	for (int i = 0; i< size; i++)
	{
		double(Matrix::*f1)(int, int);
		f1 = &Matrix::GetReverseMatrixElement;
		double(Matrix::*f2)(int, int);
		f2 = &Matrix::GetLeftElement;
		x1[i] = GetMultiplyElement(f1,f2, i, 0, size);
	}
	return x1;
}

double Matrix::GetE(int i)
{
	if (i > 0)
		return row[i];
	else
		return collumn[-i];
}

double Matrix::GetElementM1(int i, int j)
{
	if (j <= i)
		return x[i - j];
	else
		return 0;
}

double Matrix::GetElementM2(int i, int j)
{
	if (j >= i)
		return y[size - 1 + i - j];
	else
		return 0;
}

double Matrix::GetElementM3(int i, int j)
{
	if (i >= 1 && j < i)
		return y[i - j - 1];
	else return 0;
}

double Matrix::GetElementM4(int i, int j)
{
	if (j > 0 && j > i)
		return x[size + i - j];
	else
		return 0;
}

double Matrix::GetLeftElement(int i, int j)
{
	return left[i];
}

double Matrix::GetMultiplyElement(double(Matrix::*a)(int, int),double(Matrix::*b)(int, int), int i, int j, int sizex2)
{
double tmp = 0;
for (int i1 = 0; i1 < sizex2; i1++)
{
	tmp += ((*this).*a)(i, i1)*((*this).*b)(i1, j);
}
return tmp;
}

double Matrix::GetReverseMatrixElement(int i, int j)
{
	long double p = GetMultiplyElement(&Matrix::GetElementM1, &Matrix::GetElementM2, i, j, size);
	long double p2 = GetMultiplyElement(&Matrix::GetElementM3, &Matrix::GetElementM4, i, j, size);
	return (p - p2) / x[0];
}


Matrix::~Matrix()
{
	delete[] row;
	delete[] collumn;
	delete[] x;
	delete[] y;
	delete[] left;
}
Соседние файлы в папке MatrixDLL