Gaussian Elimination(가우스 소거법)
- Pivoting(피보팅)을 통해 방정식의 순서를 바꾸어 Gauss Elimination을 적용할 수 있도록 바꿔준다.
- 행렬을 가우스 소거법을 사용해서 Row Echelon Form(=REF,행사다리꼴) 형태로 변경한다.
- 후진 대입법을 이용해 해를 구한다.
- C++ 으로는 단순 구현, PYTHON으로는 GUI까지 구현하였다.
Github로 보기
c++
#include <iostream>
#include <iomanip>
#include <vector>
#pragma warning (disable:4996)
using namespace std;
float maxV, num;
int w;
vector<vector<float>>matrix;
/*
input:
3
-2 -5 2 -3
1 3 0 4
0 1 3 6
output:
최종 결과 행렬:
-2 -5 2 -3
0 0.5 1 2.5
0 0 1 1
x[1] =-5
x[2] =3
x[3] =1
*/
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
freopen("Gauss_Input.txt", "r", stdin);
freopen("Gauss_Output.txt", "w", stdout);
int n; cin >> n; //n*n행렬
matrix.resize(n, vector<float>(n + 1)); //벡터 크기 재할당
for (int i = 0; i < n; i++) { //행렬 삽입
for (int k = 0; k < n + 1; k++) {
cin >> matrix[i][k];
}
}
for (int i = 0; i < n; i++) { //피봇
maxV = abs(matrix[i][i]);
for (int q = i; q < n; q++) {
num = abs(matrix[q][i]);
if (num > maxV) {
maxV = abs(matrix[q][i]);
w = q;
}
}
if (abs(matrix[i][i]) != maxV) { //더 큰 것이 있다면 변환
for (int c = 0; c < n + 1; c++) {
float temp = matrix[i][c];
matrix[i][c] = matrix[w][c];
matrix[w][c] = temp;
}
}
}
for (int i = 0; i < n; i++) { //가우스 소거법
if (matrix[i][i] == 0) {
cout << "정칙행렬이 아닙니다.";
exit(0);
}
for (int j = i + 1; j < n; j++) {
float temp = matrix[j][i] / matrix[i][i];
for (int k = 0; k < n + 1; k++) {
matrix[j][k] = matrix[j][k] - (temp * matrix[i][k]);
}
}
}
cout << "\n" << "최종 결과 행렬:" << "\n";
for (int a = 0; a < n; a++) { //출력
for (int b = 0; b < n + 1; b++) {
if (b == n) cout << right << setw(3) << ' ';
cout << right << setw(3) << matrix[a][b] << ' ';
}
cout << "\n";
}
cout << "\n";
for (int i = n - 1; i >= 0; i--) { //해 구하기
for (int k = i + 1; k < n; k++) {
matrix[i][n] = matrix[i][n] - matrix[i][k] * matrix[k][n];
}
matrix[i][n] = matrix[i][n] / matrix[i][i];
}
for (int i = 0; i < n; i++) { //해 출력
cout << "x[" << i + 1 << "] =" << matrix[i][n]<<"\n";
}
}
python
import tkinter.messagebox as msgbox
import tkinter as tk
from numpy import array
from tkinter import *
from tkinter import filedialog
from tkinter import ttk
'''
input:
3
-2 -5 2 -3
1 3 0 4
0 1 3 6
'''
maxV, num, n,w = 0.0, 0.0, 0,0
matrix = []
root=Tk()
root.title("가우스소거법_1724572_안주형")
root.geometry("640x480+300+100") #가로*세로+x좌표+y좌표
root.resizable(False,False) #x,y너비 변경불가 (창크기 변경불가)
def result(): #결과 버튼 눌렸을때 동작하는 함수
n = len(matrix)
w=0
for i in range(n): # 피봇
maxV = abs(matrix[i][i])
for q in range(i, n):
num = abs(matrix[q][i])
if num > maxV:
maxV = abs(matrix[q][i])
w = q
if abs(matrix[i][i] != maxV): # 더 큰것이 있다면 변환
for c in range(n + 1):
temp: float = matrix[i][c]
matrix[i][c] = matrix[w][c]
matrix[w][c] = temp
for i in range(n): # 가우스 소거법
if matrix[i][i] == 0:
print('정칙행렬이 아닙니다.')
exit(0)
for j in range(i + 1, n):
temp: float = matrix[j][i] / matrix[i][i]
for k in range(n + 1):
matrix[j][k] -= temp * matrix[i][k]
msgbox.showinfo("알림","정상적으로 출력했습니다")
a = array(matrix)
root.text = Text(root)
root.text.insert(END,str('--------가우스 소거법 진행한 행렬 출력-------- \n'))
root.text.insert(END,'\n')
for i in range(n): # 행렬 저장
for k in range(n + 1):
root.text.insert(END,'%6s' % str(matrix[i][k]) + ' ')
root.text.insert(END,'\n')
for i in range(n - 1, -1, -1): # 해 구하기
for k in range(i + 1, n):
matrix[i][n] = matrix[i][n] - matrix[i][k] * matrix[k][n]
matrix[i][n] /= matrix[i][i]
root.text.insert(END,'\n --------해 출력--------\n')
root.text.insert(END, '\n')
for i in range(n): # 해 저장
root.text.insert(END,f'x[{i + 1}] = {matrix[i][n]}\n')
root.text.configure(state='disabled')
root.text.pack()
def open_file(): #파일 불러오기 함수
file=filedialog.askopenfile(parent=root,mode='rb',title="파일을 불러오세요")
lines = file.readlines()
for idx, line in enumerate(lines):
if idx > 0:
matrix.append(list(map(float, line.strip().split())))
file.close()
def save_file(): #파일 저장하기 함수
file= filedialog.asksaveasfile(mode='w', defaultextension=".txt")
text2save = str(root.text.get(0.0, END))
file.write(text2save)
file.close
#메뉴 영역
menu=Menu(root)
menu_file=Menu(menu,tearoff=0)
menu_file.add_command(label="파일 불러오기",command=open_file)
menu_file.add_command(label="파일 저장하기",command=save_file)
menu_file.add_separator()
menu_file.add_command(label="끝내기",command=root.quit)
menu.add_cascade(label="파일",menu=menu_file)
#본문 영역
btn1=Button(root,command=result,padx=5,pady=15,text="가우스 소거법 진행하기").pack()
label=ttk.Label(root, text="1.파일을 불러온다.",font=("Times",14)).pack()
label=ttk.Label(root, text="2.위 가우스 소거법 진행하기 버튼을 누른다.",font=("Times",14)).pack()
label=ttk.Label(root, text="3.저장은 자동으로 .txt 형식으로 저장되므로 파일이름만 정해준다.",font=("Times",14)).pack()
root.config(menu=menu)
root.mainloop()
'ETC' 카테고리의 다른 글
추천 알고리즘(Recommendation Algorithm)이란? (0) | 2021.10.24 |
---|---|
[c++] class 에서 멤버 변수를 초기화 하는 세가지 방법 (0) | 2021.10.20 |
[수치해석] [c++,python] LU 분해(LU decomposition) 구현하기 (0) | 2021.10.20 |
[git] Repository (레포지토리, 폴더) 합치기 (0) | 2021.10.20 |
[git] 원격 저장소(Github)에 파일 올리기 (0) | 2021.10.20 |
[git] 레포지토리(폴더) 이름 수정하기 (0) | 2021.10.20 |
댓글