728x90
목차

1. 최소자승법 같이 복잡한 계산이 필요한 이유

2. 원의 방정식을 구할 때 최소자승법 적용하기

3. 측정하는 포인트의 수에 따른 오차

4. 계산하는 소스코드(엑셀 VBA 함수 코드)

 

 

비접촉 2차원 측정기(공구현미경)이나 3차원 측정기로 원을 측정해 봅시다.

이 기계들은 여러개의 점을 찍어서 모양을 예상하는 방법으로 측정을 합니다.

원을 측정할 때는 최소 3개의 점을 측정해야 하며 타원 모드(지원한다면) 5개의 점을 요구합니다.

왜 이것이 필요한지 그리고 구할 수 있는 것이 무엇이 있는지 알아보겠습니다.

 

점 3개로 원 만들기

 

320x100

 

 

1. 최소자승법 같이 복잡한 계산이 필요한 이유

 

현실에서 만들어진 물건을 측정하다보면 정확한 원이 아닌 경우가 많습니다.

그러다 보면 오차가 발생하는데 이걸 보정하는 절차가 필요합니다.

 

최소자승법의 개념

 

계산한 있는 해답 직선에서 계측값의 오차가 가장 적어지는 점을 찾는 것입니다.

이걸 최소자승법이라고 하고 가장 흔한 오차 보정 방식입니다.

현실에서는 완전한 원형은 거의 불가능하겠죠? 

그럼으로 발생하는 오차를 줄여주는 최소자승법 알고리즘을 기준으로 측정합니다.

 

오차의 개념

 

검은 선은 리얼한 선이고, 빨간 점선은 가장 가까운 원입니다.

그럼 검정선의 지름을 구할때는 오차(ERROR)가 최소가 되는 값을 찾아서 적용합니다.

 

 

2. 원의 방정식을 구할 때 최소자승법 적용하기

 

원의 방정식

 

3개의 점이 필요한 이유는 원의 방정식 때문입니다.

위치를 알려주는 a, b와 반지름인 r로 구성된 식입니다.

그럼 3개의 점 (x1, y1), (x2, y2), (x3, y3)를 측정했다고 합시다.

오차들의 합 Error와 제곱합은 아래와 같습니다.

 

오차들의 합

 

이 제곱합을 각각의 요소에 편미분하면 가장 작은 오차를 가지는 값을 구할 수 있습니다.

원의 편미분 결과는 이미 다양한 프로그램에서 소스를 제공하니 직접 계산하지 않겠습니다.

이 방식을 적용하기 위해서는 최소한 3개의 포인트가 필요합니다.

 

편미분하기

 

 

3. 측정하는 포인트의 수에 따른 오차

 

그럼 점의 수에 따라 원이 얼마나 정확해지는지 확인해 보겠습니다.

아래 표는 점의 숫자를 변경하면서 측정한 결과입니다.

왼쪽은 6개의 점, 오른쪽은 8개의 점을 측정했습니다.

이 때 오차는 RMS 방식(제곱의 평균)으로 계산 할 때 점을 6개에서 8개로 늘리면 0.096에서 0.055로 줄어듭니다.

측정결과는 원에서 많이 어긋난 일그러짐을 가지고 측정했기 때문에 오차가 어느정도는 있게 되어있습니다.

시간과 비용이 허락한다면 규칙적인 간격으로 측정하고 8포인트 이상을 추천합니다.

 

(좌 6점, 우 8점) 측정 포인트에 따른 결과

 

 

 

4. 계산하는 소스코드(엑셀 VBA 함수 코드)

 

인터넷에 있는 결과를 제가 약간 튜닝해서 코드로 만들었습니다.

엑셀로 쓰는데다 임시라 좀 조잡해 보이네요.

최소 자승법같은 경우 기준점을 잡는 것과 구현하는 것에 따라서 결과가 많이 다를 수 있습니다.

