• 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
복사했습니다!