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

 

 

 

반응형
728x90
목차

1. 그래프에서 추세선 보기

2. 선형예측 방정식

3. 선형 예측 함수(SLOPE, INTERCEPT, CORREL)

 
인자 두개의 관계를 구하는 함수로는 대표적으로 LINEST가 있습니다.
(엑셀(EXCEL) Linest 함수와 추세선 그래프 상관성(R2) 데이터 분석하기)
배열함수가 다루기 어려울 수도 있어 선형성만 따로 보는 방법이 있습니다.
 

320x100

 
 

1. 그래프에서 추세선 보기

 
선형예측 추세선을 그리는 방법을 알아보겠습니다.
 
① 분산형 그래프를 그립니다.
(X,Y 데이터가 따로 들어가는 분산형 그래프에서 추세선을 그려야 정확합니다.)
② 추세선을 그리는 것은 "표선택" - [상단 매뉴] - [챠트 디자인] - [차트 요소 추가] - [추세선] - [선형 예측] 에 있습니다.
③ 데이터를 따라가는 추세선을 그려집니다.
 

추세선 표시하는 법

 

 
 

2. 선형예측 방정식

 
선형예측 모델의 방정식이 표에 표시됩니다.

이 때 표시되는 값는 y = ax + b 형식의 식과 결정 계수 혹은 RMS 값이라고 불리는 R2가 있습니다.
추세선 서식에서 이 값을 차트에 표시할 것인지 설정할 수 있습니다.
추세선을 "선형 회귀선"이라고 부를 수 있는데, 이 선의 기울기인 "a"와 절편인 "b"가 있으면 분석이나 예측이 가능합니다.
그리고 결정계수 R2는 X와 Y가 얼마나 관련이 있는지 이 "a,b"값을 얼마나 믿을 수 있는지를 나타냅니다.
1이면 같은 그래프 수준의 신뢰도를 가지고 0이면 전혀 믿을 수 없습니다.
기대하고 있는 정밀도 수준에 따라 다르겠지만, 0.95이상이면 믿을만 하고 0.7이하면 데이터를 예측할 수 없습니다.

 

설정하기

 
 

3. 선형 예측 함수

 
예측 방정식을 표시하는 함수가 있습니다.
기울기를 나타내는 SLOPE, 절편을 나타내는 INTERCEPT, 상관계수를 나타내는 CORREL입니다.
추세선에선에서는 결정계수 R2로 나타납니다. 이건 Linest 함수로 구할 수 있습니다.

 

Y = a X + b
Y = "SLOPE" X + "INTERCEPT"

 
SLOPE(known_y's, known_x's) : 선형 회귀선의 방정식상의 기울기를 구합니다. 주어진 값의 그래프 범위에서 Y변화 / X변화로 추가적인 DATA가 주어질 경우 변할 수 있습니다.

  • known_y's : 종속 데이터 요소의 셀 배열 또는 범위입니다.
  • known_x's : 독립 데이터 요소의 집합입니다.

 
INTERCEPT(known_y's, known_x's) : 형 회귀선의 방정식상의 절편을 구합니다. 이는 y=ax+b 형식의 선형 회귀방정식에서 x=0일 때의 값이 됩니다.

  • known_y's : 관측값이나 데이터의 종속 변수 집합입니다.
  • known_x's : 관측값이나 데이터의 독립 변수 집합입니다.

 
CORREL(array1,array2) : 두개의 데이터 집단의 상관계수를 반영합니다. 양수관계의 경우에는 1, 음수관계의 경우에는 -1에 가까울수록 관련이 깊은 DATA입니다. 0에 가까울 수록 두 데이터 집단은 상관이 없습니다.

  • array1 : 셀 값의 범위입니다.
  • array2 : 셀 값의 두 번째 범위입니다.
  • 1에 가까울수록 상관성이 올라가기는 하지만 추세선이나 LINEST와 다른 방법으로 계산하여 값이 다릅니다.
  • 범위를 A(인자 a, 평균 Ā), B의 상관인자를 구하는 방법은 아래와 같습니다.

상관계수 CORREL

반응형

+ Recent posts