没有进行收敛性判断,只是算法的单纯求解
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;
const int n = 4; //文件的行列数
//数组求max
double max_array(double err[n])
{
double max = err[0];
for (int i = 1; i < n; i++)
{
if (err[i] > max)
{
max = err[i];
}
}
return max;
}
//分离矩阵确定D
void arrayD(double a[n][n], double (*D)[n])
{
for (int i = 0; i < n; i++)
D[i][i] = a[i][i];
}
//分离矩阵确定L,-L下三角矩阵
void arrayL(double a[n][n], double (*L)[n])
{
for (int i = 1; i < n; i++)
{
for (int j = 0; j < i; j++)
{
L[i][j] = -a[i][j];
}
}
}
//分离矩阵确定U,-U上三角矩阵
void arrayU(double a[n][n], double (*U)[n])
{
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
U[i][j] = -a[i][j];
}
}
}
//Jacobi x二维数组存储行数是x的个数,列数是迭代次数最多迭代kmax次
void jacobi(double D[n][n], double L[n][n], double U[n][n], double b[n])
{
int kmax = 40;
double x[n][kmax] = {0};
double err[n] = {0}; //x误差
int k = 1; //统计迭代次数
int i; //j是x的个数
for (k; k < kmax; k++)
{
cout << "迭代次数" << k << endl;
for (i = 0; i < n; i++)
{
double sum = 0;
for (int j = 0; j < n; j++)
{
sum += (L[i][j] * x[j][k - 1] +
U[i][j] * x[j][k - 1]);
}
x[i][k] = (1 / D[i][i]) * (sum + b[i]);
cout << setiosflags(ios::fixed) << setprecision(4) << setiosflags(ios::left);
cout << setw(15) << x[i][k] << "\t";
err[i] = fabs(x[i][k] - x[i][k - 1]);
}
cout << endl;
if (max_array(err) < 0.0001)
break;
}
for (int num = 0; num < n; num++)
{
cout << setiosflags(ios::fixed) << setprecision(4) << setiosflags(ios::left);
cout << endl;
cout << "x[" << num + 1 << "]"
<< "=" << x[num][k] << endl;
}
}
void sediel(double D[n][n], double L[n][n], double U[n][n], double b[n])
{
int kmax = 40;
double x[n][kmax] = {0};
double err[n] = {0}; //x误差
int k = 1; //统计迭代次数
int i; //j是x的个数
for (k; k < kmax; k++)
{
cout << "迭代次数" << k << endl;
for (i = 0; i < n; i++)
{
double sum = 0;
for (int j = 0; j < n; j++)
{
sum += (L[i][j] * x[j][k] +
U[i][j] * x[j][k - 1]);
}
x[i][k] = (1 / D[i][i]) * (sum + b[i]);
cout << setiosflags(ios::fixed) << setprecision(4) << setiosflags(ios::left);
cout << setw(15) << x[i][k] << "\t";
err[i] = fabs(x[i][k] - x[i][k - 1]);
}
cout << endl;
if (max_array(err) < 0.0001)
break;
}
for (int num = 0; num < n; num++)
{
cout << setiosflags(ios::fixed) << setprecision(4) << setiosflags(ios::left);
cout << endl;
cout << "x[" << num + 1 << "]"
<< "=" << x[num][k] << endl;
}
}
void sor(double D[n][n], double L[n][n], double U[n][n], double b[n], double w)
{
int kmax = 40;
double x[n][kmax] = {0};
double err[n] = {0}; //x误差
int k = 1; //统计迭代次数
int i; //j是x的个数
for (k; k < kmax; k++)
{
cout << "迭代次数" << k << endl;
for (i = 0; i < n; i++)
{
double sum = 0;
for (int j = 0; j < n; j++)
{
sum += (L[i][j] * x[j][k] +
U[i][j] * x[j][k - 1]);
}
x[i][k] = (1 - w) * x[i][k - 1] + (w / D[i][i]) * (sum + b[i]);
cout << setiosflags(ios::fixed) << setprecision(4) << setiosflags(ios::left);
cout << setw(15) << x[i][k] << "\t";
err[i] = fabs(x[i][k] - x[i][k - 1]);
}
cout << endl;
if (max_array(err) < 0.0001)
break;
}
for (int num = 0; num < n; num++)
{
cout << setiosflags(ios::fixed) << setprecision(4) << setiosflags(ios::left);
cout << endl;
cout << "x[" << num + 1 << "]"
<< "=" << x[num][k] << endl;
}
}
int main(void)
{
double a[n][n] = {2, -1, 0, 0, -1, 2.5, -1, 0, 0, -1, 2.5, -1, 0, 0, -1, 2};
double b[n] = {-4, 4, 4, -4};
// double a[n][n] = {64, -3, -1, 2, -90, 1, 1, 1, 40};
// double b[n] = {14, -5, 20};
// double a[n][n] = {4, 3, 0, 3, 4, -1, 0, -1, 4};
// double b[n] = {24, 30, -24};
double D[n][n] = {0};
double L[n][n] = {0};
double U[n][n] = {0};
arrayD(a, D);
arrayL(a, L);
arrayU(a, U);
jacobi(D, L, U, b);
sediel(D, L, U, b);
double w = 1.16;
sor(D, L, U, b, w);
cin.get();
return 0;
}