首页 > 解决方案 > 使用缩放的部分旋转 C++ 从高斯消除打印正确的矩阵

问题描述

您好 Stackoverflow 社区,

我最近发布了一个类似这样的问题。我需要进行一次完整的重写,以反映我在产品中的当前状态。有些打印程序我可能不会显示。我先给你看代码:

void printAbsoluteVector(std::vector<double> abs_vector)
 {
     std::cout << "The absolute coefficients are: ["; 
     for (int i = 0; i < abs_vector.size(); ++i)
         std::cout << abs_vector[i] << " ";
     std::cout << "]" << std::endl;
 }

 void printScaleVector(std::vector<double> abs_vector)
 {
     std::cout << "The scaling coefficients are: [";
     for (int i = 0; i < abs_vector.size(); ++i)
         std::cout << abs_vector[i] << " ";
     std::cout << "]" << std::endl;
 }

 std::vector<double> findMaximumRowNums(std::vector<std::vector<double>> augmented_matrix)
 {
     std::vector<double> maximums;
     for (int i = 0; i < augmented_matrix.size(); ++i)
     {
         double max = *std::max_element(augmented_matrix[i].begin(), augmented_matrix[i].end() - 1);
         maximums.push_back(max);
     }
     return maximums;
 }

 std::vector<double> makeScaleVector(std::vector<std::vector<double>>augmented_matrix, std::vector<double>abs_coefficients, int i)
 {
     std::vector<double> scale_vector;

     
         for (int j = i; j < augmented_matrix.size(); ++j)
             scale_vector.push_back(abs(augmented_matrix[j][i] / abs_coefficients[j]));
     return scale_vector;
 }


    //solves given augmented matrix by Gaussian elimination with scaled partial pivoting

 std::vector<double> gaussPivoting(std::vector<std::vector<double>> augmented_matrix)
 {
    int equations_num = augmented_matrix.size(); //number of equations
    std::vector<double> abs_coefficients = findMaximumRowNums(augmented_matrix);
    printAbsoluteVector(abs_coefficients);

    //i is the iterator pointing a column
    for (int i = 0; i < equations_num; ++i)
    {
        std::vector<double> scale_vector = makeScaleVector(augmented_matrix, abs_coefficients, i);
        printScaleVector(scale_vector);
        
        //find maximum absolute coefficients in each row
        int max_rows_num = i;
        for (int j = i + 1; j < equations_num; ++j)
        {
            if (abs(augmented_matrix[j][i]) > abs(augmented_matrix[max_rows_num][i]))
            {
               max_rows_num = j;
            }
        }

           //swap current row with max absolute pivot column coeff row
           swap(augmented_matrix[i], augmented_matrix[max_rows_num]);
       
        for(int j = i + 1; j < equations_num; ++j)
            for (int k = i; k <= equations_num; ++k)
            {
                augmented_matrix[j][k] -= augmented_matrix[j][i] * augmented_matrix[i][k] / augmented_matrix[i][i];
                std::cout << augmented_matrix[j][k] << " + " << augmented_matrix[j][i] << " * " << augmented_matrix[i][k] << " / " << augmented_matrix[i][i] << "\n";
            }

        //printEquations(augmented_matrix);
        printEquations(augmented_matrix);
        scale_vector.clear();
        
    }
    

    //performing backward substitution
    std::vector<double> solution(equations_num);
    
    for(int i = equations_num - 1; i >= 0; --i)
    {
        solution[i] = augmented_matrix[i][equations_num] / augmented_matrix[i][i];
        //substitute immediate solution backward and update RHS of each equation
        for (int j = i - 1; j >= 0; --j)
        {
            augmented_matrix[j][equations_num] -= augmented_matrix[j][i] * solution[i];
            
        }
        
    }
    printEquations(augmented_matrix);
    return solution;
}

当我在以下矩阵上运行此代码时...

2 3 0 8
-1 2 -1 0
3 0 2 9

我得到以下输出...

在此处输入图像描述

最终向量应该是[1 2 3]。我和同学一起查看了我的代码,我们想出了上面的代码。它变为for (int k = I + 1; k <= equations_num; ++k)函数for (int k = i; k <= equations_num; ++k)中的反向替换之前gaussPivoting。可以对此代码进行哪些进一步的修改,以使其与正确的高斯消除相匹配,并在每个步骤中缩放部分旋转答案?

提前致谢!

标签: c++matrixvectorlinear-algebra

解决方案


推荐阅读