首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MATLAB中从数组中生成多个状态空间

如何在MATLAB中从数组中生成多个状态空间
EN

Stack Overflow用户
提问于 2013-11-24 13:03:33
回答 1查看 959关注 0票数 1

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

输入是:

代码语言:javascript
复制
A1toA100 (100xn double)
B1toB100 (100xp double)
C1toC100 (100xn double)
D1toD100 (100xp double)

示例:

代码语言:javascript
复制
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

其中每一个都包含100个相应类型的矩阵(A、B、C或D)。

输出应该是:

代码语言:javascript
复制
SS1toSS100 (100x ss)

其中有一个状态空间对应于每一组矩阵。

第一个系统的示例:

用这个代码

代码语言:javascript
复制
ss([-0.5909],[33.3333],[1],[0])

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

代码语言:javascript
复制
ans =

  a = 
            x1
   x1  -0.5909

  b = 
          u1
   x1  33.33

  c = 
       x1
   y1   1

  d = 
       u1
   y1   0

但是,使用此代码:

代码语言:javascript
复制
for i=1:2
    pom=[-0.5909 33.3333 1 0]
    SS1toSS10(i)=ss(pom(1),pom(2),pom(3),pom(4));
end

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

代码语言:javascript
复制
 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.

这是个错误的答案。

方法1:

代码语言:javascript
复制
for i=1:length(A1toA100)
    SS1toSS100(i)=ss(A1toA100(i),B1toB100,C1toC100,D1toD100);
end

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

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
for i=1:length(A1toA100)
    SS1toSS100(i)=arrayfun(@ss,A1toA100(i),B1toB100,C1toC100,D1toD100);
end

最后会出现这个错误。

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

谢谢你的帮助,佩尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-24 14:49:54

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

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

代码语言:javascript
复制
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

甚至更短:

代码语言:javascript
复制
SS1toSS100(100) = struct;   %pre-allocation
for ii=1:100
    SS1toSS100(ii).ss = ss( A1toA100(ii) , B1toB100(ii) , C1toC100(ii) , D1toD100(ii) );
end

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

例如,如果您现在想访问第五个数据库,请键入:

代码语言:javascript
复制
SS1toSS100(5).ss

然后你就会得到

代码语言:javascript
复制
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变量,并为复数保留

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20174767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档