「cvx型の値をdoubleに変換できない」というエラーの解決方法

「cvx型の値をdoubleに変換できない」というエラーの解決方法

  1. 以下のコードでエラーが発生しました。この問題を解決する方法を教えてください。

`cvx_begin variable E_user(n) nonnegative variable sigma(n) nonnegative variable Sigma(n) nonnegative variable Omega(n) nonnegative obj=0; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sigma=zeros(1,K_num); Sigma=zeros(1,K_num); Omega=zeros(1,K_num);
    
        % Calculate sigma
        for t=1:K_num
            my_hold=zeros(M*N,M*N);
            for i=1:K_num
                if i~=t
                    my_hold=my_hold+E_user(i)*G_DDMA(:,:,i)*G_DDMA(:,:,i)';
                end
            end
            sigma(t)=trace(pinv(D(:,:,t))*U(:,:,t)*H(:,:,t)*my_hold*H(:,:,t)'*U(:,:,t)'*(pinv(D(:,:,t)))');
        end
    
        % Calculate Sigma
        for t=2:K_num
            my_hold=zeros(M*N,M*N);
            for i=2:K_num
                if i~=t
                    my_hold=my_hold+E_user(i)*G_DDMA(:,:,i)*G_DDMA(:,:,i)';
                end
            end
            Sigma(t)=trace(pinv(D(:,:,1))*U(:,:,1)*H(:,:,1)*my_hold*H(:,:,1)'*U(:,:,1)'*(pinv(D(:,:,1)))');
        end
        my_hold=zeros(M*N,M*N);
        for i=3:K_num
            my_hold=my_hold+E_user(i)*G_DDMA(:,:,i)*G_DDMA(:,:,i)';
        end
        Sigma(1)=trace(pinv(D(:,:,2))*U(:,:,2)*H(:,:,2)*my_hold*H(:,:,2)'*U(:,:,2)'*(pinv(D(:,:,2)))');
    
    
        % Calculate Omega
        for i=2:K_num
            Omega(i)=trace(pinv(D(:,:,1))*U(:,:,1)*H(:,:,1)*G_DDMA(:,:,i)*G_DDMA(:,:,i)'*H(:,:,1)'*U(:,:,1)'*(pinv(D(:,:,1)))');
        end
        Omega(1)=trace(pinv(D(:,:,2))*U(:,:,2)*H(:,:,2)*G_DDMA(:,:,1)*G_DDMA(:,:,1)'*H(:,:,2)'*U(:,:,2)'*(pinv(D(:,:,2)))');
    
        sigma=real(sigma);
        Sigma=real(Sigma);
        Omega=real(Omega);
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for i=2:n
            obj=obj+log(1+2*beta(i)*sqrt(E_user(1)+alpha*Sigma(1)+N0)-beta(i)^2)*(N0+alpha*sigma(i)*Omega(1))/log(2);
        end
        obj=obj+log(1+2*beta(1)*sqrt(E_user(2)+alpha*Sigma(2)+N0)-beta(1)^2)*(N0+alpha*sigma(1)*Omega(2))/log(2);
        maximize (obj)
        E_sum=0;
        for i=1:n
            E_sum=E_sum+E_user(i);
        end
        subject to 
        E_sum<=E_total;
    cvx_end`

エラーは「sigma(t)」の行で「型 'cvx' の値を 'double' に変換できないため、割り当てを実行できません」という内容でした。

  1. 変数と式を混同しているようです。

sigma=zeros(1,K_num); という行は、前に宣言された変数を上書きしています。sigmaは変数として宣言されましたが、my_holdE_userを含む式であるため、CVX式になります。sigma(t)my_holdを含むCVX式を代入しようとしていますが、sigma(t)はdouble型であり、CVX式ではないため、エラーが発生します。

代わりに以下のように宣言してください:

expression sigma(n) 
expression Sigma(n) 
expression Omega(n)

宣言された式は、CVXによって自動的にすべてゼロで初期化されます。非負である必要がある場合は、以下の制約を追加する必要があります:

sigma >= 0
Sigma >= 0
Omega >= 0

タグ: CVX MATLAB最適化 数理最適化 エラーハンドリング 変数宣言

6月4日 17:46 投稿