数值计算——系数矩阵部分对角线为0时线性方程组求解方法(附程序)

求解线性方程组时,我们经常用的方法是高斯消去法,矩阵三角分解,雅克比迭代,以及迭代方法如共轭梯度等。在使用这些方法求解的过程中,通常需要a_{ii}\neq 0,但是难免会遇到对角线有一些数为0的情况。本文求解方法大致求解思路还是采取高斯消去法,在高斯消去法的基础上多了一个矩阵系数对角线为0的判断,如果为0,则与上一行交换,包括列向量对应的位置。

原理参考我之前写的文章:https://blog.csdn.net/weixin_41788456/article/details/102485139

程序:

//开发人员:陈帅  开发日期:2019.10.15   邮箱:[email protected] 
#include "pch.h"
#include <iostream>//基本数据流输入/输出
#include <iomanip> //参数化输入/输出 
#include <vector>//STL动态数组容器
using namespace std;
//************************
//改进的高斯消去法公式
//***********************
vector<double> gaussian_elim_mutate(vector<vector<double>>a, vector<double>b); //高斯消去法求解线性方程组AX=B
vector<double> gaussian_elim_mutate(vector<vector<double>>a, vector<double>b)
{
	int n = size(b);
	vector<double>x;    //定义方程组解
	x.resize(n);
	vector<double>mi_k; //定义消去过程中的中间变量
	mi_k.resize(n);
	double sum;
	double line_exchange = 0;
	double m[3];
	//如果对角线为0,则交换上一行,直到不为0为止
	for (int k = 0; line_exchange != -1; k++)
	{
		for (int i = 0; i < n; i++)
		{
			line_exchange = -1;
			if (a[i][i] == 0)
			{

				line_exchange = i;
				if (i == 0)
				{
					for (int j = 0; j < 3; j++)
					{
						m[j] = a[n - 1][j];
						a[n - 1][j] = a[i][j];
						a[i][j] = m[j];
					}
					m[0] = b[n - 1];
					b[n - 1] = b[i];
					b[i] = m[0];
				}
				else
				{
					for (int j = 0; j < 3; j++)
					{
						m[j] = a[i - 1][j];
						a[i - 1][j] = a[i][j];
						a[i][j] = m[j];
					}
					m[0] = b[i - 1];
					b[i - 1] = b[i];
					b[i] = m[0];
				}
			}
		}
	}
	//再次判断能否用高斯消去法(验证)
	for (int i = 0; i < n; i++)
	{
		if (a[i][i] == 0)
		{
			cout << "can't use Gaussian meathod" << endl;
		}
	}
	//n-1步消元
	for (int k = 0; k < n - 1; k++)
	{
		//求出第i次初等行变换系数
		for (int j = k + 1; j < n; j++)
		{
			mi_k[j] = a[j][k] / a[k][k];
		}
		for (int i = k + 1; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				a[i][j] = a[i][j] - mi_k[i] * a[k][j];
			}
			b[i] = b[i] - mi_k[i] * b[k];
		}
	}	//回代过程
	x[n - 1] = b[n - 1] / a[n - 1][n - 1];
	for (int i = n - 2; i >= 0; i--)
	{
		sum = 0;
		for (int j = i + 1; j < n; j++)
		{
			sum = sum + a[i][j] * x[j];
		}
		x[i] = (b[i] - sum) / a[i][i];
	}
	return x;
}
int main()
{
	vector<vector<double>>a;
	a.resize(3, vector<double>(3));
	vector<double>b(3);
	vector<double>x;
	a[0] = { 0,1.1,3.1 }, a[1] = { 2.0,0,0.36 }, a[2] = { 5.0,0.96,0 };
	b = { 6.0,0.02,0.96 };

	x = gaussian_elim_mutate(a, b);
	cout << "解为:" << endl;
	for (int i = 0; i < 3; i++)
		cout <<"x["<<i<<"]="<< fixed << setprecision(2) << setw(5) << x[i] << endl;
}

运行结果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章