X__
X__

Reputation: 89

Matlab error with nlinfit

I'm attempting to get the nonlinear least squares fit of the following equation:

y = 1 / (1 + a (ln(duration)^b))

The data I wish to fit this to is presented below, as is my attempt to use the nlinfit function to solve it...

x = [1.99000000000000;3.01000000000000;4.01000000000000;5.09000000000000;5.77000000000000;6.85000000000000;7.72000000000000;8.87000000000000;9.56000000000000;];
y = [1;1;0.800000000000000;0.730000000000000;0.470000000000000;0.230000000000000;0.270000000000000;0.100000000000000;0.100000000000000;];

plot(x,y,'o','linestyle','none');

p(1) = 1;
p(2) = 1;

fun = @(p,x) 1 / (1 + p(1).*(log(x).^p(2)));

myfit = nlinfit(x,y,fun,p);

My problem seems to be with defining the fourth required input for the nlinfit function ('p' in the example above). The documentation doesn't give a clear explanation of what is needed for this to work, and I can't solve the problem based on the error messages I receive:

??? Error using ==> nlinfit at 128 MODELFUN should return a vector of fitted values the same length as Y.

Error in ==> fitting at 14 myfit = nlinfit(x,y,fun,p);

I've tried setting p to repmat(1,9,1) and repmat(1,1,9), but neither of these seem to solve my problem. Any help would be greatly appreciated!

Upvotes: 0

Views: 926

Answers (1)

yuk
yuk

Reputation: 19870

I believe you forgot the dot to do element-wise deletion in the function:

fun = @(p,x) 1 ./ (1 + p(1).*(log(x).^p(2)));
               ^

Upvotes: 1

Related Questions