2019년 4월 13일 토요일

# [C++] 연립 일차 방정식 해 구하기 ( 2차 정사각 행렬을 이용 )

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
enum ERROR_TYPE{
 SO_MANY_VALUE_OR_NO = 0,
 ONE_VALUE = 1
};

struct ColumnVector2D{
public:
 float x;
 float y;
};

struct SqaureMatrix2D{
public:
 // [0] = m00 -> a
 // [1] = m10 -> b
 // [2] = m01 -> c
 // [3] = m11 -> d
 float m[4];
 static ERROR_TYPE CalcInverse(const SqaureMatrix2D mat, SqaureMatrix2D& inverseMat){
  float det = mat.m[0] * mat.m[3] - mat.m[1] * mat.m[2];
  if(det == 0) return ERROR_TYPE::SO_MANY_VALUE_OR_NO;

  inverseMat.m[0] = (1/det) * mat.m[3];
  inverseMat.m[3] = (1/det) * mat.m[0];
  inverseMat.m[1] = (1/det) * -mat.m[1];
  inverseMat.m[2] = (1/det) * -mat.m[2];
  return ERROR_TYPE::ONE_VALUE;
 }
 ColumnVector2D operator*(const ColumnVector2D vec){
  ColumnVector2D v;
  v.x = vec.x * m[0] + vec.y * m[1];
  v.y = vec.x * m[2] + vec.y * m[3];
  return v;
 }
};

int main() {
 // 2x - 3y = 1, -x + y = -1 두개의 일차방정식을 연립하여 해를 얻는다.
 SqaureMatrix2D A;
 A.m[0] = 2;
 A.m[1] = -3;
 A.m[2] = -1;
 A.m[3] = 1;
 ColumnVector2D xy;
 xy.x = 1;
 xy.y = -1;
 SqaureMatrix2D inverseA;
 ERROR_TYPE err = SqaureMatrix2D::CalcInverse(A, inverseA);
 if(err == ERROR_TYPE::ONE_VALUE){
  ColumnVector2D answer = inverseA * xy;
  cout << "X : " << answer.x << "  " << "Y : " << answer.y << endl;
 }

 return 0;
}

댓글 없음:

댓글 쓰기