티스토리 뷰
반응형
직접 수식을 이용하여 역행렬을 계산하는 알고리즘.
행렬크기가 2X2이거나 3X3일때는 다음을 이용하여 계산하면 빠르게 구할 수 있다.
소스코드는 Javascript를 이용한 것이므로,
다른 프로그램을 이용할 경우는 해당 프로그램의 문법에 맞춰 수정해야한다.
if( mat.length == 2 ){
det = mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1];
if( det == 0 ){
alert( "matrix is singular!");
} else {
minv = [];
minv.push( [ mat[1][1] / det, -1*mat[0][1] / det ] );
minv.push( [ -1* mat[1][0] / det, mat[0][0] /det ] );
return minv;
}
} else if ( mat.length == 3 ){
det = mat[0][0] * ( mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1] )
- mat[0][1] * ( mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0] )
+ mat[0][2] * ( mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0] );
if( det == 0 ){
alert( "matrix is singular!");
} else {
minv = [];
// transpose
dtem = mat[0][1];
mat[0][1] = mat[1][0];
mat[1][0]= dtem;
dtem = mat[0][2];
mat[0][2] = mat[2][0];
mat[2][0]= dtem;
dtem = mat[1][2];
mat[1][2] = mat[2][1];
mat[2][1]= dtem;
minv.push( [( mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1] ) / det, -1*( mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0] ) / det, ( mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0] ) / det ] );
minv.push( [ -1*( mat[0][1] * mat[2][2] - mat[0][2] * mat[2][1] ) / det, ( mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0] ) / det, -1*( mat[0][0] * mat[2][1] - mat[0][1] * mat[2][0] ) / det ] );
minv.push( [ ( mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1] ) / det, -1*( mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0] ) / det, ( mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0] ) / det ] );
return minv;
}
}
Excel VBA를 이용한 코드는 다음과 같다.
Sub Calc_QuadEquation()
'
' 3점 좌표 (x1, y1), (x2, y2), (x3, y3)
Dim x1 As Double, y1 As Double
Dim x2 As Double, y2 As Double
Dim x3 As Double, y3 As Double
'
' 계수 a, b, c 선언
Dim a As Double, b As Double, c As Double
' 좌표값을 할당
x1 = 3: y1 = 2
x2 = 13: y2 = -3
x3 = 23: y3 = 5
Dim dMat(2, 2) As Double
dMat(0, 0) = x1 ^ 2: dMat(0, 1) = x1: dMat(0, 2) = 1
dMat(1, 0) = x2 ^ 2: dMat(1, 1) = x2: dMat(1, 2) = 1
dMat(2, 0) = x3 ^ 2: dMat(2, 1) = x3: dMat(2, 2) = 1
Dim dDet, dTem, aInv(2, 2), aCoef(2) As Double
dDet = dMat(0, 0) * (dMat(1, 1) * dMat(2, 2) - dMat(1, 2) * dMat(2, 1)) - dMat(0, 1) * (dMat(1, 0) * dMat(2, 2) - dMat(1, 2) * dMat(2, 0)) + dMat(0, 2) * (dMat(1, 0) * dMat(2, 1) - dMat(1, 1) * dMat(2, 0))
If dDet = 0 Then
MsgBox ("dmatrix is singular!")
Else
'transpose
dTem = dMat(0, 1)
dMat(0, 1) = dMat(1, 0)
dMat(1, 0) = dTem
dTem = dMat(0, 2)
dMat(0, 2) = dMat(2, 0)
dMat(2, 0) = dTem
dTem = dMat(1, 2)
dMat(1, 2) = dMat(2, 1)
dMat(2, 1) = dTem
aInv(0, 0) = (dMat(1, 1) * dMat(2, 2) - dMat(1, 2) * dMat(2, 1)) / dDet
aInv(0, 1) = -1 * (dMat(1, 0) * dMat(2, 2) - dMat(1, 2) * dMat(2, 0)) / dDet
aInv(0, 2) = (dMat(1, 0) * dMat(2, 1) - dMat(1, 1) * dMat(2, 0)) / dDet
aInv(1, 0) = -1 * (dMat(0, 1) * dMat(2, 2) - dMat(0, 2) * dMat(2, 1)) / dDet
aInv(1, 1) = (dMat(0, 0) * dMat(2, 2) - dMat(0, 2) * dMat(2, 0)) / dDet
aInv(1, 2) = -1 * (dMat(0, 0) * dMat(2, 1) - dMat(0, 1) * dMat(2, 0)) / dDet
aInv(2, 0) = (dMat(0, 1) * dMat(1, 2) - dMat(0, 2) * dMat(1, 1)) / dDet
aInv(2, 1) = -1 * (dMat(0, 0) * dMat(1, 2) - dMat(0, 2) * dMat(1, 0)) / dDet
aInv(2, 2) = (dMat(0, 0) * dMat(1, 1) - dMat(0, 1) * dMat(1, 0)) / dDet
a = aInv(0, 0) * y1 + aInv(0, 1) * y2 + aInv(0, 2) * y3
b = aInv(1, 0) * y1 + aInv(1, 1) * y2 + aInv(1, 2) * y3
c = aInv(2, 0) * y1 + aInv(2, 1) * y2 + aInv(2, 2) * y3
aCoef(0) = a: aCoef(1) = b: aCoef(2) = c
End If
' 결과 출력
MsgBox "The quadratic equation is: y = " & a & "x^2 + " & b & "x + " & c
End Sub
반응형
'Algorithm' 카테고리의 다른 글
3차 방정식 해를 구하는 공식 방법 (0) | 2024.01.18 |
---|---|
다각형 면적, 무게중심, 단면2차모멘트 계산 알고리즘 (0) | 2021.11.28 |
역행렬 (가우스 소거법) (0) | 2021.05.12 |
댓글