关于#matlab#的问题:问题:我在使用LMI工具箱求解线性矩阵不等式时,求解出两个变量矩阵L和 S,求解出来是对角块的形式

问题:我在使用LMI工具箱求解线性矩阵不等式时,求解出两个变量矩阵L和 S(当然还有其他的变量矩阵,比如正定矩阵P Q R ),但是这里的L和S的正定性对称性不做要求。 L是4×3维的,S是4×4维的,L和S求解出来是对角块的形式(其实其他变量矩阵也是块对角矩阵形式,也就是12块和21块为零)。最终我想要的矩阵控制器参数 K=inv(S)*L也是块对角的样子。
注释:我觉得之所以会算出来对角块的形式,原因来自于我把本来要求的K的4个块K11… K 13, K14的4个矩阵合到一起算了,因此其他已知矩阵维数也变大了,而且很多部分都是0块。因此系统找到可行解就停止了。大概运行了3次。
帮助: 求哪位专家能够有别的语言限定或者其他办法,让我最终求出来的K的12块和21块不为零

你把题目发给我看一下

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据矩阵不等式的性质,求解得到的矩阵L和S都是半正定的,且满足以下的线性矩阵不等式:

[ La , Lb ]   [ Sa , Sb ]   [ I  ,  0 ]   [ 0  ,  0 ]
[ Lb', Lc ] <=[ Sb', Sc ] + [ 0  ,  I ] * [ 0  , -I ]

其中,L 和 S 是对称矩阵,La, Lb, Lc, Sa, Sb, Sc 都是矩阵。通过对拉格朗日乘子进行求解,可以得到以下形式的解:

L = [ L11 , L12 ; L12', L22 ]
S = [ S11 , S12 ; S12', S22 ]

其中,L11, L22, S11, S22 都是正半定矩阵,而 L12 和 S12 可能不为零。

根据求解出来的 L 和 S,可以得到 K = inv(S) * L,该矩阵也是块对角的形式:

K = [ K11 , K12 ; K21 , K22 ]

其中,K11, K22 都是对角矩阵,而 K12 和 K21 可能不为零。

如果想让最终求解得到的 K 的 K12 和 K21 块不为零,可以对 L 和 S 进行一些调整。具体来说,可以使用对称正定矩阵 P 和 Q,将原始的矩阵不等式进行等价变形,得到新的矩阵不等式:

[ La , Lb ]   [ I  ,  0 ]   [ P ,  0 ]   [ Sa , Sb ]   [ I  ,  0 ]   [ Q ,  0 ]   [ P ,  0 ]
[ Lb', Lc ] <=[ 0  , -I ] * [ 0 ,  I ] * [ Sb', Sc ] + [ 0  ,  I ] * [ 0 ,  I ] * [ 0 , -I ]

然后求解得到的 L 和 S 矩阵也是半正定的,但是它们不再是对角矩阵。再根据上述的公式计算得到 K = inv(S) * L 的矩阵,K12 和 K21 的块也不为零。

以下是 MATLAB 代码演示:

% 原始的矩阵不等式:
La = eye(2); Lb = [1 -1; -1 2]; Lc = eye(2);
Sa = eye(2); Sb = [2 1; 1 2]; Sc = eye(2);

% 求解矩阵不等式:
setlmis([]);
L = lmivar(1, [2 1]);  % L 是对称矩阵
S = lmivar(1, [2 1]);  % S 是对称矩阵
lmiterm([1 1 1 L], La, 1, 's');              % La * L
lmiterm([1 1 1 L], Lb, 2, 's');              % Lb * L
lmiterm([1 1 1 L], Lc, 1, 's');              % Lc * L
lmiterm([1 1 2 S], Sa, 1, 's');              % Sa * S
lmiterm([1 1 2 S], Sb, 2, 's');              % Sb * S
lmiterm([1 1 2 S], Sc, 1, 's');              % Sc * S
lmiterm([1 2 2 0], eye(2));                 % 系数矩阵 [ 0  I ; -I 0 ]
lmis = getlmis;
[tmin, xfeas] = feasp(lmis);

% 解析求解出 L 和 S:
Lopt = dec2mat(lmis, xfeas, L);
Sopt = dec2mat(lmis, xfeas, S);

% 调整矩阵不等式:
P = [1 0.5; 0.5 1]; Q = [2 0; 0 2];
La = La + Lb * P * Lb'; Sa = Sa + Sb * Q * Sb';
Lb = Lb * P; Sb = Sb * Q;

% 重新求解矩阵不等式:
setlmis([]);
L = lmivar(1, [2 1]);  % L 是对称矩阵
S = lmivar(1, [2 1]);  % S 是对称矩阵
lmiterm([1 1 1 L], La, 1, 's');              % La * L
lmiterm([1 1 1 L], Lb, 2, 's');              % Lb * L
lmiterm([1 1 1 L], Lc, 1, 's');              % Lc * L
lmiterm([1 1 2 S], Sa, 1, 's');              % Sa * S
lmiterm([1 1 2 S], Sb, 2, 's');              % Sb * S
lmiterm([1 1 2 S], Sc, 1, 's');              % Sc * S
lmiterm([1 2 2 0], eye(2));                 % 系数矩阵 [ 0  I ; -I 0 ]
lmis = getlmis;
[tmin, xfeas] = feasp(lmis);

% 解析求解出 L 和 S:
Lopt = dec2mat(lmis, xfeas, L);
Sopt = dec2mat(lmis, xfeas, S);

% 根据解析求解出的 L 和 S 计算 K 矩阵:
K = pinv(Sopt) * Lopt

如果我的回答解决了您的问题,请采纳!

该回答引用GPTᴼᴾᴱᴺᴬᴵ
首先,可以尝试调整LMIs的约束条件或者参数,以便在求解过程中得到更适合的L和S矩阵,从而得到非对角块的K矩阵。一种方法是使用带有相应参数的求解器,例如使用LMI Control Toolbox中的'lmilab'或'SDPT3'求解器,并调整它们的参数以改善求解结果。
·
另外,如果你已经得到了对角块的L和S矩阵,可以使用一些数学技巧来重新构造一个非对角块的K矩阵。例如,可以通过添加小量扰动到L和S矩阵中的零块来产生非零块,从而得到非对角块的K矩阵。但是需要注意,这种方法可能会导致矩阵不等式的解变得不稳定,因此需要进行仔细的数值分析和验证。
·
最后,如果没有其他更好的方法,也可以尝试手动调整L和S矩阵的特定块,以获得所需的非对角块K矩阵。但是需要注意,这种方法需要对矩阵不等式的性质和约束条件有很好的理解,并且需要进行严格的数值验证,以确保所得到的解是正确的和可行的。

如果你想要得到块对角矩阵形式的K矩阵,其中12块和21块不为零,可以考虑使用矩阵分块的技巧。具体来说,你可以将L和S矩阵都分成块对角形式,然后按照块对角矩阵乘法的方式计算K矩阵。

具体来说,设L和S矩阵分别为:

L = [L11, L12, L21, L22]
S = [S11, S12, S21, S22]

其中L11、L12、L21、L22、S11、S12、S21、S22都是块矩阵,它们的维度可以是任意的。根据矩阵分块的乘法规则,可以得到K矩阵的块对角形式:

K = [K11, K12, K21, K22]

其中:

K11 = inv(S11) * L11
K12 = inv(S11) * L12
K21 = -inv(S22) * S21 * K11 + inv(S22) * L21
K22 = -inv(S22) * S21 * K12 + inv(S22) * L22

这样,你就可以得到块对角形式的K矩阵,其中12块和21块不为零。需要注意的是,这种方法需要保证S矩阵的每个块都是可逆的,否则无法计算K矩阵。

https://qqdo.com/jiaoyu/info/30486

参考GPT和自己的思路,如果您的矩阵 $L$ 和 $S$ 是块对角矩阵,那么您可以将它们的块矩阵分别拼接起来,然后使用线性代数中的求逆和矩阵乘法来计算 $K$。具体来说,设 $L$ 和 $S$ 的块矩阵分别为 $L_{ij}$ 和 $S_{ij}$,那么:

img

具体实现时,您可以使用 Matlab 中的循环和切片操作来拼接矩阵和计算块矩阵。以下是一个示例代码:

% 假设您已经得到了 L 和 S 的块矩阵

n = size(L, 1);  % 矩阵的大小为 n x n
K = zeros(n);    % 初始化 K

for i = 1:n
    for j = 1:n
        if i == j
            K(i, j) = inv(S{i, j}) * L{i, j};  % 对角块
        elseif i < j
            K(i:i+1, j:j+1) = inv(S{i, i}) * L(i:i+1, j:j+1);  % 21else
            K(i:i+1, j:j+1) = inv(S{j, j}) * L(i:i+1, j:j+1);  % 12end
    end
end

该代码使用了两个嵌套的循环来遍历矩阵的所有块,并根据块的位置来计算对应的 $K_{ij}$。
回答不易,还请采纳!!!

根据你的描述,你想让最终求出来的K的12块和21块不为零,那么可能需要采用一些特殊的限制条件或技巧。下面提供一些可能有用的方法和建议:

调整L和S的结构
由于L和S的对角块形式,可能会导致K的12块和21块为零。你可以尝试重新设计L和S的结构,使得它们的块状结构更符合K的块状结构。例如,你可以将L和S分成更小的块,以便它们更好地对应于K的块结构。

添加约束条件
你可以添加额外的约束条件来强制K的12块和21块不为零。这些约束条件可以是线性不等式或等式,也可以是其他类型的约束条件。你可以使用LMI工具箱中提供的约束条件函数,例如lmi和lmistruct,来实现这些约束条件。

优化算法
你可以尝试使用其他优化算法来求解线性矩阵不等式。例如,你可以使用非凸优化算法,如分裂Bregman方法,来更好地控制K的结构。你还可以使用分解算法,如分解LMI算法,来快速求解大规模线性矩阵不等式。

希望这些方法能对你有所帮助。但需要注意的是,这些方法可能会增加计算复杂度和求解时间。如果你的问题很复杂,可能需要使用更高级的技术来解决它。