标签: transfer-function

创建 MIMO(多输入多输出)传递函数系统,无需对输入和输出的数量进行硬编码

简介
作为更大系统的一部分,我正在尝试创建一个多输入多输出传递函数,该函数仅将输入链接到前导对角线上的输出*。即它在输入 1 和输出 1、输入 2 和输出 2 等之间具有非零传递函数。

*无论你是否真的认为 MIMO 系统是一个公平的评论,我希望它采用这种格式,因为它链接到一个真正是 MIMO 的更大系统。

硬编码
我可以通过连接传递函数来实现这一点

tf1=tf([1 -1],[1 1]);
tf2=tf([1 2],[1 4 5]);
tf3=tf([1 2],[5 4 1]);

G=[tf1 0 0; 0 tf2 0; 0 0 tf3]; 
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但是(a)对输入/输出的数量进行硬编码,并且(b)您拥有的输入和输出越多,就会变得越来越可怕。

Diag 函数
这个问题对于 diag 函数来说似乎很完美,但是 diag 似乎没有为类型 'tf' 定义

G=diag([tf1, tf2, tf3])
??? Undefined function or method 'diag' for input arguments of type 'tf'.
Run Code Online (Sandbox Code Playgroud)

手动矩阵操作
我也尝试手动操作矩阵(并不是我真的希望它起作用)

G=zeros(3);
G(1,1)=tf1;
G(2,2)=tf2;
G(3,3)=tf3;
??? The following error occurred converting from tf to double:
Error using ==> …
Run Code Online (Sandbox Code Playgroud)

matlab control-theory transfer-function

5
推荐指数
1
解决办法
3754
查看次数

如何从 Octave 的传递函数矩阵中提取元素?

我正在控制包中使用 Octave,我想采用一组传递函数(初始化如下)并提取矩阵的对角线元素。每当我尝试这样做时,都会遇到以下错误。我尝试了很多解决方法(将其转换为状态空间图、将元素存储在单元格中等),但我要么遇到类似的错误,要么最终得到一个无法再与其他矩阵交互的对象传递函数。文档中有一些未实现的函数(如 ss2ss),我认为这些函数很有用,但不可用。

我该如何解决这个问题?

初始化我正在使用的对象类型的代码:

s = tf('s');
m = inv(s*e - mat); // e and mat are just square matrices of numbers
Run Code Online (Sandbox Code Playgroud)

我用来尝试提取对角线分量的代码:

function D = getD(W) // W is of the similar type as above
    n = size(W,1);
    Dtemp = tf(eye(n));
    for i = 1:n
        Dtemp(i,i) = W(i,i);
    end
    D = Dtemp;
end
Run Code Online (Sandbox Code Playgroud)

我不断收到的错误:

error: lti: subsasgn: invalid subscripted assignment type '()'.  you must select an LTI key first, i.e.  sys.keyname(...) = ...
Run Code Online (Sandbox Code Playgroud)

请注意,当我将 Dtemp 初始化为单元格 (n,n) 时,我得到以下类型: …

octave control-theory transfer-function

5
推荐指数
1
解决办法
114
查看次数

时域中的传递函数

我有两个时域信号(X和Y).我试图计算它们之间的传递函数.我使用函数tfestimate,它返回作为频率函数的传递函数和tfestimate估计传递函数的频率向量.它只返回正频率,因为我的信号并不复杂.我的问题是如何在时域中可视化这个传递函数.我尝试了以下代码,但返回的函数在时域中被反转.我想知道为什么.

x = randn(16384,1); % generate random signal
gaussFilter = gausswin(100);
gaussFilter = gaussFilter / sum(gaussFilter); % Normalize.
y = conv(x,gaussFilter);
y = y(1:length(x)); % truancate the Y to be the same length as X
txy = tfestimate(x,y,1024);
tyx = conj(txy(end:-1:2)); % since tfestimate only returns for positive frequency, I estimate the result for negative frequency as the conjugate of positive frequency. 
t = ifft([txy' tyx']); % use inverse fourier to visualize transfer function in time domain.
Run Code Online (Sandbox Code Playgroud)

结果't'不是传递函数,而是一个时间相反的版本.有人可以帮我理解发生了什么吗?谢谢.

matlab transfer-function

3
推荐指数
1
解决办法
2495
查看次数

如何在 Python 中指定线性系统中的时间延迟?

7年前有人在这个帖子中问过这个问题:

\n\n

如何在 Scipy 中定义具有时间延迟的 LTI 系统?

\n\n

答案已经过时了,或者至少我不知道如何让它发挥作用,我想知道目前是否有办法做到这一点。

\n\n

我想创建一个如下所示的传递函数其中s0.1 为时间延迟。

\n\n

在 matlab 中我会做这样的事情:

\n\n

H=tf(1,\'InputDelay\',0.1);

\n\n
s=tf(\'s\');\nG=1/(s+1);\nQ=1+0.5*s+2/s;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样我就可以使用传递函数进行如下操作:

\n\n
M=feedback(Q*G,H);\nM=minreal(M);\ndisplay(M);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想知道 python 中是否有等效的。这样我就不必使用限制代码通用性的符号表达式。

\n\n

使用符号表达式,它看起来像这样:

\n\n
s = sym.symbols(\'s\')\nG = 1/(s+1)\nQ = 1+0.5*s+2/s\nH = sym.exp(-0.1*s)\n# C\xc3\xa1lculo de la funci\xc3\xb3n de transferencia global\nM = Q*G/(1+Q*G*H)\nM = sym.simplify(M)\nsym.pprint(M)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想过使用 numpy 或 sympy exp 但都不起作用:

\n\n
s = ct.tf(\'s\')\nH = np.exp(-0.1*s)\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出:

\n\n

TypeError: loop of ufunc does not support argument 0 …

python matlab python-3.x transfer-function python-control

3
推荐指数
1
解决办法
3918
查看次数

如何分离传递函数的实部和虚部?

这是一个传递函数:

S = [tf([10 2 4],[1 95 2000 3450])];
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到real(S)Imag(S)

matlab transfer-function

2
推荐指数
1
解决办法
4409
查看次数

如何在 C/C++ 中实现过程调节器?

问题很简单,我不知道在哪里以及如何实现传递函数。

假设我有一个经典系统

在此处输入图片说明

其中 P 具有二阶传递函数,zita=0.7,F=1,C 是过程调节器。

我想在 C 或 C++ 中的像 ATMega128P 这样的控制器上实现这个调节器。

过程的传递函数是通过实验方法确定的,调节器可能会根据过程传递函数而变化。

我应该从哪里开始?

c microcontroller transfer-function

1
推荐指数
1
解决办法
1019
查看次数

测试Matlab中的2个传递函数是否相同

假设我有两个传递函数(或更一般情况下的两个传递函数矩阵).如何测试这些是否相同(相等)?

>> G1 = 1/(s*(s-1));
>> G2 = 1/(s*(s-1));
>> G1 == G2 % won't work..
Run Code Online (Sandbox Code Playgroud)

matlab transfer-function

0
推荐指数
1
解决办法
269
查看次数