Asked by Sumera Yamin
on 16 May 2018 at 16:09

%% Here is my code.

[data]=[0 0 0.050000000000000 1.108646244630E-01 0.100000000000000 2.217423074817E-01 0.150000000000000 3.325947375398E-01 0.200000000000000 4.434863433851E-01 0.250000000000000 5.543595496420E-01 0.300000000000000 6.652338361973E-01 0.350000000000000 7.761094191116E-01 0.400000000000000 8.869865144820E-01 0.450000000000000 9.978653384221E-01 0.500000000000000 1.108746107036E+00]';

x=data(:,1);

y=data(:,2);

k=0.3 %fixed

l=0.01 %variable, can have any value to fit the linear part

f=cos(k*l)^2 % function to fit

I will be highly grateful if anyone can help me on this problem. Thank you very much.

Answer by Rik Wisselink
on 16 May 2018 at 16:52

Edited by Rik Wisselink
on 17 May 2018 at 9:44

Accepted Answer

You can use the code below to choose a value for l that results in the least difference between the actual data and the output defined by `f`. (Also, you should avoid the use of the lowercase L as a variable name, because it looks very similar to a 1 or I (one, uppercase i))

In future, you should use the **{}Code** button to make sure your code in ready to copy and paste to Matlab.

data=[0 0; 0.05 1.108646244630E-01; 0.10 2.217423074817E-01; 0.15 3.325947375398E-01; 0.20 4.434863433851E-01; 0.25 5.543595496420E-01; 0.30 6.652338361973E-01; 0.35 7.761094191116E-01; 0.40 8.869865144820E-01; 0.45 9.978653384221E-01; 0.50 1.108746107036E+00];

% Objective function k=0.3;%fixed f=@(l,x) cos(k*l)^2.*x;% function to fit x=data(:,1); yx=data(:,2); intial_b_vals=0.01;

% Ordinary Least Squares cost function OLS = @(b) sum((f(b,x) - yx).^2); opts = optimset('MaxFunEvals',50000, 'MaxIter',10000); % Use 'fminsearch' to minimise the 'OLS' function fitted_b = fminsearch(OLS, intial_b_vals, opts);

For me, this results in `l` having an optimal value of 0.

Rik Wisselink
on 17 May 2018 at 13:12

You need to read the doc for anonymous functions. Those should cover most of your question here. Setting a limit on the max value of l will not help, because it will go to 0 (unless you set a negative value as the max). Setting a constraint is not possible with this function, but you can add a term that sets the result to infinity:

OLS_con = @(b) sum((f(b,x) - yx).^2)+... 1/(b>0.1)-1;%set cost function to inf when (b>0.1) is false

Sumera Yamin
on 18 May 2018 at 12:02

Rik Wisselink
on 19 May 2018 at 8:56

Same idea as above:

OLS_con = @(b) sum((f(b,x) - yx).^2)+... 1/(b>0.1)-1+... 1/(0<k*b & k*b<pi/2)

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.