- Naive Gaussian Elimination은 n개의 미지수를 가진 n개의 선형방정식을 풀기위해 고안된 것이다. 하지만 최적화가 되지 않은 버전이다.
- 3중 for문으로 구성되어 있기 때문에, chopping 혹은, Rounding 에러가 발생한다. 통상적인 행렬에는 소수점 7~9까지의 정확도를 보이지만, 방데르몽드 행렬 은 온전히 연산할 수 없다.
#include <iostream>
#include <vector>
template <typename T>
void PrintMatrix(std::vector<std::vector<T>>& mat){
for(auto& row : mat){
for(auto& ele : row){
std::cout << ele << " ";
}
std::cout << "\n";
}
}
template<typename T>
void PrintVector(std::vector<T>& vec){
for(auto& ele : vec){
std::cout << ele << " ";
}
std::cout << "\n";
}
template <typename T>
std::vector<T> GaussianElemination(std::vector < std::vector<T>> a, std::vector<T> b){
for(size_t k = 1; k < a.size(); k++){
for(size_t i = k; i < a.size(); i++){
double r = a[i][k - 1] / a[k - 1][k - 1];
for(size_t j = 0; j < a[i].size(); j++){
a[i][j] = a[i][j] - r * a[k - 1][j];
}
b[i] = b[i] - r * b[k - 1];
}
}
size_t n = a.size();
std::vector<T> x; x.resize(n);
x[n - 1] = b[n - 1] / a[n - 1][n - 1];
for(int i = n - 2; i > -1 ; i--){
T sum = b[i];
for(int j = i + 1; j < n; j++){
sum = sum - a[i][j] * x[j];
}
x[i] = sum / a[i][i];
}
return x;
}
auto main() ->int{
using namespace std;
vector<vector<double>> mat = { {1,3,4,2},
{5,3,4,9},
{2,4,3,7},
{7,5,9,5} };
vector<double> b { 2,4,5,6 };
auto x = GaussianElemination(mat, b);
PrintVector(x);
}
연립 선형 방정식 풀기
이 계산기는 가우스 소거법, 역행렬 법 또는 크래머 법칙을 사용하여 연립 선형 방정식을 풉니다. 또한 Rouché-Capelli 정리를 사용하여 연립 선형 방정식 (호환성 분석)에서 다수의 해를 계산할 수
matrixcalc.org
'알고리즘 + 자료구조' 카테고리의 다른 글
트리 (0) | 2023.06.15 |
---|---|
Recursion(재귀) (0) | 2023.06.14 |
Recursion - English Ruler (0) | 2023.06.14 |
Singly Linked List (0) | 2022.10.17 |
호너씨와 조립제법과 수도미분 (0) | 2022.07.10 |