全元素高斯消去法

//Matrix.h
#ifndef __MATRIX_H__
#define __MATRIX_H__

class Matrix {
public:
	Matrix(int size = 2);
	  ~Matrix();

	  void setMatrix(const double *values);//矩阵赋初值
	  void printMatrix()const;//显示矩阵
	  int getSize() const{ return size; }//得到矩阵大小
	  double &element(int i, int j) { return elements[i*size + j]; }
	  double element(int i, int j) const{ return elements[i*size + j]; }

private:
	int size;  //矩阵的大小
	double *elements;
};
#endif
//Matrix.cpp
#include"Matrix.h"
#include<iostream>
using namespace std;

void Matrix::setMatrix(const double*values) {
	for (int i = 0;i < size*size;i++)
		elements[i] = values[i];//矩阵赋值
}
	Matrix::Matrix(int size/*=2*/) :size(size) {//构造函数
		elements = new double[size*size];//动态内存分配
	}

	Matrix::~Matrix() {//析构函数
		delete[]elements;//释放内存
	}

	void Matrix::printMatrix()const {//显示矩阵
		cout << "The Matrix is:" << endl;
		for (int i = 0;i < size;i++) {
			for (int j = 0;j < size;j++)
				cout << element(i, j) << " ";
			cout << endl;
		}
	}
//LinearEqu.h
#ifndef _LINEAR_EQU_H__
#define _LINEAR_EQU_H__
#include"Matrix.h"

class LinearEqu :public Matrix {
public:
	LinearEqu(int size = 2);
	~LinearEqu();
	void setLinearEqu(const double*a, const double *b);//方程赋值
	bool solve();//求解方程
	void printLinearEqu()const;//显示方程
	void printSolution()const;//显示解
private:
	double *sums;//方程右端项
	double *solution;//方程解
};
#endif
//LinearEqu.cpp
#include"LinearEqu.h"
#include<iostream>
#include<cmath>

using namespace std;

LinearEqu::LinearEqu(int size/*=2*/) :Matrix(size) {//调用基类构造函数
	sums = new double[size];//动态内存分配
	solution = new double[size];
}

LinearEqu::~LinearEqu() {//析构函数
	delete[]sums;//释放内存
	delete[]solution;
}

void LinearEqu::setLinearEqu(const double*a, const double *b) {
	setMatrix(a);
	for (int i = 0;i < getSize();i++)
		sums[i] = b[i];
}

void LinearEqu::printLinearEqu()const {
	cout << "The Line eqution is:" << endl;
	for (int i = 0;i < getSize();i++) {
		for (int j = 0;j < getSize();j++)
			cout << element(i, j) << "  ";
		cout << "     " << sums[i] << endl;
	}
	/*cout << "1233211234566" << endl;*/
}

void LinearEqu::printSolution()const {
	cout << "The Result is: " << endl;
	for (int i = 0;i < getSize();i++)
		cout << "x[" << i << "] " << solution[i] << endl;
}

inline void swap(double &v1, double &v2) {
	double temp = v1;
	v1 = v2;
	v2 = temp;
}

bool LinearEqu::solve() {
	int *js = new int[getSize()];//储存主元素列号的数组

	for (int k = 0;k < getSize()-1 ;k++) {
		//主元素
		int is;  //主元素所在行号 
		double max = 0;//矩阵所有元素最大值
		for (int i = k;i < getSize();i++)
			for (int j = k;j < getSize(); j++) {
				double t = fabs(element(i, j));
				if (t > max) {
					max = t;
					js[k] = j;
					is = i;
				}
			}
		if (max == 0) {
			delete[] js;
			return false;
		}
		else {
			if (js[k] != k)
				for (int i = 0;i < getSize();i++)
					swap(element(i, k), element(i, js[k]));
			if (is != k) {
				for (int j = k;j < getSize();j++)
					swap(element(k, j), element(is, j));
				swap(sums[k], sums[is]);
			}
		}
		// 消去的过程
		double major = element(k, k);
		for (int j = k + 1;j < getSize();j++)
			element(k, j) /= major;
		sums[k] /= major;
		for (int i = k + 1;i < getSize();i++) {
			for (int j = k + 1;j < getSize();j++)
				element(i, j) -= element(i, k)*element(k, j);
				sums[i] -= element(i, k)*sums[k];
		}
	}

	double d = element(getSize() - 1, getSize() - 1);
	if(fabs(d)<1e-15){
		delete[] js;
		return false;
	}

	solution[getSize() - 1] = sums[getSize() - 1] / d;
	for (int i = getSize() - 2;i >= 0;i--) {
		double t = 0.0;
		for (int j = i + 1;j <= getSize()-1;j++)
		t += element(i, j)*solution[j];
		solution[i] = sums[i] - t;
	}



	js[getSize() - 1] = getSize() - 1;
	for (int k = getSize() - 1;k >= 0;k--)
		if (js[k] != k)
			swap(solution[k], solution[js[k]]);
	delete[]js;
	return true;
}
//7_9.cpp
#include"Matrix.h"
#include"LinearEqu.h"
#include<iostream>

using namespace std;

int main() {
	double a[] = {
		0.2368,0.2471,0.2568,1.2671,
		0.1968,0.2071,1.2168,0.2271,
		0.1581,1.1675,0.1786,0.1871,
		1.1161,0.1254,0.1397,0.1490
	};
	double b[] = { 1.8471,1.7471,1.6471,1.5471 
	};
	LinearEqu equ(4);

	equ.setLinearEqu(a, b);
	equ.printLinearEqu();

	if (equ.solve())
		equ.printSolution();
	else
		cout << "False" << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值