//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;
}