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

📄 macaa.m

📁 改程序基于改进节点法(Modified Nodal Approach)与全矩阵技术在Matlab中实现线性电阻电路的符号分析。可以在GUI中描述待分析的电路结构、启动分析并直观的观察分析结果。在实现分
💻 M
📖 第 1 页 / 共 3 页
字号:
    else    % 更改
        
        if ~isempty(BRANCHMAT)
            m = 1:5;
            switch handles.metricdata.style
                case 1  % R
                    STYLENAME(handles.metricdata.DataViewer,m) = 'R    '; 
                case 2  % G
                    STYLENAME(handles.metricdata.DataViewer,m) = 'G    '; 
                case 3  % VS
                    STYLENAME(handles.metricdata.DataViewer,m) = 'VS   '; 
                case 4  % CS
                    STYLENAME(handles.metricdata.DataViewer,m) = 'CS   '; 
                case 5  % VCCS
                    STYLENAME(handles.metricdata.DataViewer,m) = 'VCCS '; 
                case 6  % VCVS
                    STYLENAME(handles.metricdata.DataViewer,m) = 'VCVS '; 
                case 7  % CCCS
                    STYLENAME(handles.metricdata.DataViewer,m) = 'CCCS '; 
                case 8  % CCVS
                    STYLENAME(handles.metricdata.DataViewer,m) = 'CCVS '; 
                case 9  % OPAMP
                    STYLENAME(handles.metricdata.DataViewer,m) = 'OPAMP'; 
            end
            BRANCHMAT(handles.metricdata.DataViewer,1) = handles.metricdata.style;
            
            if all(sum(isnan(BRANCHMAT(:,2))))              % 符号运算
                
                BRANCHVAL(handles.metricdata.DataViewer)   = handles.metricdata.value; % 参数值符号处理
                
            else    % 数值
                
                if isnan(str2double(handles.metricdata.value))  % 新插入为符号
                    
                    for i = 1:length(BRANCHMAT(:,2))
                        BRANCHVAL(i) = sym(BRANCHMAT(i,2));
                    end
                    BRANCHVAL(handles.metricdata.DataViewer)   = sym(handles.metricdata.value);
                    BRANCHMAT(handles.metricdata.DataViewer,2) = NaN;
                    
                else                                            % 新插入为数值
                    BRANCHMAT(handles.metricdata.DataViewer,2) = str2double(handles.metricdata.value);
                end
                
            end  

            BRANCHMAT(handles.metricdata.DataViewer,3) = handles.metricdata.nfrom;
            BRANCHMAT(handles.metricdata.DataViewer,4) = handles.metricdata.nto;
            BRANCHMAT(handles.metricdata.DataViewer,5) = handles.metricdata.ncfrom;
            BRANCHMAT(handles.metricdata.DataViewer,6) = handles.metricdata.ncto;
        end
        
        handles.metricdata.DataViewer = NN;
        guidata(handles.figure1, handles);
        set(handles.InputViewer, 'Value', handles.metricdata.DataViewer);
        
        % 更新显示
        ResetItems(hObject, handles);
    end
    
    
%                                                             CLEAR --- 2 -
% --- 编辑-清空
function Clear_Callback(hObject, eventdata, handles)
    global NN
    global BRANCHMAT
    global BRANCHVAL
    global STYLENAME
    
    
    set(handles.MNAMatViewer, 'String',[]);
    set(handles.ANSViewer, 'String',[]);
    set(handles.InfoViewer, 'String',[]);
    
    set(handles.BranchStyle, 'Value', 1);
    set(handles.Value, 'String', '0');
    set(handles.nfrom, 'String', '0');
    set(handles.nto, 'String', '0');
    set(handles.ncfrom, 'String', '0');
    set(handles.ncto, 'String', '0');
    set(handles.Unit, 'String', 'Ohm');
    set(handles.ncto, 'Enable', 'off');
    set(handles.NctoText, 'Enable', 'off');
    set(handles.Value, 'Enable', 'on');
    set(handles.ValueText, 'Enable', 'on');
    set(handles.NcfromText, 'String', '设置压定义:');
    
    handles.metricdata.style  = 1;
    handles.metricdata.value  = 0;
    handles.metricdata.nfrom  = 0;
    handles.metricdata.nto    = 0;
    handles.metricdata.ncfrom = 0;
    handles.metricdata.ncto   = 0;
    
    BRANCHMAT = [];
    
    BRANCHVAL = sym([]);
    
    STYLENAME = [];
    NN = 0;
    set(handles.BranchNum, 'String', 1);
    handles.metricdata.DataViewer = 0;
    guidata(handles.figure1, handles);
    set(handles.InputViewer, 'Value',1);
    
    % 更新显示
    ResetItems(hObject, handles);
    


    
    
