线性方程组的迭代求解(C++)

  1. 简单迭代法

就是将一个线性方程组Ax=b等价变形为x=Bx+g,由此建立迭代公式$x^{(k+1)}=Bx^{(k)}+g$,取初始向量$x^0$,进行迭代。编写程序需要写几个函数:矩阵乘向量,向量相加。以下程序打印矩阵B和向量g,并打印迭代过程中每一步的x值。

void printMatrix(double *matrix, int row, int column) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < column; j++) {
            printf("%6.2lf    ", *(matrix + i * column + j));
        }
        printf("\n");
    }
}

void printVector(double *matrix, int len) {
    for (int i = 0; i < len; i++) {
        printf("%6.2lf    ", *(matrix + i));
    }
    printf("\n");
}
double* MatrixMultiVector(double* matrix, int row, int column, double* vector) {
    double* result = new double[row];
    for (int i = 0; i < row; i++) {
        *(result + i) = 0;
        for (int j = 0; j < column; j++) {
            *(result + i) -= *(matrix + i * row + j) * (*(vector + j));
        }
    }
    return result;
}

void vectorAdd(double* vector1, double* vector2, int len) {
    for (int i = 0; i < len; i++) {
        *(vector1 + i) += *(vector2 + i);
    }
}

void simpleIterativeMethod(double *matrix, double* vector, double* X0, int order) {
    double* X;

    double temp;
    for (int i = 0; i < order;i++) {
        temp = *(matrix + i * order + i);
        for (int j = 0; j < order; j++) {
            if (i == j) {
                continue;
            }
            *(matrix + i * order + j) /= temp;
        }
        *(matrix + i * order + i) = 0;
        *(vector + i) /= temp;
    }
    printMatrix(matrix, order, order);
    printVector(vector, 3);
    int MAX_ITER = 10;
    int ind = 1;
    X = MatrixMultiVector(matrix, order, order, X0);
    vectorAdd(X, vector, order);
    printf("----迭代----\n");
    printVector(X, order);
    while (ind < MAX_ITER) {
        X0 = X;
        X = MatrixMultiVector(matrix, order, order, X0);
        printVector(X, 3);
        vectorAdd(X , vector, order);
        printf("iter %d: ", ind);
        printVector(X, order);
        ind++;
    }
    if (X) {
        delete[] X;
    }
}
int main() {
    double matrix[] = {
        10, -2,-1,
        -2,10,-1,
        -1,-2,5
    };
    double vector[] = { 3,15,10 };
    double X0[] = { 0,0,0 };
    simpleIterativeMethod(matrix, vector, X0, 3);
    return 0;
}

原文链接: https://www.cnblogs.com/zhaoke271828/p/14073773.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/205658

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午10:18
下一篇 2023年2月12日 下午10:18

相关推荐