Matrix.h包括矩阵类Matrix的定义,Matrix.cpp包括该类成员函数的实现,LinearEqu.h包括线性方程类LinearEqu的定义,继承自Matrix类,其中solve()方法为列主元消去法的具体步骤,LU()方法为LU分解法的具体步骤。

Matrix.h(矩阵类头文件):
//矩阵
class Matrix
{
public:Matrix(int size = 2);virtual ~Matrix();void setMatrix(const double* values);    //矩阵赋初值void displayMatrix() 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;
};
Matrix.cpp(矩阵类方法实现):
#include "Matrix.h"
#include<iostream>
using namespace std;Matrix::Matrix(int size) : size(size){elements = new double[size * size];
}Matrix::~Matrix(){delete[] elements;
}//设置矩阵
void Matrix::setMatrix(const double* values)
{for(int i = 0; i < size * size; i++)elements[i] = values[i];    //矩阵元素赋值
}//显示矩阵
void Matrix::displayMatrix() const{cout << "The matrix is:" << endl;for(int i = 0; i < size; i++){for(int j = 0; j < size; j++)cout << element(i, j) << "\t";cout << endl;}
}
LinearEqu.h(线性方程类头文件):
#include "Matrix.h"//线性方程
class LinearEqu : public Matrix
{
public:LinearEqu(int size = 2);virtual ~LinearEqu();void setLinearEqu(const double* a, const double* b);   //方程赋值bool solve(); //列主元消去法
bool LU();      //LU分解法void displayLinearEqu() const;   //显示方程void displaySolution() const; //显示方程的解
private:double* sums;   //方程右端double* solution; //方程的解s};
LinearEqu.cpp(线性方程类方法实现):
// LinearEqu.cpp: implementation of the LinearEqu class.
//
//#include "stdafx.h"
#include "LinearEqu.h"
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;//
// Construction/Destruction
//LinearEqu::LinearEqu(int size) : 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 < this->getSize(); i++)sums[i] = b[i];
}void LinearEqu::displayLinearEqu() const{cout << "The Linear equation is:" << endl;for(int i = 0; i < this->getSize(); i++){for(int j = 0; j < this->getSize(); j++)cout << element(i, j) << "\t";cout << sums[i] << endl;}
}void LinearEqu::displaySolution() const{cout << "The Result is:" << endl;for(int i = 0; i < this->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 n = this->getSize();for(int k = 0; k < n - 1; k++){int is;double max = 0;for(int i = k, j = k; i < n; i++){double t = fabs(element(i, j));if(t > max){max = t;is = i;}}if(max == 0){return false;}//交换行else{if(is != k){for(int j = k; j < n; j++)swap(element(k, j), element(is, j));swap(sums[k], sums[is]);}}//消去double major = element(k, k);for(i = k + 1; i < n; i++){double m = element(i, k) / major;for(int j = k; j < n; j++){element(i, j) -= element(k, j) * m;}sums[i] -= sums[k] * m;}}//判断剩下的一个元素是否为0double d = element(n - 1, n - 1);if(fabs(d) < 1e-15){return false;}//回代过程solution[n - 1] = sums[n - 1] / d;for(int i = n - 2; i >= 0; i--){double t = 0.0;for(int j = i + 1; j <= n - 1; j++)t += element(i, j) * solution[j];solution[i] = (sums[i] - t)/element(i, i);}return true;
} //LU分解法
bool LinearEqu::LU(){int n = this->getSize();vector<vector <double> > L(n ,vector<double>(n));vector<vector <double> > U(n ,vector<double>(n));//U第一行赋值for(int i = 0; i < n; i++)U[0][i] = element(0, i);//L第一列赋值for(int j = 1; j < n; j++)L[j][0] = element(j, 0) / U[0][0];//剩余赋值for(i = 1; i < n; i++){for(j = i; j < n; j++){double sum1 = 0;for(int k = 0; k < i; k++)sum1 += L[i][k] * U[k][j];U[i][j] = element(i, j) - sum1;}for(j = i+1; j < n; j++){double sum2 = 0;for(int k = 0; k < i; k++)sum2 += L[j][k] * U[k][i];L[j][i] = (element(j, i) - sum2) / U[i][i];}}vector<double> Y(n);Y[0] = sums[0];for (i = 1; i<n; i++){double sum3 = 0;for (int k = 0; k<i; k++)sum3 += L[i][k] * Y[k];Y[i] = sums[i] - sum3;}solution[n - 1] = Y[n - 1] / U[n - 1][n - 1];for (i = n - 2; i >= 0; i--){double sum4 = 0;for (int k = i + 1; k<n; k++)sum4 += U[i][k] * solution[k];solution[i] = (Y[i] - sum4) / U[i][i];}return true;
}//雅可比迭代法
bool LinearEqu::Jacobi()
{int n = this->getSize();int i,j;vector<double> x1(n);vector<double> x2(n);vector<double> b(n);vector<vector <double> > a(n ,vector<double>(n));double sum, max=INT_MAX, eps=1e-5, count=0;for(i = 0; i < n; i++){b[i] = sums[i] / element(i, i);for(j = 0; j < n; j++){a[i][j] = - element(i, j) / element(i, i);}a[i][i] = 0;}while(max > eps){for(i = 0; i < n; i++){sum = 0;for(j = 0; j < n; j++)sum += a[i][j] * x1[j];x2[i]  = sum + b[i];solution[i] = x2[i];}max = fabs(x1[0] - x2[0]);for(i = 1; i < n; i++)if(max < fabs(x1[i] - x2[i]))max = fabs(x1[i] - x2[i]);for(i = 0; i < n; i++){x1[i] = x2[i];}count++;}cout << "经过" << count << "次迭代" << endl;return true;
}//高斯塞德尔迭代法
bool LinearEqu::GS()
{int n = this->getSize();int i,j,k;vector<double> x1(n);vector<double> x2(n);vector<double> b(n);vector<vector <double> > a(n ,vector<double>(n));double sum, max=INT_MAX, eps=1e-5, count=0;for(i = 0; i < n; i++){b[i] = sums[i] / element(i, i);for(j = 0; j < n; j++){a[i][j] = - element(i, j) / element(i, i);}a[i][i] = 0;}while(max > eps){for(i = 0; i < n; i++){sum = 0;for(j = 0; j < i; j++){sum += a[i][j] * x2[j];}for(k = j; k < n; k++){sum += a[i][k] * x1[k];}x2[i]  = sum + b[i];solution[i] = x2[i];}max = fabs(x1[0] - x2[0]);for(i = 1; i < n; i++)if(max < fabs(x1[i] - x2[i]))max = fabs(x1[i] - x2[i]);for(i = 0; i < n; i++){x1[i] = x2[i];}count++;}cout << "经过" << count << "次迭代" << endl;return true;
}
Main.cpp(主函数):
// 列主元消去.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "LinearEqu.h"
#include<iostream>
using namespace std;int main(int argc, char* argv[])
{double a[] = {12, -3, 3,-18, 3, -1,1, 1, 1};double b[] = {15, -15, 6};   //方程右端LinearEqu equ(3);equ.setLinearEqu(a,b);equ.displayLinearEqu();cout << endl;//列主元消去法:cout << "列主元消去法:" << endl;if(equ.solve())equ.displaySolution();elsecout << "Fail" << endl;cout << endl;//LU分解法cout << "LU分解法:" << endl;if(equ.LU())equ.displaySolution();elsecout << "Fail" << endl;cout << endl;double c[] = {10, -1, -2,-1, 10, -2,-1, -1, 5};double d[] = {72, 83, 42};LinearEqu equ2(3);equ2.setLinearEqu(c,d);equ2.displayLinearEqu();cout << endl;//雅可比迭代法cout << "雅可比迭代法:" << endl;if(equ2.Jacobi())equ2.displaySolution();elsecout << "Fail" << endl;cout << endl;//高斯塞德尔迭代法cout << "高斯塞德尔迭代法:" << endl;if(equ2.GS())equ2.displaySolution();elsecout << "Fail" << endl;return 0;
}
运行结果:

计算方法:列主元消去法,LU分解法, 雅可比迭代法,高斯塞德尔迭代法 解线性方程(C++)相关推荐

  1. 解线性方程组的迭代法(雅可比、高斯-塞德尔迭代法)

    Agui_GS.m: function x=Agui_GS(A,b) %方程Ax=b,x0为初始向量 %e为精度,N为最大迭代次数 n=length(b); N=100; e=1e-4; x0=zer ...

  2. MATLAB实现雅可比与高斯塞德尔迭代

    概述 用MATLAB编程实现,形成m函数文件.输入A,b矩阵,无返回值,解得x向量直接显示在命令行窗口,同时绘制出x向量的收敛曲线. A = [ 2 − 1 1 1 1 1 1 1 − 2 ] b = ...

  3. 高斯--塞德尔迭代法求方程组的解(Python实现)

    数值分析题目 求方程组 {5x1+2x2+x3=−12−x1+4x2+2x3=202x1+−3x2+10x3=2\left\{ \begin{array}{c} 5x_1+2x_2 + x_3 = - ...

  4. 解线性方程组的迭代法(高斯-塞德尔迭代法)

    MATLAB函数文件 function x=Agui_GS(A,b) %方程Ax=b,x0为初始向量 %e为精度,N为最大迭代次数 n=length(b); N=100; e=1e-4; x0=zer ...

  5. 雅可比(Jacobi)及高斯-塞德尔(Gauss_Seidel)迭代法求解线性方程组的matlab现实

    雅可比迭代法的实现代码: function X=Jacobi(A,B,P,delta,max1) %Input -A is a X*N nosingular matrix % -B is a N*1 ...

  6. 基于高斯塞德尔方法的超松弛迭代法MATLAB实现

    概述 用MATLAB编程实现,形成m函数文件.输入A,b矩阵,与松弛因子 ω \omega ω,无返回值.设置精度要求 ε = 1 0 − 4 \varepsilon=10^{-4} ε=10−4.所 ...

  7. 方程组求解matlab实现(朴素高斯求解、LU分解、雅可比迭代方法、高斯-塞德尔方法、连续过松弛(SOR))

    朴素高斯求解 function x= oridinarygauss(a,b) n=length(b); for j=1:n-1for i=j+1:nmult=a(i,j)/a(j,j);for k=j ...

  8. 分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组(转载)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yyywww666/article/details/42805071 算法介绍(迭代法介绍): 代码C ...

  9. 分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组

    算法介绍(迭代法介绍): 代码C语言实现; # include<stdio.h> # include<math.h> # define N 6 /* *使用雅可比迭代法和高斯- ...

最新文章

  1. 一个数据库存储架构的独白
  2. 数据链路层协议_数据链路层 基本数据链路协议
  3. leetcode412. Fizz Buzz
  4. html 脚本 gdi,基于gdi的简单画图
  5. 多继承 , 组合 , 菱形继承 , 接口 , 抽象 , 鸭子类型
  6. Java SSM开发大众点评后端 Mybatis实战商城项目
  7. 夜神模拟器连不上android studio了
  8. J2EE进阶之JSP和EL表达式 十二
  9. centos 磁盘重新分区操作实践
  10. 嵌入式 linux 蓝牙 C开发
  11. 程序员转正述职报告/总结
  12. CAN数据采集助手 Python
  13. java-爬虫-爬取银行名字列表
  14. ppk和pem文件互转
  15. Vuex完整示例代码
  16. 【开发日常】设备双网卡设置为同一网段的IP,会有什么问题?
  17. mysql 下载 mysql jdbc jar 下载 ,mysql-5.7.17 解压版安装
  18. OA系统之操作系统和浏览器常识
  19. 数据库大小写敏感配置
  20. 遇见 mysql Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre 问题

热门文章

  1. 华硕打不开vm里面的Linux,华硕主板 Vmware虚拟机 二进制转换与此平台上的长模式不兼容...
  2. 【JVM】垃圾回收算法
  3. 精细化边缘安全防护:如何防止CDN域名被恶意刷量?
  4. python隐秘的角落——笛卡尔之心
  5. 阿里云iot mqtt
  6. 第一篇 厚黑学 代序四 狂狷嘲世一教主
  7. 论文翻译:《Phosvardeep:使用序列信息对磷酸变化的深度学习预测》
  8. 折半查找(二分查找)的理解
  9. 【HTCVR】VRTK插件案例分析之0021~030
  10. Fat32、NTFS、exFAT、HFS+、APFS文件系统的区别