首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用劳斯-赫维茨稳定性准则确定系统的稳定性

用劳斯-赫维茨稳定性准则确定系统的稳定性
EN

Code Golf用户
提问于 2013-06-11 13:55:04
回答 1查看 4.6K关注 0票数 6

劳斯-赫维茨是证明或否定电气控制系统稳定性的判据。

Idea

给定一个具有P(s)/Q(s)形式方程的系统,其中P(s)Q(s)是任意程度的多项式,如果多项式Q(s)的所有根都位于复平面的左半部,则称它是稳定的,这意味着根的实部为负值。

对于度小于或等于2的多项式,确定根并注意系统是否稳定是非常简单的。对于高阶多项式Q(s)劳斯-赫维茨定理可以用来判断系统是否是Hurwitz稳定的。

过程

对任意程度应用此定理的方法之一是描述维基百科,它包括对表的行执行操作,然后在表的第一列中计数符号更改的数目。其内容如下:

  • 用多项式的系数填充前两行,形式如下:第1行由偶数系数s^ns^n-2、…、s^2s^0组成,第2行由奇数系数s^n-1s^n-3、…、s^3s^1组成;
  • 通过计算矩阵的行列式(第一列的最后2行,下一列的最后2行)除以(上面行上的第一列的值)来计算以下行;它在维基百科文章的这部分中有详细介绍。
  • 如果遇到一排满是零的行,请将其设置为它上面的一行所代表的多项式的导数。根据其所在行的不同,每个单元格上的数字表示一个系数。在后面的示例中将对此进行说明。
  • 如果您遇到其他非零值的零,系统是不稳定的:您可以停止。(你可以继续,但你会得到同样的结果)。第一列上的零表示实际值0的根,这会使系统不稳定。
  • 否则,继续到最后。那么,如果不是第一列中的所有值都是相同的符号,则系统是不稳定的。

示例

下面是这个过程的一些例子:

代码语言:javascript
复制
# Polynomial: 1 3 6 12 8.00

s^4  1 6  8
s^3  3 12 0
s^2  2 8  0
s^1--0-0--0-- < Row of zero - replace it by:
s^1  4 0  0   < Derivative 2*s^2 + 8*s^0 = 4*s^1
                 (between each 2 columns the power of s is lowered by 2)
s^0  8 0  0   < Continue normally

# Sign Changes: 0 (equivalent to no root in the right half plane)
# Stable: Yes

另一个:

代码语言:javascript
复制
s^2   1  -2
s^1   1   0
s^0  -2   0

# Sign Changes: 1 (equivalent to 1 root in the right half plane)
# Stable: No

规则

  • 该程序将从标准输入中读取多项式直到空白行,并在新行上分别输出稳定/非稳定的0/1
  • 该程序可以读取任意形式的多项式系数。对于第一个例子,它可能是1 3 6 12 8 (它更适合这个问题,但最终并不重要)。
  • 它必须处理第一列中的0、以下列中的0,或者遇到满是0的行的情况。(注意:以防万一,不需要查看rhp/lhp/jw轴中有多少根)。
  • 它可以在任何时候短路的过程,如果满足条件,没有必要显示RH表在最后。
  • 您不必使用此方法。任何确定一个系统是否是Hurwitz稳定的方法都可以完成这项工作。
  • 选择使用哪种语言并不重要,只要它不是在一个内置函数调用中完成的。我是用Python写的,我很快就会发出去。
  • 这是暗号高尔夫。最短的代码获胜。

下面是一个示例输入/输出(以上述方式提供)来测试您的程序:

代码语言:javascript
复制
#input:
1 12 6 10 10 6 14
1 1 -2
1 2 1 2
1 3 1 3 16
1 2 3 6 2 1
1 2 14 88 200 800
1 2 3 6 2 1
1 3 6 12 8
1 4 5 2 4 16 20 8

#output:
0
0
1
0
0
0
0
1
0

如果你需要更多的澄清,让我知道,我会尽力澄清。

EN

回答 1

Code Golf用户

发布于 2013-06-11 20:00:04

Python (645字节)

这就是我努力做到的(还有高尔夫):

代码语言:javascript
复制
from decimal import*
R=xrange
def s(p):
 d=len(p)
 if 0 in p:return 0
 elif sum(1 for c in p if c>0) not in (0,d):return 0
 p=p+[0] if d%2 else p[:]
 r=[[0 for j in R(len(p)//2)] for i in R(d)]
 r[:2]=[[v for v in p[i::2]] for i in (0,1)]
 for i in R(2,len(r)):
  a,h,b = 1,0,0
  for k in R(len(r[i])-1):
   v=(r[i-1][0]*r[i-2][k+1]-r[i-2][0]*r[i-1][k+1])/r[i-1][0]
   r[i][k],a,h,b=v,a and v==0,h or v==0,b or (h and v!=0)
  if a:r[i]=[v*max(0,d-i-2*k) for k,v in enumerate(r[i-1])]
  elif b:return False
 return sum(1 for v in r if v[0]>0) in (0,d)
while 1:
 r=raw_input()
 if not r:break
 print 1 if s([Decimal(x) for x in r.split()]) else 0

它以多项式的系数为输入,按降阶(S的最高次方为0)。

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

https://codegolf.stackexchange.com/questions/11847

复制
相关文章

相似问题

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