non linear fitting with subroutine

1 次查看(过去 30 天)
Hi everybody,
I am trying to make a fit with a non linear recursive function but it appears that my code does not work.
The code is as follow
close all
clear
load 'teffe_10jumps_from_393_tann100sec_withtau.txt'
teffe_10jumps_from_393_tann100sec_withtau;
t=teffe_10jumps_from_393_tann100sec_withtau(:,1);
T=teffe_10jumps_from_393_tann100sec_withtau(:,2);
teffe=teffe_10jumps_from_393_tann100sec_withtau(:,5);
tau=teffe_10jumps_from_393_tann100sec_withtau(:,4);
A=exp(-274);
x=0.35;
C=1e5;
beta=0.25;
t_ann=t(1:211);
T_ann=T(1:211);
teffe_ann=teffe(1:211);
tau_ann=tau(1:211);
b0=[exp(-274),0.25,1e5,0.35];
lb=[0,0,1e3,0];
ub=[1e-100,1,1e8,1];
f=@(b) teffefit_rout(t_ann,T_ann,b);
z=@(b) norm(teffe_ann(11:end)-f(b));
problem = createOptimProblem('fmincon', 'x0',b0, 'objective',z,'lb',lb,'ub',ub);
gs = GlobalSearch('PlotFcns',@gsplotbestf);
[b,fval] = run(gs,problem)
The subroutine teffefit_rout is reported below
function [Tf]=teffefit(t,T,b)
Dt0=diff(t);
Dtin=0;
Dt=[0 Dt0'];
DT0=diff(T);
DTin=0;
DT=[DTin DT0'];
teffe=zeros(length(t),1);
tau0=zeros(length(t),1);
teffe(1)=T(1);
tau0(1)= b(1)*exp(b(2)*b(3)/T(1)+(1-b(2))*b(3)/teffe(1));
for i=2:length(t);
tau0(i)=@(T) b(1)*exp(b(2)*b(3)/T+(1-b(2))*b(3)/teffe(i-1));
s2=0;
for j=2:i;
s1=0;
for h=j:i;
s1=s1+Dt(h)/tau0(h);
end;
s2= s2+DT(j)*(1-exp(-(s1^b(4))));
end;
teffe(i)=teffe(1)+s2;
end;
Tf=teffe(11:end);
All functions in a script must be closed with an 'end'.

Error in connector.internal.fevalMatlab

Error in connector.internal.fevalJSON
How can I fix the problem in my code. Attached there is the file that I load to make the test.
Thank you!
  5 个评论
Adam Danz
Adam Danz 2022-8-6
ah, I see that comment now. Thanks @Torsten.
After I add the "end" and change the function name, the next error I see is a "Conversion to double from function_handle" error but I'll let the OP pick it up from here and add some more information.
Daniele Sonaglioni
编辑:Daniele Sonaglioni 2022-8-8
Hi @Adam Danz, sorry for the poorness of my previous explanation.
I am trying to optimize the function in teffefit_rout: it is an iterative function that compute the array Tf, given other two array namen t_ann and T_ann. I want to optimize the array Tf on some simulated data, that in the main code are named as teffe_ann.
The problem is that it seem that the code do not responds to changes in the initial conditions (named b0 in the main code). I also know what are the correct parameter, and they are reported as well, in the main code and are named A, x, C, beta. In general, the fit does not work because it is unable to give me the correct parameters of the model.
I don't know how to modify the main code or the subroutine to make the fit working.

请先登录,再进行评论。

采纳的回答

Varun
Varun 2023-10-26
Hi Daniele,
Looks like you are facing errors while executing the MATLAB code snippet which you have provided.
I have debugged the code and figured out the issues. After fixing following issues, the code executed successfully.
  1. Rename function name "teffefit " to "teffefit_rout" as you are calling by this name.
  2. You have declared "tau0=zeros(length(t),1);" which means that "tau0" is a column vector of length "t" with all the values initialized to zero. But later you are trying to initialize these values with a function handle in "tau0(i)=@(T) b(1)*exp(b(2)*b(3)/T+(1-b(2))*b(3)/teffe(i-1));" which is not allowed. So, replace this line with something like "tau0_func_handle=@(T) b(1)*exp(b(2)*b(3)/T+(1-b(2))*b(3)/teffe(i-1));" and use "tau0_func_handle(h)" instead of "tau0(h)" as "s1=s1+Dt(h)/ tau0_func_handle(h);".
  3. Put an "end" after "Tf=teffe(11:end);" for the function "teffefit_rout".
  4. Avoid unnecessary semi-colons.
Please find below the updated code which is running without any errors:
close all
clear
load 'teffe_10jumps_from_393_tann100sec_withtau.txt'
teffe_10jumps_from_393_tann100sec_withtau;
t=teffe_10jumps_from_393_tann100sec_withtau(:,1);
T=teffe_10jumps_from_393_tann100sec_withtau(:,2);
teffe=teffe_10jumps_from_393_tann100sec_withtau(:,5);
tau=teffe_10jumps_from_393_tann100sec_withtau(:,4);
A=exp(-274);
x=0.35;
C=1e5;
beta=0.25;
t_ann=t(1:211);
T_ann=T(1:211);
teffe_ann=teffe(1:211);
tau_ann=tau(1:211);
b0=[exp(-274),0.25,1e5,0.35];
lb=[0,0,1e3,0];
ub=[1e-100,1,1e8,1];
f=@(b) teffefit_rout(t_ann,T_ann,b);
z=@(b) norm(teffe_ann(11:end)-f(b));
problem = createOptimProblem('fmincon', 'x0',b0, 'objective',z,'lb',lb,'ub',ub);
gs = GlobalSearch('PlotFcns',@gsplotbestf);
[b,fval] = run(gs,problem)
function [Tf]=teffefit_rout(t,T,b)
Dt0=diff(t);
Dtin=0;
Dt=[0 Dt0'];
DT0=diff(T);
DTin=0;
DT=[DTin DT0'];
teffe=zeros(length(t),1);
tau0=zeros(length(t),1);
teffe(1)=T(1);
tau0(1)= b(1)*exp(b(2)*b(3)/T(1)+(1-b(2))*b(3)/teffe(1));
for i=2:length(t)
tau0_func_handle=@(T) b(1)*exp(b(2)*b(3)/T+(1-b(2))*b(3)/teffe(i-1));
s2=0;
for j=2:i
s1=0;
for h=j:i
s1=s1+Dt(h)/tau0_func_handle(h);
end
s2= s2+DT(j)*(1-exp(-(s1^b(4))));
end
teffe(i)=teffe(1)+s2;
end
Tf=teffe(11:end);
end
Here is the output of above corrected code:

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Linear and Nonlinear Regression 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by