首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中如何用传递函数反演矩阵?

在python中如何用传递函数反演矩阵?
EN

Stack Overflow用户
提问于 2022-11-01 11:41:05
回答 2查看 56关注 0票数 0

我知道,在matlab中,我可以做以下工作:

代码语言:javascript
复制
s = tf('s')
G11 = (s + 1)/(s + 2)
G12 = 1/(2*s + 1)
G21 = 1/(3*s + 1)
G22 = 1/(4*s + 1)

A = [G11 G12; G21, G22]
Ai = inv(A)
bode(A)

一切都会好起来的。在python中,我尝试做一些类似的事情:

代码语言:javascript
复制
import control as co
import numpy as np

s = co.tf('s')
G11 = (s + 1)/(s + 2)
G12 = 1/(2*s + 1)
G21 = 1/(3*s + 1)
G22 = 1/(4*s + 1)

A = np.array([[G11, G12], [G21, G22]])
Ai = np.linalg.inv(A)
co.bode(A)

但是这是行不通的-- numpy不知道如何反演这个矩阵。

在python中有什么好方法可以这样做吗?我知道我可以用s作为符号,但当我使用控制工具箱中的其他工具时,我认为这对我没有帮助。

编辑:

numpy返回以下错误:

代码语言:javascript
复制
---------------------------------------------------------------------------
UFuncTypeError                            Traceback (most recent call last)
<ipython-input-1-ec46afd90eb6> in <module>
     10 
     11 A = np.array([[G11, G12], [G21, G22]])
---> 12 Ai = np.linalg.inv(A)
     13 co.bode(A)

<__array_function__ internals> in inv(*args, **kwargs)

/usr/local/lib/python3.7/dist-packages/numpy/linalg/linalg.py in inv(a)
    543     signature = 'D->D' if isComplexType(t) else 'd->d'
    544     extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
--> 545     ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
    546     return wrap(ainv.astype(result_t, copy=False))
    547 

UFuncTypeError: Cannot cast ufunc 'inv' input from dtype('O') to dtype('float64') with casting rule 'same_kind'
EN

回答 2

Stack Overflow用户

发布于 2022-11-01 12:35:54

Numpy (提示:它的名字是正确的)只是一个数字库;它不做符号数学。Sympy (同名)做符号运算,所以使用它:

代码语言:javascript
复制
import sympy

s = sympy.Symbol('s', imaginary=True)
g11 = (s + 1)/(s + 2)
g12 = 1/(2*s + 1)
g21 = 1/(3*s + 1)
g22 = 1/(4*s + 1)
A = sympy.Matrix((
    (g11, g12),
    (g21, g22),
))
sympy.pprint(A.inv())

带输出

代码语言:javascript
复制
⎡    3       2                       3       2              ⎤
⎢ 6⋅s  + 17⋅s  + 11⋅s + 2      - 12⋅s  - 31⋅s  - 15⋅s - 2   ⎥
⎢ ───────────────────────      ──────────────────────────   ⎥
⎢     3      2                      3      2                ⎥
⎢  6⋅s  + 7⋅s  - 3⋅s - 1         6⋅s  + 7⋅s  - 3⋅s - 1      ⎥
⎢                                                           ⎥
⎢     3       2                 4       3       2           ⎥
⎢- 8⋅s  - 22⋅s  - 13⋅s - 2  24⋅s  + 50⋅s  + 35⋅s  + 10⋅s + 1⎥
⎢─────────────────────────  ────────────────────────────────⎥
⎢     3      2                      3      2                ⎥
⎣  6⋅s  + 7⋅s  - 3⋅s - 1         6⋅s  + 7⋅s  - 3⋅s - 1      ⎦
票数 4
EN

Stack Overflow用户

发布于 2022-11-01 13:51:01

看起来,control.tf返回类control.TransferFunction的一个对象。这与返回符号函数对象的MATLAB版本不同。

通过查看文献资料,我没有看到将control.TransferFunction对象转换为符号函数对象的内置方式,但我确实看到了numden方法,您可以使用这些值构造一个符号函数。然后可以应用莱因德林的回答

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

https://stackoverflow.com/questions/74275353

复制
相关文章

相似问题

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