Сбой в оценке исходной целевой функции. LSQNONLIN не может продолжаться - PullRequest
1 голос
/ 30 марта 2019

Я работаю над подгонкой двух уравнений с общей переменной и аргументами. код как показано ниже:

    function F = myfun(params,c, tt, hh)
    F =[tt - params(2) - params(3) ./ (1 + params(3).^2 .* params(1).^2 .* (2.* pi.* freqs).^2),...
        hh +((2.* pi.* freqs) .* params(4) - params(3).^2 * params(1) .* (2.* pi.* freqs) ./ (1 + params(3).^2 .* params(1).^2 .* (2.* pi.* freqs).^2))];
end

Кривая подгонки:

lb = [0, 0, 0, 0, 1e10, 0, 0];
up = [inf,inf,inf,inf,inf,inf,inf];
params0 = [ 6e-8, 1.07e-7, 15, 10, 27e10, 0.29, 0.43e-6];

% options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective');

params = lsqnonlin(@myfun, params0, lb, up);

ошибка:

    Not enough input arguments.

Error in Untitled>myfun (line 98)
F =[real_new - params(2) - params(3) ./ (1 +
params(3).^2 .* params(1).^2 .* (2.* pi.*
freqs).^2),...

Error in lsqnonlin (line 206)
            initVals.F =
            feval(funfcn{3},xCurrent,varargin{:});

Error in Untitled (line 32)
params = lsqnonlin(@myfun, params0, lb, up);

Caused by:
    Failure in initial objective function
    evaluation. LSQNONLIN cannot continue.

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

...................................

Not enough input arguments, решаемый путем изменения myfun (который имеет больше аргументов и является более сложным), как показано ниже:

myfun = @(params)[tt - params(2) - ((2.* pi.* freqs).^2.*params(5).^2.*params(3))./(params(3).^2 + (2.* pi.* freqs).^2.*params(5).^2)...
    -(params(4).*(1-(2.* pi.* freqs).^2.*params(1).*params(7).*params(6).*params(4))...
    + ((2.* pi.* freqs).*params(7).*params(6).*params(4)).*((2 * pi.* freqs).*params(7).*Rp+ (2 * pi.* freqs).*params(7).*params(6)+(2 * pi.* freqs).*params(1).*params(4)))...
    ./((1-(2.* pi.* freqs).^2.*params(1).*params(7).*params(6).*params(4)).^2 +((2.* pi.* freqs).*params(7).*params(4)+ (2.* pi.* freqs).*params(7).*params(6)+(2.* pi.* freqs).*params(1).*params(4)).^2),...
    hh  +((2.* pi.* freqs).*params(5).*params(3).^2)./(params(3).^2 + (2.* pi.* freqs).^2.*params(5).^2)...
    -(params(4).*((2 * pi.* freqs).*params(7).*Rp+ (2 * pi.* freqs).*params(7).*params(6)+(2 * pi.* freqs).*params(1).*params(4)) - ((2.* pi.* freqs).*params(7).*params(6).*params(4))...
    .*(1-(2.* pi.* freqs).^2.*params(1).*params(7).*params(6).*params(4)))...
    ./((1-(2.* pi.* freqs).^2.*params(1).*params(7).*params(6).*params(4)).^2 ...
    + ((2.* pi.* freqs).*params(7).*params(4)+ (2.* pi.* freqs).*params(7).*params(6)+(2.* pi.* freqs).*params(1).*params(4)).^2)];

но новые ошибки:

Local minimum possible.

lsqnonlin stopped because the final change in the sum of squares relative to 
its initial value is less than the default value of the function tolerance.

<stopping criteria details>

Я пытался установить допуск:

options = optimoptions(@lsqnonlin,'Algorithm','trust-region-reflective','OptimalityTolerance',1e-8);

но это не сработало. какие-либо предложения? тестовые данные прилагаются. заранее спасибо datalink

...