1

我想问一下如何从数组创建多个状态空间

输入是:

A1toA100 (100xn double)
B1toB100 (100xp double)
C1toC100 (100xn double)
D1toD100 (100xp double)

例子:

A1toA10 =

   -0.5909
   -0.4178
   -0.3412
   -0.2954
   -0.2643
   -0.2412
   -0.2233
   -0.2089
   -0.1970
   -0.1869

>> B1toB10

B1toB10 =

   33.3333
   33.3333
   33.3333
   33.3333
   33.3333
   33.3333
   33.3333
   33.3333
   33.3333
   33.3333

>> C1toC10

C1toC10 =

     1
     1
     1
     1
     1
     1
     1
     1
     1
     1

>> D1toD10

D1toD10 =

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0

其中每一个都包含一百个各自类型(A、B、C 或 D)的矩阵。

输出应该是:

SS1toSS100 (100x ss)

每组矩阵对应一个状态空间。

第一个系统的示例:

使用此代码

ss([-0.5909],[33.3333],[1],[0])

我得到了正确的输出。四个数字,一个系统 <1x1 ss>。这个:

ans =

  a = 
            x1
   x1  -0.5909

  b = 
          u1
   x1  33.33

  c = 
       x1
   y1   1

  d = 
       u1
   y1   0

但是,使用此代码:

for i=1:2
    pom=[-0.5909 33.3333 1 0]
    SS1toSS10(i)=ss(pom(1),pom(2),pom(3),pom(4));
end

虽然我应该得到 2 个与第一个相同的系统,但我得到了这个:

 SS1toSS10

SS1toSS10 =

  a = 
            x1       x2
   x1  -0.5909        0
   x2        0  -0.5909

  b = 
          u1     u2
   x1  33.33      0
   x2      0  33.33

  c = 
       x1  x2
   y1   1   1

  d = 
       u1  u2
   y1   0   0

Continuous-time state-space model.

这是一个错误的答案。

方法一:

for i=1:length(A1toA100)
    SS1toSS100(i)=ss(A1toA100(i),B1toB100,C1toC100,D1toD100);
end

这已经生成了 100 个矩阵尺寸为 200x200 的状态空间,这是错误的,因为我期望尺寸为 2x2。显然,考虑了整个矩阵的维度。

示例输入向量的示例输出:

S1toS10(1,1).a

-0,417825056426464  0   0   0   0   0   0   0   0   0
0   -0,341152729998142  0   0   0   0   0   0   0   0
0   0   -0,295446930748805  0   0   0   0   0   0   0
0   0   0   -0,264255768359200  0   0   0   0   0   0
0   0   0   0   -0,241231408801990  0   0   0   0   0
0   0   0   0   0   -0,223336886965331  0   0   0   0
0   0   0   0   0   0   -0,208912528213232  0   0   0
0   0   0   0   0   0   0   -0,196964620499203  0   0
0   0   0   0   0   0   0   0   -0,186857045774452  0
0   0   0   0   0   0   0   0   0   -0,590893861497609

S1toS10(1,1).b

0
0
0
0
0
0
0
0
0
33,3333333333333

S1toS10(1,1).c

1   1   1   1   1   1   1   1   1   1

S1toS10(1,1).d

0

方法二:

for i=1:length(A1toA100)
    SS1toSS100(i)=arrayfun(@ss,A1toA100(i),B1toB100,C1toC100,D1toD100);
end

以这个错误结束。

当前未实现使用 arrayfun ss 输出类型的错误。

谢谢你的帮助,彼得

4

1 回答 1

0

现在我明白你的问题了!您的最后一次编辑是必不可少的。

将多个状态空间模型存储在一个变量中的唯一方法是使用struct. 因此,您的循环必须如下所示:

SS1toSS100(100) = struct;   %pre-allocation
for ii=1:100
    temp_ss = ss( A1toA100(ii) , B1toB100(ii) , C1toC100(ii) , D1toD100(ii) );
    SS1toSS100(ii) = struct('ss',temp_ss);
end

甚至更短:

SS1toSS100(100) = struct;   %pre-allocation
for ii=1:100
    SS1toSS100(ii).ss = ss( A1toA100(ii) , B1toB100(ii) , C1toC100(ii) , D1toD100(ii) );
end

它为您提供了一个包含 100 个ss对象的结构。

例如,如果您现在想访问第 5 个,请键入:

SS1toSS100(5).ss

你得到

ans =

  a = 
            x1
   x1  -0.5909

  b = 
          u1
   x1  33.33

  c = 
       x1
   y1   1

  d = 
       u1
   y1   0

Continuous-time state-space model.

PS:不要i用作迭代变量,它是内部 Matlab 变量,保留用于复数

于 2013-11-24T14:49:54.177 回答