Setting constraint between estimation parameters in nonlinear grey box estimation
30 次查看(过去 30 天)
显示 更早的评论
I am trying to estimate an ODE with 9 parameters (1 fixed), denotes the params 5, 6, 7 as c1, c2, c3 respectively. I would like to impose a constraint on them as -\sqrt(4*c1*c3)< c2 < -\sqrt(3*c1*c3) (constraint for the third-order polynomial f(x) to have 2 extremum points x1, x2, lying on the right, and f(x1)> f(x2) >0 ). I am setting the desired idea in the below code:
But the estimated results of c1, c2, c3 does not satisfy the constraint I am imposing. I am really appriciate any idea of diagnoising this issue, thank you so much!
params =
struct with fields:
a1: 21.2434
a2: 0.0359
a3: 66
a4: 0.8672
c1: 8.2572e+03
c2: -1.3108e+04
c3: 7.2092e+03
p2p: 8.5374
p2n: 58.0616
>> -sqrt(3*8.2572e+03*7.2092e+03)
ans =
-1.3364e+04
Here is the setup code
%%
ModelFile = 'HR_model_Conv_cadence_quad_c';
%p1 = 0.1;
%p2p = 10;
%p2n = 2;
Order = [2 2 1]; % 2 output, 2 input, 1 state
%Order = [1 2 1]; % 1 output, 2 input, 1 state - neglect the HR dot
Params_guess = [a1; a2; a3; a4; c1; c2; c3; p2p; p2n]
InitialStates_guess = x0
Ts_model = 0;
nlgr_conv = idnlgrey(ModelFile,Order, Params_guess,InitialStates_guess,Ts_model,'Name','Heart_Rate_Conv');
nlgr_conv.SimulationOptions.Solver = 'ode45';%ode15s
% a1
nlgr_conv.Parameters(1).Minimum = 0.01; %positive
% a2
nlgr_conv.Parameters(2).Minimum = 0.001;
% a3
nlgr_conv.Parameters(3).Minimum = Subject.HR_min;
nlgr_conv.Parameters(3).Fixed = true;
% a4
nlgr_conv.Parameters(4).Minimum = 0.1;
% c1
nlgr_conv.Parameters(5).Minimum = 0.001;
% c2
nlgr_conv.Parameters(6).Maximum = -sqrt(3*nlgr_conv.Parameters(5).Value * nlgr_conv.Parameters(7).Value );
nlgr_conv.Parameters(6).Minimum = -sqrt(4*nlgr_conv.Parameters(5).Value * nlgr_conv.Parameters(7).Value );
% c3
nlgr_conv.Parameters(7).Minimum = 0.001;
%p2p
nlgr_conv.Parameters(8).Minimum = 0.001;
%p2n
nlgr_conv.Parameters(9).Minimum = 0.001;
nlgr_conv = setinit(nlgr_conv, 'Fixed', {false}); % Estimate the initial states.
opt = nlgreyestOptions('Display', 'on');
opt.SearchOptions.MaxIterations = 1000;
opt.OutputWeight = diag([1 4]);
nlgr_conv = nlgreyest(meas_data, nlgr_conv, opt);
0 个评论
采纳的回答
Torsten
about 12 hours 前
编辑:Torsten
about 7 hours 前
I doubt that you can set lower and upper bounds on parameters as nonlinear functions of other parameters. In my opinion, Parameters.Minimum and Parameters.Maximum must be fixed real scalars.
This is confirmed by the description of "Parameters" under "Properties" here:
I guess that in the lines
nlgr_conv.Parameters(6).Maximum = -sqrt(3*nlgr_conv.Parameters(5).Value * nlgr_conv.Parameters(7).Value );
nlgr_conv.Parameters(6).Minimum = -sqrt(4*nlgr_conv.Parameters(5).Value * nlgr_conv.Parameters(7).Value );
the initial values for parameters 5 and 7 are used to set lower and upper bounds on parameter 6. But since your code doesn't show the initial values you use for the parameters, I cannot test this.
If you want to set more complicated constraints for the parameters than just fixed bounds, you will have to couple the ode integrator (e.g. "ode45") and "fmincon" (using "nonlcon" to set the nonlinear parameter constraints) directly.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Systems of Nonlinear Equations 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!