%                                                            DELETE --- 3 -
% --- 编辑-删除
function Delete_Callback(hObject, eventdata, handles)
    global BRANCHMAT
    global BRANCHVAL
    global STYLENAME
    global NN
    
    if ~isempty(BRANCHMAT)
       NN = NN - 1;
       BRANCHMAT(handles.metricdata.DataViewer,:) = [];
       STYLENAME(handles.metricdata.DataViewer,:) = [];
       
       BRANCHVAL(handles.metricdata.DataViewer) = [];
             
       handles.metricdata.DataViewer = NN;
       guidata(handles.figure1, handles);
       set(handles.InputViewer, 'Value', handles.metricdata.DataViewer);
       
       % 更新显示
       ResetItems(hObject, handles);   
       
    end



        
%                                                            INSERT --- 4 -
% --- 编辑-插入
function Change_Callback(hObject, eventdata, handles)
    global BRANCHMAT 
    global BRANCHVAL
    global STYLENAME
    global NN
    
    if ~isempty(BRANCHMAT)
        
        m = 1:5;
        switch handles.metricdata.style
            case 1  % R
                InsertSN(m) = 'R    '; 
            case 2  % G
                InsertSN(m) = 'G    '; 
            case 3  % VS
                InsertSN(m) = 'VS   '; 
            case 4  % CS
                InsertSN(m) = 'CS   '; 
            case 5  % VCCS
                InsertSN(m) = 'VCCS '; 
            case 6  % VCVS
                InsertSN(m) = 'VCVS '; 
            case 7  % CCCS
                InsertSN(m) = 'CCCS '; 
            case 8  % CCVS
                InsertSN(m) = 'CCVS '; 
            case 9  % OPAMP
                InsertSN(m) = 'OPAMP'; 
        end
        InsertBM(1) = handles.metricdata.style;
        InsertValue = sym(handles.metricdata.value);
        InsertBM(2) = str2double(handles.metricdata.value);
        InsertBM(3) = handles.metricdata.nfrom;
        InsertBM(4) = handles.metricdata.nto;
        InsertBM(5) = handles.metricdata.ncfrom;
        InsertBM(6) = handles.metricdata.ncto;
        
        if all(sum(isnan(BRANCHMAT(:,2))))              % 符号运算
                BRANCHVAL = [BRANCHVAL(1:handles.metricdata.DataViewer-1),InsertValue,BRANCHVAL(handles.metricdata.DataViewer:NN)];
                BRANCHMAT = [BRANCHMAT(1:handles.metricdata.DataViewer-1,:);InsertBM;BRANCHMAT(handles.metricdata.DataViewer:NN,:)];
        else                                            % 数值
                handles.metricdata.value
            str2double(handles.metricdata.value)
                if isnan(str2double(handles.metricdata.value))  % 新插入为符号
                    for i = 1:length(BRANCHMAT(:,2))
                        BRANCHVAL(i) = sym(BRANCHMAT(i,2));
                    end
                    BRANCHVAL = [BRANCHVAL(1:handles.metricdata.DataViewer-1),InsertValue,BRANCHVAL(handles.metricdata.DataViewer:NN)];
                    BRANCHMAT = [BRANCHMAT(1:handles.metricdata.DataViewer-1,:);InsertBM;BRANCHMAT(handles.metricdata.DataViewer:NN,:)];
                else                                            % 新插入为数值
                    BRANCHVAL = [BRANCHVAL(1:handles.metricdata.DataViewer-1),InsertValue,BRANCHVAL(handles.metricdata.DataViewer:NN)];
                    BRANCHMAT = [BRANCHMAT(1:handles.metricdata.DataViewer-1,:);InsertBM;BRANCHMAT(handles.metricdata.DataViewer:NN,:)];
                end
        end  

        STYLENAME = [STYLENAME(1:handles.metricdata.DataViewer-1,:);double(InsertSN);STYLENAME(handles.metricdata.DataViewer:NN,:)];
        
        NN =NN + 1;
        handles.metricdata.DataViewer = NN; 
        set(handles.InputViewer, 'Value', handles.metricdata.DataViewer);
        guidata(handles.figure1, handles);
    end 
    
    % 更新显示
    ResetItems(hObject, handles);
    
    
    
