выяснение коэффициентов масштабирования для сопоставления двух кривых с fmincon в matlab - PullRequest
2 голосов
/ 06 февраля 2012

Это дополнительный вопрос, связанный с , как узнать, какие коэффициенты масштабирования соответствуют двум кривым в matlab? Я использую следующий код для определения коэффициентов масштабирования, соответствующих двум кривым

function err = sqrError(coeffs, x1, y1, x2, y2)
   y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1);
   err = sum((coeffs(2)*y2sampledInx1-y1).^2);
end

и я использовал fmincon для оптимизации результата.

options = optimset('Algorithm','active-set','MaxFunEvals',10000,'TolCon',1e-7)
A0(1)=1; A0(2)=1; LBA1=0.1; UBA1=5; LBA2=0.1; UBA2=5;
LB=[LBA1 LBA2]; UB=[UBA1 UBA2];
coeffs = fmincon(@(c) sqrError(c,x1, y1, x2, y2),A0,[],[],[],[],LB,UB,[],options);

, когда я проверяю свои данные с помощью функции,

x1 = [- 0,3 -0,24 -0,18 -0,12 -0,06 0,06 0,02 0,18 0,24 0,3 0,36 0,42 0,48 0,54 0,6 0,72 0,78 0,84 0,9 0,96 1,02 1,08 1,14 1,2 1,26 1,32 1,38 1,44 1,5 1,56 1,62 1,68 1,74 1,8 1,86 1,92 1,98 2,04] y1 = [0,00 0,00 0,00 0,01 0,03 0,090,13 0,14 0,14 0,16 0,20 0,22 0,26 0,34 0,41 0,52 0,62 0,72 0,81 0,91 0,95 0,99 0,98 0,96 0,90 0,82 0,74 0,66 0,58 0,52 0,47 0,40 0,36 0,32 0,27 0,22 0,19 0,15 0,12 0,10];

x2 = [- 0,3 -0,24 -0,18 -0,12 -0,06 0,06 0,02 0,18 0,24 0,3 0,36 0,42 0,48 0,54 0,6 0,62 0,78 0,7 0,84 0,9 0,96 1,02 1,08 1,14 1,2 1,26 1,32 1,38 1,44 1,5 1,56 1,62 1,68 1,74 1,8 1,86 1,92 1,98 2,04;y2 = [0,00 0,00 0,00 0,00 0,05 0,15 0,15 0,13 0,11 0,11 0,13 0,18 0,24 0,33 0,43 0,54 0,66 0,76 0,84 0,90 0,93 0,94 0,94 0,91 0,87 0,81 0,75 0,69 0,6 0,55 0,49 0,43 0,37 0,32 0,27 0,23 0,19 0,16 0,13 0,10];

1015;*

Сообщение об ошибке отображается следующим образом:

???Ошибка при использовании ==> interp1 при 172 NaN не подходит для X.

Ошибка в ==> sqrError при 2 y2sampledInx1 = interp1 (coeffs (1) * x2, y2, x1);

Ошибка в ==> @ (c) sqrError (c, x1, y1, x2, y2)

Ошибка в ==> nlconst при 805 f = feval (funfcn {3}, x, varargin{:});

Ошибка в ==> fmincon на 758 [X, FVAL, LAMBDA, EXITFLAG, OUTPUT, GRAD, HESSIAN] = ...

Ошибка в ==> coeffs = fmincon (@ (c) sqrError (c, x1, y1, x2, y2), A0, [], [], [], [], LB, UB, [], параметры);

Что не так в коде и как мне с этим обходиться.Спасибо за помощь.

1 Ответ

2 голосов
/ 07 февраля 2012

Ваше масштабирование, вероятно, выталкивает интерполированную ось из диапазона оси X данных. т.е.

x1 max (x2 * coeffs (1)) по крайней мере для одного x1 и значения коэффициентов (1), выбранного алгоритмом подбора

Это можно исправить, указав значение экстраполяции для данных вне диапазона. Кроме того, вы можете использовать экстраполяцию, чтобы угадать эти значения. Так что попробуйте один из этих

y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1,'Linear', 'Extrap');
y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1,'Linear', Inf);
y2sampledInx1 = interp1(coeffs(1)*x2,y2,x1,'Linear', 1E18); %if Inf messes with the algorithm
...