c++ - 使用缩放的部分旋转 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
。可以对此代码进行哪些进一步的修改,以使其与正确的高斯消除相匹配,并在每个步骤中缩放部分旋转答案?
提前致谢!
解决方案
推荐阅读
- java - 这两种从用户那里获取输入的方式有什么区别?
- class - 如何在 kotlin 中填充对象数组?
- pdfmake - pdfmake显示准确页码的问题
- mysql - EOL 的合并类型,(文件结尾)
- hp-uft - 在描述性编程中对多项数据使用一个变量
- c++ - 如何提高文件读取速度?
- scala - 是否可以从 intellij 运行 giter8 模板?
- c++ - 我在理解 [basic.scope.pdecl]/7 时遇到了一些困难
- angular - 注入服务时的 StaticInjectorError(AppModule)[Boolean]
- cockroachdb - 如何从 CockroachDB 中的时代获取日期