Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
5.4.1 - English

Change language to:
Français - 日本語 - Português - Русский

Please note that the recommended version of Scilab is 2025.0.0. This page might be outdated.
See the recommended documentation of this function

Scilab help >> Differential calculus, Integration > odedc

odedc

discrete/continuous ode solver

Calling Sequence

yt=odedc(y0,nd,stdel,t0,t,f)

Arguments

y0

a real column vector (initial conditions), y0=[y0c;y0d] where y0d has nd components.

nd

an integer, dimension of y0d

stdel

a real vector with one or two entries, stdel=[h, delta] (with delta=0 as default value).

t0

a real scalar (initial time).

t

a real (row) vector, instants where yt is calculated.

f

an external i.e. a function or a character string or a list with calling sequence: yp=f(t,yc,yd,flag).

Description

y=odedc([y0c;y0d],nd,[h,delta],t0,t,f) computes the solution of a mixed discrete/continuous system. The discrete system state yd_k is embedded into a piecewise constant yd(t) time function as follows:

yd(t) = yd_k for t in 
[t_k=delay+k*h,t_(k+1)=delay+(k+1)*h] (with delay=h*delta).

The simulated equations are now:

dyc/dt = f(t,yc(t),yd(t),0),  for t in [t_k,t_(k+1)]
yc(t0) = y0c

and at instants t_k the discrete variable yd is updated by:

yd(t_k+) = f(yc(t_k-),yd(t_k-),1)

Note that, using the definition of yd(t) the last equation gives

yd_k = f (t_k,yc(t_k-),yd(t_(k-1)),1)  (yc is time-continuous: yc(t_k-)=yc(tk))

The calling parameters of f are fixed: ycd=f(t,yc,yd,flag); this function must return either the derivative of the vector yc if flag=0 or the update of yd if flag=1.

ycd=dot(yc) must be a vector with same dimension as yc if flag=0 and ycd=update(yd) must be a vector with same dimension as yd if flag=1.

t is a vector of instants where the solution y is computed.

y is the vector y=[y(t(1)),y(t(2)),...].

This function can be called with the same optional parameters as the ode function (provided nd and stdel are given in the calling sequence as second and third parameters). In particular integration flags, tolerances can be set. Optional parameters can be set by the odeoptions function.

An example for calling an external routine is given in SCIDIR/default/fydot2.f

External routines can be dynamically linked (see link).

Examples

//Linear system with switching input
deff('xdu=phis(t,x,u,flag)','if flag==0 then xdu=A*x+B*u; else xdu=1-u;end');
x0=[1;1];
A=[-1,2;-2,-1];
B=[1;2];
u=0;
nu=1;
stdel=[1,0];
u0=0;
t=0:0.05:10;
xu=odedc([x0;u0],nu,stdel,0,t,phis);
x=xu(1:2,:);
u=xu(3,:);
nx=2;
plot2d1('onn',t',x',[1:nx],'161');
plot2d2('onn',t',u',[nx+1:nx+nu],'000');
//Fortran external (see fydot2.f):
norm(xu-odedc([x0;u0],nu,stdel,0,t,'phis'),1)
//Sampled feedback
//
//        |     xcdot=fc(t,xc,u)
//  (system)   |
//        |     y=hc(t,xc)
//
//
//        |     xd+=fd(xd,y)
//  (feedback) |
//        |     u=hd(t,xd)
//
deff('xcd=f(t,xc,xd,iflag)',...
  ['if iflag==0 then '
   '  xcd=fc(t,xc,e(t)-hd(t,xd));'
   'else '
   '  xcd=fd(xd,hc(t,xc));'
   'end']);
A=[-10,2,3;4,-10,6;7,8,-10];
B=[1;1;1];
C=[1,1,1];
Ad=[1/2,1;0,1/20];
Bd=[1;1];
Cd=[1,1];
deff('st=e(t)','st=sin(3*t)')
deff('xdot=fc(t,x,u)','xdot=A*x+B*u')
deff('y=hc(t,x)','y=C*x')
deff('xp=fd(x,y)','xp=Ad*x + Bd*y')
deff('u=hd(t,x)','u=Cd*x')
h=0.1;t0=0;t=0:0.1:2;
x0c=[0;0;0];
x0d=[0;0];
nd=2;
xcd=odedc([x0c;x0d],nd,h,t0,t,f);
norm(xcd-odedc([x0c;x0d],nd,h,t0,t,'fcd1')) // Fast calculation (see fydot2.f)
plot2d([t',t',t'],xcd(1:3,:)');
xset("window",2);
plot2d2("gnn",[t',t'],xcd(4:5,:)');
xset("window",0);

See Also

  • ode — ordinary differential equation solver
  • link — dynamic linker
  • odeoptions — set options for ode solvers
  • csim — simulation (time response) of linear system
  • external — Scilab Object, external function or routine
Report an issue
<< ode_root Differential calculus, Integration odeoptions >>

Copyright (c) 2022-2024 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Tue Apr 02 17:36:21 CEST 2013