Fonction d'interfaçage
fr
Sigbuilder
function [x,y,typ]=Sigbuilder(job,arg1,arg2)
x=[];y=[],typ=[]
select job
case 'plot' then
standard_draw(arg1)
case 'getinputs' then
[x,y,typ]=standard_inputs(arg1)
case 'getoutputs' then
[x,y,typ]=standard_outputs(arg1)
case 'getorigin' then
[x,y]=standard_origin(arg1)
case 'set' then
//paths to updatable parameters or states
ppath = list(1,3)
newpar=list();
y=0;
for path=ppath do
np=size(path,'*')
spath=list()
for k=1:np
spath($+1)='model'
spath($+1)='rpar'
spath($+1)='objs'
spath($+1)=path(k)
end
xx=arg1(spath)// get the block
execstr('xxn='+xx.gui+'(''set'',xx)')
if diffobjs(xxn,xx) then
model=xx.model
model_n=xxn.model
if ~is_modelica_block(xx) then
modified=or(model.sim<>model_n.sim)|..
~isequal(model.state,model_n.state)|..
~isequal(model.dstate,model_n.dstate)|..
~isequal(model.odstate,model_n.odstate)|..
~isequal(model.rpar,model_n.rpar)|..
~isequal(model.ipar,model_n.ipar)|..
~isequal(model.opar,model_n.opar)|..
~isequal(model.label,model_n.label)
if or(model.in<>model_n.in)|or(model.out<>model_n.out)|..
or(model.in2<>model_n.in2)|or(model.out2<>model_n.out2)|..
or(model.outtyp<>model_n.outtyp)|or(model.intyp<>model_n.intyp) then
needcompile=1
end
if or(model.firing<>model_n.firing) then
needcompile=2
end
if (size(model.in,'*')<>size(model_n.in,'*'))|..
(size(model.out,'*')<>size(model_n.out,'*')) then
needcompile=4
end
if model.sim=='input'|model.sim=='output' then
if model.ipar<>model_n.ipar then
needcompile=4
end
end
if or(model.blocktype<>model_n.blocktype)|..
or(model.dep_ut<>model_n.dep_ut) then
needcompile=4
end
if (model.nzcross<>model_n.nzcross)|(model.nmode<>model_n.nmode) then
needcompile=4
end
if prod(size(model_n.sim))>1 then
if model_n.sim(2)>1000 then
if model.sim(1)<>model_n.sim(1) then
needcompile=4
end
end
end
else
modified=or(model_n<>model)
eq=model.equations;eqn=model_n.equations;
if or(eq.model<>eqn.model)|or(eq.inputs<>eqn.inputs)|..
or(eq.outputs<>eqn.outputs) then
needcompile=4
end
end
//parameter or states changed
arg1(spath)=xxn// Update
newpar(size(newpar)+1)=path// Notify modification
y=max(y,needcompile)
end
end
x=arg1
typ=newpar
case 'define' then
scs_m_1=scicos_diagram(..
version="scicos4.2",..
props=scicos_params(..
wpar=[600,450,0,0,600,450],..
Title=["Sigbuilder","./"],..
tol=[0.0001;0.000001;1.000D-10;100001;0;0;0],..
tf=100,..
context=" ",..
void1=[],..
options=tlist(["scsopt","3D","Background","Link","ID","Cmap"],list(%t,33),[8,1],[1,5],..
list([5,1],[4,1]),[0.8,0.8,0.8]),..
void2=[],..
void3=[],..
doc=list()))
scs_m_1.objs(1)=scicos_block(..
gui="CURVE_c",..
graphics=scicos_graphics(..
orig=[329.63473,606.18517],..
sz=[40,40],..
flip=%t,..
theta=0,..
exprs=["3";"[0,1,2]";"[10,20,-30]";"y";"n"],..
pin=[],..
pout=6,..
pein=4,..
peout=2,..
gr_i=list(..
["rpar=arg1.model.rpar;n=model.ipar(1);order=model.ipar(2);";
"xx=rpar(1:n);yy=rpar(n+1:2*n);";
"[XX,YY,rpardummy]=Do_Spline(n,order,xx,yy)";
"xmx=maxi(XX);xmn=mini(XX);";
"ymx=maxi(YY);ymn=mini(YY);";
"dx=xmx-xmn;if dx==0 then dx=maxi(xmx/2,1);end";
"xmn=xmn-dx/20;xmx=xmx+dx/20;";
"dy=ymx-ymn;if dy==0 then dy=maxi(ymx/2,1);end;";
"ymn=ymn-dy/20;ymx=ymx+dy/20;";
"xx2=orig(1)+sz(1)*((XX-xmn)/(xmx-xmn));";
"yy2=orig(2)+sz(2)*((YY-ymn)/(ymx-ymn));";
"xset(''color'',2)";
"xpoly(xx2,yy2,''lines'');"],8),..
id="",..
in_implicit=[],..
out_implicit="E"),..
model=scicos_model(..
sim=list("curve_c",4),..
in=[],..
in2=[],..
intyp=1,..
out=1,..
out2=[],..
outtyp=1,..
evtin=1,..
evtout=1,..
state=[],..
dstate=[],..
odstate=list(),..
rpar=[0;1;2;10;20;-30],..
ipar=[3;3;1],..
opar=list(),..
blocktype="c",..
firing=0,..
dep_ut=[%f,%t],..
label="",..
nzcross=0,..
nmode=0,..
equations=list()),..
doc=list())
scs_m_1.objs(2)=scicos_link(..
xx=[349.63473;349.49528],..
yy=[600.47089;565.10704],..
id="drawlink",..
thick=[0,0],..
ct=[5,-1],..
from=[1,1,0],..
to=[3,1,1])
scs_m_1.objs(3)=scicos_block(..
gui="CLKSPLIT_f",..
graphics=scicos_graphics(..
orig=[349.49528;565.10704],..
sz=[0.3333333,0.3333333],..
flip=%t,..
theta=0,..
exprs=[],..
pin=[],..
pout=[],..
pein=2,..
peout=[8;4],..
gr_i=list([],8),..
id="",..
in_implicit=[],..
out_implicit=[]),..
model=scicos_model(..
sim="split",..
in=[],..
in2=[],..
intyp=1,..
out=[],..
out2=[],..
outtyp=1,..
evtin=1,..
evtout=[1;1],..
state=[],..
dstate=[],..
odstate=list(),..
rpar=[],..
ipar=[],..
opar=list(),..
blocktype="d",..
firing=[%f,%f,%f],..
dep_ut=[%f,%f],..
label="",..
nzcross=0,..
nmode=0,..
equations=list()),..
doc=list())
scs_m_1.objs(4)=scicos_link(..
xx=[349.49528;266.69602;266.69602;270.35525;342.80795;342.80795;349.63473],..
yy=[565.10704;565.10704;680.99483;680.99483;680.99483;651.89946;651.89946],..
id="drawlink",..
thick=[0,0],..
ct=[5,-1],..
from=[3,2,0],..
to=[1,1,1])
scs_m_1.objs(5)=scicos_block(..
gui="OUT_f",..
graphics=scicos_graphics(..
orig=[398.20616,616.18517],..
sz=[20,20],..
flip=%t,..
theta=0,..
exprs="1",..
pin=6,..
pout=[],..
pein=[],..
peout=[],..
gr_i=list(" ",8),..
id="",..
in_implicit="E",..
out_implicit=[]),..
model=scicos_model(..
sim="output",..
in=-1,..
in2=-2,..
intyp=-1,..
out=[],..
out2=[],..
outtyp=1,..
evtin=[],..
evtout=[],..
state=[],..
dstate=[],..
odstate=list(),..
rpar=[],..
ipar=1,..
opar=list(),..
blocktype="c",..
firing=[],..
dep_ut=[%f,%f],..
label="",..
nzcross=0,..
nmode=0,..
equations=list()),..
doc=list())
scs_m_1.objs(6)=scicos_link(..
xx=[378.20616;398.20616],..
yy=[626.18517;626.18517],..
id="drawlink",..
thick=[0,0],..
ct=[1,1],..
from=[1,1,0],..
to=[5,1,1])
scs_m_1.objs(7)=scicos_block(..
gui="CLKOUTV_f",..
graphics=scicos_graphics(..
orig=[339.49528,505.10704],..
sz=[20,30],..
flip=%t,..
theta=0,..
exprs="1",..
pin=[],..
pout=[],..
pein=8,..
peout=[],..
gr_i=list(" ",8),..
id="",..
in_implicit=[],..
out_implicit=[]),..
model=scicos_model(..
sim="output",..
in=[],..
in2=[],..
intyp=1,..
out=[],..
out2=[],..
outtyp=1,..
evtin=1,..
evtout=[],..
state=[],..
dstate=[],..
odstate=list(),..
rpar=[],..
ipar=1,..
opar=list(),..
blocktype="d",..
firing=[],..
dep_ut=[%f,%f],..
label="",..
nzcross=0,..
nmode=0,..
equations=list()),..
doc=list())
scs_m_1.objs(8)=scicos_link(..
xx=[349.49528;349.49528],..
yy=[565.10704;535.10704],..
id="drawlink",..
thick=[0,0],..
ct=[5,-1],..
from=[3,1,0],..
to=[7,1,1])
model=scicos_model(..
sim="csuper",..
in=[],..
in2=[],..
intyp=1,..
out=-1,..
out2=[],..
outtyp=1,..
evtin=[],..
evtout=1,..
state=[],..
dstate=[],..
odstate=list(),..
rpar=scs_m_1,..
ipar=[],..
opar=list(),..
blocktype="h",..
firing=[],..
dep_ut=[%f,%f],..
label="",..
nzcross=0,..
nmode=0,..
equations=list())
// gr_i='xstringb(orig(1),orig(2),''Sigbuilder'',sz(1),sz(2),''fill'')';
gr_i=['ipar=arg1.model.rpar.objs(1).model.ipar';
'rpar=arg1.model.rpar.objs(1).model.rpar';
'n=ipar(1);order=ipar(2);';
'xx=rpar(1:n);yy=rpar(n+1:2*n);';
'[XX,YY,rpardummy]=Do_Spline2(n,order,xx,yy)';
'xmx=maxi(XX);xmn=mini(XX);';
'ymx=maxi(YY);ymn=mini(YY);';
'dx=xmx-xmn;if dx==0 then dx=maxi(xmx/2,1);end';
'xmn=xmn-dx/20;xmx=xmx+dx/20;';
'dy=ymx-ymn;if dy==0 then dy=maxi(ymx/2,1);end;';
'ymn=ymn-dy/20;ymx=ymx+dy/20;';
'rect=[xmn,ymn;xmx,ymx];';
'xx2=orig(1)+sz(1)*((XX-xmn)/(xmx-xmn));';
'yy2=orig(2)+sz(2)*((YY-ymn)/(ymx-ymn));';
'xset(''color'',2)';
'xpoly(xx2,yy2,''lines'');']
x=standard_define([2 2],model,[],gr_i)
end
endfunction
//=========================================================
function [X,Y,orpar]=Do_Spline2(N,order,x,y)
X=[];Y=[];orpar=[];
METHOD=getmethod(order);
if (METHOD=='zero order') then
X=x(1);Y=y(1);
for i=1:N-1
X=[X;x(i);x(i+1);x(i+1)];
Y=[Y;y(i);y(i);y(i+1)];
end
return;
end
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (METHOD=='linear') then
X=[];
for i=1:N
X=[X;x(i)];
Y=[Y;y(i)];
end
return;
end
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (N<20) then NP=4;else
if (N<40) then NP=2;else
if (N<100) then NP=1;else
NP=0;end;end;
end
for i=1:N-1
X=[X;linspace(x(i),x(i+1),NP+2)']; // pour tous sauf "linear" et "zero order"
end
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (N>2) & (METHOD=='order 2') then
Z=ORDER2(x,y);
A=Z(1:N-1);
B=Z(N:2*N-2);
C=Z(2*N-1:3*N-3);
for j=1:size(X,'*')
for i=N-1:-1:1
if X(j)>=x(i) then,break;end
end
Y(j)=A(i)*(X(j)-x(i))^2+B(i)*(X(j)-x(i))+C(i);
end
orpar=matrix(Z,-1,1)
end
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (METHOD=='not_a_knot') then
try
d = splin(x, y, METHOD);
Y = interp(X, x, y, d);
orpar=d(:);
catch
xinfo('ERROR in SPLINE: '+METHOD)
end
end
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (METHOD=='periodic') then
if y(1)<>y(N) then
y(N)=y(1)
end
try
d = splin(x, y,METHOD);
Y = interp(X, x, y, d);
orpar=d(:);
catch
xinfo('ERROR in SPLINE: '+METHOD)
end
end
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (METHOD=='monotone' ) then
try
d = splin(x, y, METHOD);
Y = interp(X, x, y, d);
orpar=d(:);
catch
xinfo('ERROR in SPLINE: '+METHOD)
end
end
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (METHOD=='fast') then
try
d = splin(x, y, METHOD);
Y = interp(X, x, y, d);
orpar=d(:);
catch
xinfo('ERROR in SPLINE: '+METHOD)
end
end
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (METHOD=='clamped') then
try
d = splin(x, y, METHOD,[0;0]);
Y = interp(X, x, y, d);
orpar=d(:);
catch
xinfo('ERROR in SPLINE: '+METHOD)
end
end
endfunction
function METHOD=getmethod(order)
select order
case 0 then, METHOD='zero order'
case 1 then, METHOD='linear'
case 2 then, METHOD='order 2'
case 3 then, METHOD='not_a_knot'
case 4 then, METHOD='periodic'
case 5 then, METHOD='monotone'
case 6 then, METHOD='fast'
case 7 then, METHOD='clamped'
end
endfunction
function [Z]=ORDER2(x,y)
N=size(x,'*')-1;
A=zeros(3*N-1,N*3);
B=zeros(3*N-1,1);
for i=1:N
j=3*(i-1)+1;
A(j,i+2*N)=1;
B(j)=y(i);
A(j+1,i)=(x(i+1)-x(i))^2;
A(j+1,i+N)=x(i+1)-x(i);
A(j+1,i+2*N)=1;
B(j+1)=y(i+1);
end
for i=1:N-1
j=3*(i-1)+1;
A(j+2,i)=2*(x(i+1)-x(i));
A(j+2,i+N)=1;
A(j+2,i+N+1)=-1;
end
Q=zeros(3*N,3*N);
for i=1:N
Q(i,i)=4*(x(i+1)-x(i))^2
Q(i,i+N)=2*(x(i+1)-x(i))
Q(i+N,i)=2*(x(i+1)-x(i))
Q(i+N,i+N)=1;
end
At=[Q,A';A,zeros(3*N-1,3*N-1)]
Bt=[zeros(3*N,1);B]
Zt=At\Bt;
Z=Zt(1:3*N,1)
endfunction
//===================================================