티스토리 뷰

Algorithm

2X2 3X3 역행렬 JAVACRIPT / EXCEL VBA

마구자바 2021. 5. 12. 23:38
반응형

직접 수식을 이용하여 역행렬을 계산하는 알고리즘.

행렬크기가 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

 

 

 

 

 

 

 

 

반응형
댓글