2012-02-02 5 views
1

나는 다른 날에 얻은 두 개의 데이터 세트가 있습니다. 두 개의 다른 데이터 세트에서 얻은 결과는 모양은 비슷하지만 값이 다릅니다 (그림 1 참조). 두 번째 데이터 세트 (x2, y2)와 첫 번째 데이터 세트 (x1, y1)를 일치시키려는 시도입니다. 그림 2에서 y는 A x와 B입니다.MATLAB에서 두 곡선을 일치시키는 배율을 찾는 방법은 무엇입니까?

DATA1 : [- 0.3 : 0.06 : 2.1]

X1은 예컨대 Figure 1 Figure 2

';

Y1 = 0.001 0.001 0.004 0.014 0.052 0.166 0.330 0.416 0.340 0.247 0.194 0.197 0.237 0.330 0.428 0.542 0.669 0.767 0.855 0.900 0.913 0.904 0.873 0.811 0.765 0.694 0.631 0.585 0.514 0.449 0.398 0.351 0.309 0.273 0.233 0.211 0.182 0.154 0.137 0.117 0.101 ];

데이터 2

x2 = [- 0.3 : 0.06 : 2.1] '';

Y2 = 0.000 0.000 0.000 0.000 0.025 0.230 0.447 0.425 0.269 0.194 0.225 0.326 0.477 0.636 0.791 0.931 1.036 1.104 1.117 1.123 1.062 0.980 0.897 0.079 0.063 0.047 0.038 0.027 0.023 0.129 0.099 0.258 0.209 0.161 0.390 0.309 0.675 0.571 0.471 0.780.015 ] ';

는 스케일링 인자 & B 알아 보려면, I는 DATA1 및 X 변성 DATA2 간의 델타 Y를 최소화 B 획득에 대한 생각하고있다. 그러나 나는 A를 찾을 수있는 좋은 방법이 있습니다. A & B이 두 곡선을 일치시키는 방법은 무엇입니까? 어떤 도움이라도 대단히 감사합니다.

답변

0

당신이 최적화 도구 상자 (또는 제약 비선형 최소화 루틴에 액세스)가있는 경우, 다음을 수행 할 수 있습니다

이 두 곡선 사이의 오차를 계산하는 함수를 정의를

function err = sqrError(coeffs, x1, y1, x2, y2) 
    % Interpolation of 'y2' with scaled 'x2' into the domain 'x1' 
    y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1); 
    % Squred error calculation 
    err = sum((coeffs(2)*y2sampledInx1-y1).^2); 
end 

사용 fminunc (또는 무엇이든 최적화 사용 가능한이가) 당신의 coeffiecients을 계산하기 :

coeffs = fminunc(@(c) sqrError(c,x1, y1, x2, y2),[1;1]); 

A = coeffs(1); 
B = coeffs(2); 
plot(x1, y1, A*x2, B*y2) 
+0

@ jonnat :이 게시물은 데이터 세트에 적합합니다. 하지만 난 하나의 질문을, 당신 fminunuc을 사용하면 어떻게 최소 범위 ([1,1])을 결정합니까? 내 다른 데이터 세트로 테스트 할 때 오류 메시지가 "= 28"을 사용하는 오류, ROOTS 입력에 NaN 또는 Inf가 없어야 함을 나타냅니다. " 어쩌면 이것의 원인을 아십니까? 당신의 도움을 주셔서 감사합니다. – tytamu

+0

이 오류는 코드에서 연산이 유한 수가 아닌 NaN 또는 Inf를 생성했음을 의미합니다.fminunc에 대한 무제한 목적 함수 나 0으로 나누는 간단한 오류를 포함하여 많은 이유가있을 수 있습니다. 계수에 경계를 추가하려면 fminunc 대신 fmincon을 사용하십시오. NaN 또는 Inf가 생성 된 위치를 정확히 알고 싶다면 코드 시작 부분에'dbstop if naninf'를 사용하십시오. 그래도 문제를 찾을 수없는 경우 새로운 질문을 엽니 다. 마지막으로, 내 대답이 당신의 모범을 위해 작용했다면 다른 사람들이 그것이 잘 작동하도록 그것을 받아 들여주십시오. – foglerit

0

을 결정하기 위해 당신이 상호 상관을 수행 할 대신 시간 시차의 범위를 테스트, 당신은 X 배율의 범위, 즉 값을 테스트 할 수 있습니다.

테스트하려는 A 값의 범위가 있다고 가정하고 두 개의 곡선 (x1, y1)과 (A * x2, B * y2) 사이의 상관 관계를 계산합니다. 동일한 x 값 및 이들 곱을 합산하십시오. 이렇게하면 특정 A 값에서 상관 관계를 나타내는 하나의 숫자가 표시됩니다.

각 잠재력에 대해 위의 단계를 반복하십시오. 값입니다. 최대 상관 결과를 제공하는 것은 A 값이며 x 차원의 두 곡선과 가장 일치합니다.

이 방법을 사용하려면 테스트 한 값이 원본 x 값과 동기화되는 새 x 값을 제공해야합니다. 그러면 두 곡선 모두 동일한 x 값으로 값을 갖게됩니다.

+0

감사, 이것은 매우 도움이된다. 새로운 x 값을 원래의 값과 어떻게 동기화 할 수 있는지에 대한 지침을 줄 수 있습니까? – tytamu

+0

@ Tai-Yen Chen : 좋은 질문입니다. 원하는 ** A ** 값을 사용하여 x 값을 모두 동기화 한 다음 결과 (A * x2, B * y2) 데이터를 x1 값으로 보간하여 상관 관계를 계산할 목적으로 만 고민 할 필요가 없습니다. 보간법은 로컬 맥시마를 줄이지 만, 충분히 미세한 x 해상도에서는 상관 결과에 큰 영향을 미치지 않습니다. –

+0

@ b3 : 나는 jonnats 게시물로 테스트하기 만하면된다. 루틴에서는 상관 계수를 계산하지 않습니다. 단지 궁금한 점이 있습니까? 감사. – tytamu

관련 문제