jacobi,seidel,sor方法的c++实现

没有进行收敛性判断,只是算法的单纯求解

#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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值