说明:
本系列将致力于用计算机代码编程解决人工计算较为繁杂无趣的数学计算问题。本系列的文章将分为以下几个模块:数学问题,解决代码,使用方法,问题解答。话不多说,开始吧。
数学问题:
利用 Gauss列主元素消去法解决线性方程问题Ax=b,其中(A,b)分别为:
解决代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
void SolverEqGauss(double** A, double* b, int n, double* x);
//其中A和b为系数矩阵,n为矩阵阶数,x为待求解变量,eps为精度。
int main()
{
int i, n;
double** A, * b, * x;
//输入维数
cin >> n;
A = new double* [n];
b = new double[n];
x = new double[n];
for (i = 0; i < n; i++)
{
A[i] = new double[n];
}
//输入系数矩阵和向量
for (i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> A[i][j];
}
}
for (int i = 0; i < n; i++)
{
cin >> b[i];
}
//计算
SolverEqGauss(A, b, n, x);
//输出
for (i = 0; i < n; i++)
{
cout << fixed << setprecision(5) << x[i] << " ";
}
delete[]b;//释放内存
delete[]x;
for (i = 0; i < n; i++)
{
delete[]A[i];
}
return 0;
}
void SolverEqGauss(double** A, double* b, int n, double* x)
{
int i, j, k;
double** a = new double* [n];
double* btemp = new double[n];
double d, temp;
double eps = 1e-6;
for (i = 0; i < n; i++)
{
a[i] = new double[n + 1];
}
//赋值
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
a[i][j] = A[i][j];
}
a[i][n] = b[i];
}
for (k = 0; k < n - 1; k++)
{//找列主元最大值
for (int i = k + 1; i < n - 1; i++)
{
if (abs(a[i][k]) >= abs(a[k][k]))
{
if (abs(a[i][k]) < eps)
{
break;
printf("wrong");
}
else
{
for (int j = k; j <= n; j++)
{
double c;
c = a[i][j];
a[i][j] = a[k][j];
a[k][j] = c;
}
}
}
}
for (int i = k + 1; i < n; i++)
{
double m = a[i][k] / a[k][k];
for (int j = k+1; j <= n; j++)
{
a[i][j] = a[i][j] - m * a[k][j];
}
}
}
for (i = 0; i < n; i++)
{
btemp[i] = 0.0;
}
for (i = n - 1; i >= 0; i--) //求解向量
{
double trans = 0.0;
for (int j = i + 1; j <n; j++)
{
trans = trans + a[i][j] * btemp[j];
}
btemp[i] = (a[i][n] - trans) / a[i][i];
}
for (i = 0; i < n; i++)
{
x[i] = btemp[i];
}
for (i = 0; i < n; i++)
{
delete[]a[i];
}
delete[]a;
delete[]btemp;
}
使用方法:
第一行是矩阵阶度:n ;
后面的 n 行,输入 n 阶矩阵;
最后一行,输入未知向量的值。
例如:
矩阵为:A=[[1,−1,2,−1],[2,−2,3,−3],[1,1,1,0],[1,−1,4,3]]
向量为:b=[−8,−20,−2,4]
测试输入:
4
1 -1 2 -1
2 -2 3 -3
1 1 1 0
1 -1 4 3
-8 -20 -2 4
预期输出:
-7.00000 3.00000 2.00000 2.00000
问题解决:
ps:博客生涯第一篇文章,希望大家多多支持!有许多不足之处,希望多多指教!希望与大家一同进步!