⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 solveequalities.m

📁 optimization toolbox
💻 M
字号:
function [x_equ,H,A_equ,b_equ,factors] = solveequalities(F_struc,K,unitary)
%SOLVEEQUALITIES Internal function remove equality constraints

% Author Johan L鰂berg
% $Id: solveequalities.m,v 1.12 2006/05/14 17:21:09 joloef Exp $

% Extract the inequalities
A_equ = F_struc(1:K.f,2:end);
b_equ = -F_struc(1:K.f,1);

if nargin<3
    unitary = 1;
end

factors = [];

% Improve numerics by removing obviously
% redundant constraints
hash = 1+rand(1+size(A_equ,2),1);
[i,j] = unique([A_equ b_equ]*hash);
remove =  setdiff(1:size(A_equ,1),j);
if ~isempty(remove)
    A_equ(remove,:) = [];
    b_equ(remove,:) = [];
end

if ~unitary
    % Just use a crappy basis derived from A
    % FIX : fix dependent row case
    if 0
        [L,U,P] = lu(A_equ');
        s = find(diag(U));
        r = setdiff(1:length(U),s);
        n = size(s);
        [i,j] = find(P');
        H1 = A_equ(:,i(s));
        H2 = A_equ(:,i(r));
        x_equ = P'*(L'\(U'\b_equ));
        % FIX : use L and U stupid!
        H = P'*[-H1\H2;eye(size(H2,2))];

    else
        [L,U,P] = lu(A_equ');
        n = max(find(diag(U)));
        [i,j] = find(P');
        H1 = A_equ(:,i(1:n));
        H2 = A_equ(:,i(n+1:end));
        try
            x_equ = P'*linsolve(full(L'),linsolve(full(U'),full(b_equ),struct('LT',1==1)),struct('UT',1==1));
        catch
            x_equ = A_equ\b_equ;
        end
        % FIX : use L and U stupid!
        H = P'*[-H1\H2;eye(size(H2,2))];
    end
else
    % Use unitary basis
    try
        [Q,R,E] = qr(full(A_equ)');
    catch
        [Q,R,E] = qr(A_equ'); % Ouch, that big!
    end
    n = max(find(sum(abs(R),2)>1e-14*size(R,2)));

    Q1 = Q(:,1:n);
    R = R(1:n,:);
    x_equ = Q1*(R'\E'*b_equ);
    H = Q(:,n+1:end); % New basis  
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -