Я работаю над подгонкой двух уравнений с общей переменной и аргументами. код как показано ниже:
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](https://www.dropbox.com/s/y2u0ytti2lfr94r/data.xlsx?dl=0)