Как узнать коэффициенты масштабирования для соответствия двух кривых в Matlab? - PullRequest
1 голос
/ 03 февраля 2012

У меня есть два набора данных, полученных в разные дни. Результаты, которые я получил из двух разных наборов данных, имеют одинаковую форму, но разные значения (см. Рис. 1). Я пытаюсь сопоставить второй набор данных (x2, y2) с первым (x1, y1) путем умножения постоянной A в x и B в y вторых данных (см. фиг.2). Figure 1 Figure 2

например:

data1:

x1 = [- 0,3: 0,06: 2,1] ';

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 ] ';

data2

х2 = [- 0,3: 0,06: 2,1] ';

у2 = [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,780 0,675 0,571 0,471 0,390 0,309 0,258 0,209 0,161 0,129 0,099 0,079 0,063 0,047 0,038 0,027 0,023 0,015 ] '; * * Тысяча двадцать-один

Чтобы выяснить коэффициент масштабирования A & B , я думаю о получении B путем минимизации разницы y между данными1 и x измененными данными2. Однако у меня есть хороший способ узнать А. Как мне найти A & B , чтобы соответствовать этим двум кривым? Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

Если у вас есть набор инструментов оптимизации (или доступ к любой неограниченной подпрограмме нелинейной минимизации), вы можете сделать следующее:

Определите функцию, которая вычисляет ошибку между вашими двумя кривыми

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 (или любой другой оптимизатор, который у вас есть) для вычисления ваших коэффициентов:

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 голосов
/ 03 февраля 2012

Чтобы определить A , вы хотите сделать взаимную корреляцию, но вместо тестирования диапазона временных задержек, вы захотите проверить диапазон множителей x, то есть A значения.

Предполагая, что у вас есть диапазон значений A, который вы хотите проверить, выполните корреляцию между двумя кривыми (x1, y1) и (A * x2, B * y2), умножив точки на каждой кривой, которые соответствуют одной и той же кривой. х значений и суммировать эти продукты. Это даст вам одно число, представляющее корреляцию при конкретном значении A .

Повторите вышеуказанное для каждого значения потенциала A . Значение, которое дает максимальный результат корреляции, представляет собой значение A , которое наилучшим образом соответствует двум кривым в измерении x.

Этот метод требует, чтобы проверяемые вами значения A давали новые значения x, которые синхронизируются с исходными значениями x, чтобы обе кривые имели значения с одинаковыми значениями x.

...