Borrar filtros
Borrar filtros

Parameter identification with nlgreyest

6 visualizaciones (últimos 30 días)
A Afonja
A Afonja el 3 de Oct. de 2019
Respondida: A Afonja el 7 de Oct. de 2019
I have a non-linear model I want to fit into an available to identify system parameters. I have used nlgreyest but the result is very different from the behaviour of the avaialable data.
My ODE model . I want A,B and D to be the free parameters.
I have tried tightening the tolerance but the no improvement.
What I am looking for is how to set upper and lower bounds for these parameters since I have an idea of what they could be.

Respuestas (3)

Alex Sha
Alex Sha el 6 de Oct. de 2019
Hi, would you please attach your data.

A Afonja
A Afonja el 7 de Oct. de 2019
clc
clear all
% i want to use this script to estimate damping
fprintf('ensure all PRT parameters are correct\n')
xt=0.1; %% ART width [m]
wr=0.17; %% reservoir length [m]
wd=0.514; %% duct length [m]
hd=0.17; %% Duct height [m]
w=wd+wr; %% reservoir distance [m]
hr= 0.235; %% Datum level [m]
ht=0.610; %% total height of tank [m]
rd= 0.058; %% COG distance from duct c/l []
% r1=0.065; %% inner fllet radius
% r2= 0.115; %% external fillet raduis
rho=997.561; %% mass density of fluid in U ART [kg/m^3]
g=9.81; %% acceleration due to gravity[m/s^2]
% q=0.022; %% this is the coefficient of resistance derived from experiement or estimated
% WWeight=(((hr+hd/2)*wr)*2 + (wd*hd))*xt*rho; %% weight of water in tank
%% tank properties
Vt=wr*xt*(2*hr+w*wr/hd);
alfa3=g*rho*xt*wr*w;
alfa4=g*rho*xt*wr;
dn=0.02; %% this is an initial guess for nonlinear damping value
dl=0.02; %% this is an inital guess for linear damping value
%% Simulation result upload
TTRange=[1995,12.611455481821041]; %% in case you want to remove initial part part of the simulation use this to specify the index and time from where you want result to be used, if not use [1 0]
% TTRange=[1095,7.019779593687162];
%%% note the first item in TTRange is the index from where will begin and
%%% second item is time at that point
% TTRange=[1 0]; %if you dont want to cut result at anypart use this
Sim_R=readtable('leftdH_009.csv');
dH=Sim_R.leftdHMonitor_LeftdHMonitor(TTRange(1):end); %1742
Times=Sim_R.Time(TTRange(1):end)-TTRange(2);% this operation shift the simulation time to zero if you have chosen to remove the early part of result.
Sim_Vel=readtable('leftdHVel_009.csv');
Vel=Sim_Vel.VelocityLevelLeftMonitor_VelocityLevelLeftMonitor_m_s_(TTRange(1):end);
% calculate acceleartion from velocity
% Accel=zeros(length(Vel),1);
Accel=diff(Vel)./(diff(Times));
Accel(end+1)=Accel(end);
%%% CFD result not in fixed time step, use cubline spline to get result at
%%% equally spaced time step
ddt=0.01;%% sampel interval for spline curve
Inter_time=(0:ddt:floor(Times(end)))';
Inter_dH=interp1(Times,dH,Inter_time,'spline');
Inter_Vel=interp1(Times,Vel,Inter_time,'spline');
Inter_Accel=diff(Inter_Vel)./(diff(Inter_time));
Inter_Accel(end+1)=Inter_Accel(end);
%% concatenate the vector of accel, velocity and product of velocity
%%% a_tt*dh" + dl*dh' + dn*|dh'|*dh' + c_tt*dh=0
%%% lets keep only c_tt fixed
% A=[Accel*rho,Vel,Vel.*abs(Vel)];
%% Matrix MEthod 1 use to get some initial estimate of the parameters
%%
A=[Accel*rho,Vel,Vel.*abs(Vel)];
C=-2*alfa4*dH;
Coeef=pinv(A)*C;
VtFit=Coeef(1);
dlFit=Coeef(2);
dnFit=Coeef(3);
tspan=0:0.001:Times(end);
y0=[dH(1) Vel(1)];
% %% reconstruct using ODE45 for Matrix method 1
% [tfit,dHfit]=ode45(@(t,y) nonlinearODE(t,y,rho*VtFit,dlFit,dnFit,2*alfa4), tspan, y0);
% figNo = findobj('type','figure');figure(length(figNo)+1)
% plot(tfit,dHfit(:,1)); hold on
% plot(Times,dH)
% legend('data','CFD')
% hold off
%% Set up programe for optimization
data = iddata(Inter_dH,[],ddt,'Name','CFD_Model3D_009');%% iddata requires that the Output of experiement be a column vector
data.OutputName = 'Water Level';
data.OutputUnit = 'mm';
data.Tstart = 0;
data.TimeUnit = 's';
order = [1 0 2];
initial_states = [dH(1); Vel(1)];
Ts=0;
parameters = {rho,alfa4,VtFit,dlFit,dnFit};
% create the nonlinear model for nlgreyest
nonlinear_model = idnlgrey('Tank_non_linearLagrangian',order,parameters,initial_states,Ts);
% set free and fixed parameterts
setpar(nonlinear_model,'Fixed',{true true false false false});
%
setpar(nonlinear_model,'Minimum',{rho,alfa4,0.001, 0.001 dnFit});
setpar(nonlinear_model,'Maximum',{rho,alfa4,0.1, 5 0.1});
nonlinear_model = nlgreyest(data,nonlinear_model,'Display','Full');
% extract solution
Vt_est = nonlinear_model.Parameters(3).Value; %% rename the free parameter to what you want
dl_est = nonlinear_model.Parameters(4).Value; %% rename the free parameter to what you want
dn_est = nonlinear_model.Parameters(5).Value; %% rename the free parameter to what you want
% extract solution and standard deviation
[nonlinear_b_est, S_deviation] = getpvec(nonlinear_model,'free')
compare(data,nonlinear_model)

A Afonja
A Afonja el 7 de Oct. de 2019
I was able to ge the system identification that matches the CFD response but I would like to set some comtraints on the maximum and mininum valus for the free parameters

Categorías

Más información sobre Linear Model Identification en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by