System identification Windkessel - pulse wave
11 views (last 30 days)
Show older comments
David Hatle
on 4 Mar 2017
Commented: Rodrigo Vialle
on 30 Jul 2019
Hello, I would like to know if there is any way how to identify parameters if I have specified input to model and desired output. To be more specific I am modelling Windkessel model. It´s electrical model from two resistors one inductor and one capacitor. Wanted output is pulse wave.
Model:

And this is desired output of model (voltage at resistor R):

Can anyone help me please? Thank you
1 Comment
Accepted Answer
Star Strider
on 4 Mar 2017
Edited: Star Strider
on 4 Mar 2017
If you provide the input and output as a ‘.mat’ file, and your model, it should be possible to derive the component values. (I can derive a circuit model for it if you want.)
You aren’t doing system identification since you already have a model for your system. You’re doing parameter estimation of your model.
EDIT —
The circuit model I derived for your model (I let the Symbolic Math Toolbox do the algebra) is:
syms C L R r Pi Po P2 s t
Z1 = 1/r;
Z2 = s*C + 1/R;
Z3 = 1/(s*L);
Zt = Z1 + Z2 + Z3;
I = Pi/Zt;
Po = Z2*I;
Out = ilaplace(partfrac(Po, s));
Out = simplify(Out, 'Steps',20);
Out_fcn = matlabFunction(Out, 'Vars',{t,Pi,r,C,R,L})
Out_fcn = @(t,Pi,r,C,R,L) Pi.*dirac(t)-(Pi.*exp((t.*(R+r).*(-1.0./2.0))./(C.*R.*r)).*(cosh((1.0./sqrt(L).*t.*sqrt(L.*R.^2+L.*r.^2-C.*R.^2.*r.^2.*4.0+L.*R.*r.*2.0).*(1.0./2.0))./(C.*R.*r))-1.0./sqrt(L).*sinh((1.0./sqrt(L).*t.*sqrt(L.*R.^2+L.*r.^2-C.*R.^2.*r.^2.*4.0+L.*R.*r.*2.0).*(1.0./2.0))./(C.*R.*r)).*(L.*r+L.*R-C.*R.*r.^2.*2.0).*1.0./sqrt(L.*R.^2+L.*r.^2-C.*R.^2.*r.^2.*4.0+L.*R.*r.*2.0)))./(C.*r);
The ‘Z’ values are the three lumped impedances (and ‘Zt’, the total impedance), where the output is taken across ‘Z2’. The idea is straightforward: the current ‘I’ (or blood flow here) through the series of impedances is simply ‘Pi/Zt’. It is then straightforward to calculate the voltage (or pressure) drop across ‘Z2’ as ‘Z2*I’.
In order to fit your function and estimate the parameters, we need three data vectors: ‘t’, ‘Pi’, and ‘Po’, the time, input pressure with respect to time, and output pressure with respect to time. The function fits the output pressure it estimates with specific parameters to the ‘Po’ vector.
The procedure for estimating the parameters would then be:
% % % MAPPING: b(1) = r, b(2) = C, b(3) = R, b(4) = L
Out_fcn = @(t,Pi,r,C,R,L) Pi.*dirac(t)-(Pi.*exp((t.*(R+r).*(-1.0./2.0))./(C.*R.*r)).*(cosh((1.0./sqrt(L).*t.*sqrt(L.*R.^2+L.*r.^2-C.*R.^2.*r.^2.*4.0+L.*R.*r.*2.0).*(1.0./2.0))./(C.*R.*r))-1.0./sqrt(L).*sinh((1.0./sqrt(L).*t.*sqrt(L.*R.^2+L.*r.^2-C.*R.^2.*r.^2.*4.0+L.*R.*r.*2.0).*(1.0./2.0))./(C.*R.*r)).*(L.*r+L.*R-C.*R.*r.^2.*2.0).*1.0./sqrt(L.*R.^2+L.*r.^2-C.*R.^2.*r.^2.*4.0+L.*R.*r.*2.0)))./(C.*r);
t = t(:); % Column Vector
Pi = Pi(:); % Column Vector
Po = Po(:); % Column Vector
b0 = ['Initial Parameter Estimates For r,C,R,L — IN THAT ORDER — As A Vector'];
nrmrsd = @(b) norm(Po - Out_fcn(t,Pi,b(1),b(2),b(3),b(4))); % Norm Of Residuals (Errors)
bvals = fminsearch(nrmrsd, b0);
The ‘bvals’ vector will be the estimated parameters.
NOTE — This is UNTESTED CODE since I do not have your data to test it with.
24 Comments
Star Strider
on 14 Mar 2017
I am not aware of any way to convert units of liquid pressure, flow, and resistance to electrical units. (The exception being calibrated transducers where a transducer would be calibrated in terms of volt/torr or some such.) They are completely different physical properties. You would probably have to go back to the original definitions of the relevant units to see if you could determine direct relationships between them. (Blood has a critical Reynolds number of 2000 if I remember correctly, and while it generally stays below that value, blood is non-Newtonian and has nonlinear characteristics.)
I have never seen any conversions, but they may exist. I am not certain how to search the literature or the Internet for such information, although a physiology reference text could have them. A brief search found Units and Conversion Factors and List of equations in fluid mechanics. A more extensive search could discover what you want.
More Answers (1)
John BG
on 4 Mar 2017
Edited: John BG
on 4 Mar 2017
Hi David
1.
I have simulated the circuit of your question in ADS and I get the following transient


2.
tuning C1 and L1 both min values

3.
C2 and L1 both max values

4.
R2 value is quite irrelevant, the one that counts is R1/R2 it has to be kept small
5.
In MATLAB you can either build a model from ground zero, or could start with Simulink. Do you have Simscape?
So, David
if you find this answer useful would you please be so kind to mark my answer as Accepted Answer?
To any other reader, please if you find this answer of any help solving your question,
please click on the thumbs-up vote link,
thanks in advance
John BG
3 Comments
John BG
on 5 Mar 2017
1.
I use MATLAB as often as possible, but for the task you asked to solve and for the time I allocated to your question, ADS save time, even if using Simscape.
2.
So, Simscapte it is, would you please attach to your question your Simscape circuit?
3.
Also, do you want to generate an ECG signal, or the wavelet transform of an ECG?
4.
Would the following in anyway help?
the Illustrated wavelet transform, by Paul Addison, CRC press, page 297

See Also
Categories
Find more on Transform Data in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!