【问题标题】:How to generate multiple state spaces from arrays in MATLAB如何从 MATLAB 中的数组生成多个状态空间
【发布时间】:2013-11-24 13:03:33
【问题描述】:

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

输入是:

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])

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

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

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

 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

方法2:

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

以这个错误结束。

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

感谢您的帮助, 彼得

【问题讨论】:

  • 为什么不:SS1toSS100(i)=ss(A1toA100(i),B1toB100(i),C1toC100(i),D1toD100(i));
  • 考虑到我有一个一阶系统(只有 4 个数字)并在其上应用此功能。结果将是每个状态空间都有一个尺寸为 200x200 的矩阵 A(或任何 A1toA100 的尺寸)。这是不正确的。除此之外,我发现每个状态空间的每个 A 矩阵都是相同的。所以我猜想以某种方式将整个矩阵带入状态空间函数。
  • 请张贴输入向量元素的示例。
  • 您可以编辑您的问题。您发布的内容可能没有行向量?仍然:我在第一条评论中的建议呢?您似乎访问了整个数组数组,而不仅仅是每次迭代中的一个。
  • 谢谢,它就在那里。 (不,它们是行向量,我刚刚编辑它们以不占用那么多空间,因为我不知道可编辑的问题)。你的第一个建议和我的第一个方法一样,不是吗?

标签: arrays matlab matrix function-handle state-space


【解决方案1】:

现在我明白你的问题了!您的最后一次编辑很重要。

在一个变量中存储多个状态空间模型的唯一方法是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 变量,保留用于复数

【讨论】:

  • 它们来自系统识别。这种特殊情况是一阶系统(系统的阶等于矩阵 A 的维数),但仍然正确。我插入了您的代码,但最终出现此错误。来自非元胞数组对象的元胞内容引用。
  • 一次又一次:在你的循环中使用SS1toSS100(i)=ss(A1toA100(i),B1toB100(i),C1toC100(i),D1toD100(i))。 -.-
  • 看来我强调的还不够。我已经在 ss 中发布了矩阵(有问题),这是我通过使用您发布的这段代码(以及我的第一种方法)获得的。
  • 我刚刚在问题中对其进行了编辑。 (例如,如果您将 4 个数字放入 ss 函数并获得输出)。
  • 一次又一次:在你的循环中使用SS1toSS100(i)=ss(A1toA100(i),B1toB100(i),C1toC100(i),D1toD100(i))
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多