이게 정답이라고 할 수는 없고요, 혹시 참고하실 분은 이것도 보시라는 의미로 생각하세요.

 

Function Solution_Circle_a(points As Range, Optional M = 3) As Double
    '입력된 점들을 입력합니다.
    'M은 1일때 a, 2는 b, 3일때는 r을 반환합니다.
    
    Dim numPoints As Integer
    numPoints = points.Rows.Count
    
    If numPoints < 3 Then
        Solution_Circle_a = "최소 3개의 점을 입력하시오"
        Exit Function
    End If
    
    If (M <> 1) And (M <> 2) And (M <> 3) Then
        Solution_Circle_a = "1,2,3 중 하나를 입력하시오"
        Exit Function
    End If
    
    
    ' 입력된 점들을 배열로 변환합니다.
    Dim pointArray() As Variant
    pointArray = points.Value
    
    ' 중심 (a, b) 및 반지름 r을 찾기 위한 변수 선언
    Dim a As Double, b As Double, r As Double, r2 As Double
    a = 0
    b = 0
    r = 1
    
    
    '원의 중심과 반지름을 추정합니다.
    Dim sumX As Double, sumY As Double, sumX2 As Double, sumY2 As Double
    Dim sumXY As Double, sumX3 As Double, sumY3 As Double, sumX2Y As Double, sumXY2 As Double
    
    Dim i As Integer
    For i = 1 To numPoints
        sumX = sumX + pointArray(i, 1)
        sumY = sumY + pointArray(i, 2)
        sumX2 = sumX2 + pointArray(i, 1) ^ 2
        sumY2 = sumY2 + pointArray(i, 2) ^ 2
        sumXY = sumXY + pointArray(i, 1) * pointArray(i, 2)
        sumX3 = sumX3 + pointArray(i, 1) ^ 3
        sumY3 = sumY3 + pointArray(i, 2) ^ 3
        sumX2Y = sumX2Y + pointArray(i, 1) ^ 2 * pointArray(i, 2)
        sumXY2 = sumXY2 + pointArray(i, 1) * pointArray(i, 2) ^ 2
    Next i
    
    Dim N As Double
    N = numPoints
    
    Dim D As Double
    D = N * (sumX2 * sumY2 - sumXY ^ 2) + 2 * (sumX * sumXY2 - sumY * sumX2Y) + (sumX3 * sumY - sumY3 * sumX)
    
    Dim Da As Double, Db As Double, Dc As Double
    Da = sumY2 * (sumX2 - sumX) - sumX2Y * (N * sumX - sumY) + sumXY2 * (N * sumX - sumY) - sumXY * (N * sumX2 - sumX3) + sumX2 * (sumY - N * sumXY)
    Db = N * (sumX2Y * sumX2 - sumX * sumXY2) + sumY3 * (sumX2 - N * sumX) + sumX3 * (N * sumXY - sumY) - sumY2 * (sumX2 - N * sumX) - sumX2 * (sumX2 - N * sumX3) + sumXY * (sumX3 - N * sumX2)
    Dc = N * (sumXY2 * sumX - sumY * sumX2) + sumX3 * (sumXY - N * sumY) + sumY3 * (N * sumX - sumY) - sumX2 * (sumXY - N * sumY) - sumXY * (sumXY - N * sumY2) + sumY2 * (sumX2 - N * sumXY)
    
    ' 중심 (a, b) 및 반지름 r 계산
    a = -Da / (2 * D)
    b = -Db / (2 * D)
    For j = 1 To numPoints
        r = r + (pointArray(j, 1) - a) ^ 2 + (pointArray(j, 2) - b) ^ 2
    Next j
    
    r = Sqr(r / N)
    
    
    
    ' 결과 출력    
    If M = 1 Then
        Solution_Circle_a = a
        ElseIf M = 2 Then
        Solution_Circle_a = b
        ElseIf M = 3 Then
        Solution_Circle_a = r
    End If
    
End Function

 

 

 

반응형

+ Recent posts