我知道,在matlab中,我可以做以下工作:
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中,我尝试做一些类似的事情:
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返回以下错误:
---------------------------------------------------------------------------
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'发布于 2022-11-01 12:35:54
Numpy (提示:它的名字是正确的)只是一个数字库;它不做符号数学。Sympy (同名)做符号运算,所以使用它:
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())带输出
⎡ 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 ⎦https://stackoverflow.com/questions/74275353
复制相似问题