Re: Arranging input data (nonlinear control systems)
- To: mathgroup at smc.vnet.net
- Subject: [mg77641] Re: [mg77563] Arranging input data (nonlinear control systems)
- From: DrMajorBob <drmajorbob at bigfoot.com>
- Date: Thu, 14 Jun 2007 05:27:54 -0400 (EDT)
- References: <9560865.1181739420791.JavaMail.root@m35>
- Reply-to: drmajorbob at bigfoot.com
This might help:
Clear[Shift,Pseudo]
discrete := {Shift[a_, t_] :> (a /. t -> t + 1),
PseudoD[a_, t_] :> 0};
continuous := {Shift[a_, t_] :> a, PseudoD[a_, t_] :> Dt[a, t]};
difference := {Shift[a_, t_] :> (a /. t -> t + 1),
PseudoD[a_, t_] :> Shift[a, t] - a};
qShift := {Shift[a_, t_] :> (a /. t -> q*t), PseudoD[a_, t_] :> 0};
qDifference := {Shift[a_, t_] :> (a /. t -> q*t),
PseudoD[a_, t_] :> Shift[a, t] - a};
Now, anywhere you need a set of rules, you can mention it by name:
StateSpace[f, Xt, Ut, t, h, Yt, discrete]
but remember you're passing rules, not functions.
Instead, you could define the rule-sets as strings:
discrete = "Clear[Shift,Pseudo];Shift[a_,t_]:=(a/.t\[Rule] \
t+1);PseudoD[a_,t_]=0;"
continuous = "Clear[Shift,Pseudo];Shift[a_,t_]:= \
a;PseudoD[a_,t_]:=Dt[a,t];"
difference = \
"Clear[Shift,Pseudo];Shift[a_,t_]:=(a/.t\[Rule]t+1);PseudoD[a_,t_]\
:=Shift[a,t]-a;"
qShift = "Clear[Shift,Pseudo];Shift[a_,t_]:=(a/.t\[Rule]q*t);PseudoD[\
a_,t_]:=0;"
qDifference = \
"Clear[Shift,Pseudo];Shift[a_,t_]:=(a/.t\[Rule]q*t);PseudoD[a_,t_]\
:=Shift[a,t]-a;"
and then, when you've called
StateSpace[f, Xt, Ut, t, h, Yt, discrete]
StateSpace can temporarily use the rules passed to it by executing
ToExpression[ruleSet];
where ruleSet is the last argument in the pattern definition for
StateSpace.
For instance:
ToExpression[discrete]
?Shift
Global`Shift
Shift[a_,t_]:=a/.t->t+1
Bobby
On Wed, 13 Jun 2007 06:24:37 -0500, Maris To~nso <mtonso at staff.ttu.ee>
wrote:
> Dear group,
>
> I am writing a Mathematica package dealing with nonlinear control
> systems.
> I have a problems with organizing input data. I try to describe my
> problem
> so that people, who are not aquainted with control systems theory, can
> understand, too.
>
>
> There are different types of nonlinear control systems.
>
>
> ____________1. Discrete system
>
> classical state equations are in the form
>
> x(t+1) = f(x(t),u(t)), (here f = (f1,f2,...) is nonlinear function)
> y(t) = h(x(t))
>
> for example,
>
> x1(t+1) = x1(t) + x2(t) u2(t)
> x2(t+1) = u1(t)
> y(t) = x1(t)
>
> So far I have entered and hold above system like this:
>
> f = {x1[t] + x2[t] u2[t], u1[t]};
> Xt = {x1[t], x2[t]};
> Ut = {u1[t], u2[t]};
> h = {x1[t]};
> Yt = {y[t]};
> dstateeqs = DStateSpace[f, Xt, Ut, t, h, Yt];
>
> The head DStateSpace indicates it is a discrete system and keeps the
> system data together. Now a user can apply package functions to the
> system, entering the single argument. For example,
>
>
> Observability[ dstateeqs ] (* checks observability *)
>
> ClassicStatesToIO[ dstateeqs ] (* finds input-output equations *)
>
> BookForm[ dstateeqs ] (* acts like TraditionalForm, i.e. prints the
> system
> in normal way x1[t+1] = ... *)
>
>
>
> __________2. Continuous system:
>
> classical state equations are in the form
>
> \dot x = f(x,u) (Here \dot x is time derivative)
> y = h(x)
>
> for example,
>
> \dot x1 = u1 + u2
> \dot x2 = x1*x2
> \dot x3 = x3
> y = x1 + x2
>
> So far I have entered and hold above system like this:
>
> f = {u1[t] + u2[t], x1[t]*x2[t], x3[t]};
> Xt = {x1[t], x2[t], x3[t]};
> Ut = {u1[t], u2[t]};
> h = {x1[t] + x2[t]};
> Yt = {y[t]};
> cstateeqs = CStateSpace[f, Xt, Ut, t, h, Yt];
>
> Though continuous systems are traditionally written without time argument
> t, I have chosen to write it, to keep analogy with discrete case.
> CStateSpace indicates it is a continuous system. Package functions can be
> applied to it exactly like in discrete case.
>
> Observability[ cstateeqs ]
> ClassicStatesToIO[ cstateeqs ]
> BookForm[ cstateeqs ]
>
>
> The sysem worked quite properly and was easy to understand and use, but
> no
> a big trouble has appeared. My professor says there will be more cases
> than just discrete and continuous!
>
>
> __________3. General case:
>
> classical state equations have form
>
> x^<1> = f(x,u)
> y = h(x)
>
> here x^<1> (x with superscripted "<1>" ) is a changeable operator,
> depending on two functions: generalized shift and pseudoderivative. Of
> course, the general case covers discrete and continuous systems, if shift
> and pseudoderivative are chosen in a right way. Some examples:
>
> Discrete: Shift[a_, t_]:= a/.t->t+1; PseudoD[a_, t_]:= 0
> Continuous: Shift[a_, t_]:= a; PseudoD[a_, t_]:= Dt[a, t]
> Difference: Shift[a_, t_]:= a/.t->t+1; PseudoD[a_, t_]:= Shift[a,t]-a
> q-shift: Shift[a_, t_]:= a/.t->q*t; PseudoD[a_, t_]:= 0
> q-difference: Shift[a_, t_]:= a/.t->q*t; PseudoD[a_, t_]:= Shift[a,t]-a
> ... and there are more of them.
>
> Now, the the expression of state equations should carry also an
> information about shift and pseudoderivative operators. Something like
>
> StateSpace[f, Xt, Ut, t, h, Yt, Hold[{Shift[a_, t_]:= a/.t->t+1,
> PseudoD[a_, t_]:= 0]}]
>
> If I don't use Hold, it gives simply Null. Unfortunately, I have never
> seen a Mathematica function, which arguments should be entered with Hold.
>
> An alternative is to define two global variables Shift[a_,t_] and
> PseudoD[a_,t_]. I am bit afraid of global variables, because Mathemativa
> built-in functions and Standard packages use them really rarely.
>
> So, were should I put these shift and pseudoderivative?
>
>
> It is also clear classical discrete and continuous systems are used much
> more often than those other cases, so there should be an oportunity to
> enter these systems easily, without thinking about shifts and
> pseudoderivatives. So, I should probably keep the old heads DStateSpace
> and CStateSpace, too. Or would it be better to use complete words,
> something like
>
> StateSpace[f, Xt, Ut, t, h, Yt, "Discrete"] and
>
> StateSpace[f, Xt, Ut, t, h, Yt, "Continuous"] ?
>
>
> Thank you for reading. I am not expecting a complete solution, any ideas
> and hints would be helpful.
>
>
>
>
>
> Yours sincerely
> Maris Tõnso
>
>
> --------------------------------------------------------
>
>
> Maris Tõnso
> Control Systems Department
> Institute of Cybernetics at TUT
> Akadeemia tee 12, 12618
> Tallinn, Estonia
>
>
>
>
>
>
--
DrMajorBob at bigfoot.com