zoukankan      html  css  js  c++  java
  • 线性方程组的迭代求解(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("
    ");
        }
    }
    
    void printVector(double *matrix, int len) {
        for (int i = 0; i < len; i++) {
            printf("%6.2lf    ", *(matrix + i));
        }
        printf("
    ");
    }
    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("----迭代----
    ");
        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;
    }
  • 相关阅读:
    vue实现语音播报功能
    vue使用vueCropper裁剪功能,代码复制直接使用
    阿里云服务器安装mongodb并且启动
    脚手架安装react
    PHP 和Apache的安装和配置
    CentOS yum 源的配置与使用
    Linux -Yum 命令详解
    (干货)Linux学习资源推荐
    linux学习书籍推荐linux学习书籍推荐
    一些C++内容的总结(2013.10.17)
  • 原文地址:https://www.cnblogs.com/zhaoke271828/p/14073773.html
Copyright © 2011-2022 走看看