%                                                               ANA --- 5 -
% --- 电路分析
function Ana_Callback(hObject, eventdata, handles)
    global BRANCHMAT
    global BRANCHVAL
    global STYLENAME
    global ANS
    global NN
    
    % 调用分析函数SMNA()
    ANS = SMNA(BRANCHMAT,BRANCHVAL);
    
    % Workspace 输出
    assignin('base','MNAStructure',ANS);            % 输出 MNASmatrix 到基本工作区
    assignin('base','BranchMatrix',BRANCHMAT);      % 输出 BranchMatrix 到基本工作区
    if all(sum(isnan(BRANCHMAT(:,2))))              % 符号运算
        assignin('base','BranchValue',BRANCHVAL);   % 输出 BranchValue 到基本工作区
    end
    
    % Command Window 输出
    display('支路数据矩阵:');
    if all(sum(isnan(BRANCHMAT(:,2))))              % 符号运算
        dis = num2str(BRANCHMAT);
        dis(:,1) = [];
        dis(:,1) = [];

        disValue = char(cell(BRANCHVAL));
        disBlank(1:length(BRANCHVAL),:) = ' ';

        BranchNumber = num2str([1:NN]');   
        dis = [char(STYLENAME),BranchNumber,disBlank,disBlank,disValue,disBlank,dis]
    else                                            % 数值运算
        BRANCHMAT
    end
    
    display('MNA增广矩阵:');
    ANS.MNAMatrix
    
    display('分析结果:');
    ANS.ANS
    
    % GUI MNA分析数据输出
    if all(sum(isnan(BRANCHMAT(:,2))))              % 符号运算
        MNAMat = reshape(cellstr(char(cell(ANS.MNAMatrix))),size(ANS.MNAMatrix));
        MNASize  = size(MNAMat);

        disMNAMat = blanks(MNASize(1))';
        disBlank = disMNAMat;
        for n = 1:MNASize(2)
            disMNAMat = [disMNAMat,disBlank,disBlank,disBlank,char(MNAMat(:,n))];
        end
        set(handles.MNAMatViewer, 'String',disMNAMat);
    else                                            % 数值运算
        set(handles.MNAMatViewer, 'String',num2str(ANS.MNAMatrix));
    end
    
    if ~isempty(ANS.ANS)
        VDBranchNumber = length(ANS.VoltageControlBranch);  % 电压定义支路数

        Bnum2VDBnum( ANS.VoltageControlBranch ) = 1:VDBranchNumber;   % 建立查找表并排序

        % GUI 结果输出处理
        dis_ANS01(1:ANS.NodeNumber,1) = 'U';
        
        dis_ANS31 = [1:ANS.NodeNumber]';
        
        dis_ANS11(1:ANS.NodeNumber,1) = ' ';
        dis_ANS11(1:ANS.NodeNumber,2) = '=';
        dis_ANS11(1:ANS.NodeNumber,3) = ' ';
        
        dis_ANS21(1:ANS.NodeNumber,1) = ' ';
        dis_ANS21(1:ANS.NodeNumber,2) = 'V';
        
        if ~(VDBranchNumber == 0)
            dis_ANS02(1:VDBranchNumber,1) = 'I';
            
            dis_ANS32 = ANS.VoltageControlBranch;
            
            dis_ANS12(1:VDBranchNumber,1) = ' ';
            dis_ANS12(1:VDBranchNumber,2) = '=';
            dis_ANS12(1:VDBranchNumber,3) = ' ';
            
            dis_ANS22(1:VDBranchNumber,1) = ' ';
            dis_ANS22(1:VDBranchNumber,2) = 'A';
            
        else
            dis_ANS02 = [];
            dis_ANS12 = [];
            dis_ANS22 = [];
            dis_ANS32 = [];
        end
            
        dis_ANS0 = [dis_ANS01;dis_ANS02];
        dis_ANS1 = [dis_ANS11;dis_ANS12];
        dis_ANS2 = [dis_ANS21;dis_ANS22];
        dis_ANS3 = num2str([dis_ANS31;dis_ANS32]);
        if all(sum(isnan(BRANCHMAT(:,2))))              % 符号运算
            dis = [dis_ANS0,dis_ANS3,dis_ANS1,char(cell(ANS.ANS)),dis_ANS2];
        else                                            % 数值运算
            dis = [dis_ANS0,dis_ANS3,dis_ANS1,num2str(ANS.ANS),dis_ANS2];
        end
        set(handles.ANSViewer, 'String',dis);
        
        % GUI 电路数据输出处理
        dis_INF1 = char('电路节点数:','电路支路数:','压控支路数:');
        dis_INF2 = num2str([ANS.NodeNumber;ANS.BranchNumber;VDBranchNumber]);
        dis_INF = [dis_INF1,dis_INF2];
        set(handles.InfoViewer, 'String',dis_INF);
    end
    
    
%                                                           SAVEANS --- 6 -
% --- 结果保存处理
function SaveAns_Callback(hObject, eventdata, handles)
    global ANS
    if ~isempty(ANS)
        answer = ANS.ANS;
        % MAT格式保存结果
        save ANSMatrix answer;
    end

%                                                         SAVEINPUT --- 7 -

⌨️ 快捷键说明

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