Matlab实现劳斯判据(GUI)

最近想学一下matlab的GUI编写,就是简单的玩一玩,想来想去就做一个和我专业相关一点的东西吧,就突然想到输入一个闭环传函特征多项式,给出系统稳定与否的结果,也可以给出劳斯表,当然现在函数已经实现,GUI有时间就能编好,到时候也会传到GitHub上。
给出程序流程图

劳斯判据流程图

不多说,贴上代码,其实注释已经写的很详细了

myrouth.m
function [RA,result]=myrouth(poli)

%part1 calculate the routh array
%
%   part1 will calculate the symbolic Routh array RA for 
%   polynomial poli(s). The following special cases are considered:
%   1) zero first elements and 2) rows of zeros. All zero first 
%   elements are replaced with the variable EPSILON
%   which can be later substituted with positive small
%   numbers[in this code,small number is 1/100 * min(poli)]. When a  
%   row of zeros is found, the auxiliary polynomial is used.
%
%   Examples:
%
%   1) Routh array for s^3+2*s^2+3*s+1
%
%       >>ra=routh([1 2 3 1])
%
%   2) Routh array for s^3+a*s^2+b*s+c
%   
%       >>syms a b c;
%       >>ra=routh([1 a b c]);
%
% 
%
flag = 0;    %to help judging the result,if row of zeros happen,set flag equals to 1
epsilon = min(poli)/100; %select one percent of the minimum of poli as epsilon
% if(nargin<2),
%   fprintf('\nError: Not enough input arguments given.');
%   return
% end
if all(poli<0)
    poli = -1 * poli;       %transform poli to all positive
end

dim=size(poli);     %get size of poli       

coeff=dim(2);               %get number of coefficients
RA=sym(zeros(coeff,ceil(coeff/2))); %initialize symbolic Routh array 

for i=1:coeff,
    RA(2-rem(i,2),ceil(i/2))=poli(i); %assemble 1st and 2nd rows
end

rows=coeff-2;       %number of rows that need determinants
index=zeros(rows,1);    %initialize columns-per-row index vector

for i=1:rows,
    index(rows-i+1)=ceil(i/2); %form index vector from bottom to top
end

for i=3:coeff,              %go from 3rd row to last
    if(all(RA(i-1,:)==0)),      %row of zeros
            flag = 1;           %to help judging result
            fprintf('\nSpecial Case: Row of zeros detected.\n');
            a=coeff-i+2;        %order of auxiliary equation
            b=ceil(a/2)-rem(a,2)+1; %number of auxiliary coefficients
            temp1=RA(i-2,1:b);  %get auxiliary polynomial
            temp2=a:-2:0;       %auxiliry polynomial powers
            RA(i-1,1:b)=temp1.*temp2;   %derivative of auxiliary
    elseif(RA(i-1,1)==0),       %first element in row is zero
            fprintf('\nSpecial Case: First element is zero.\n');
            RA(i-1,1)=epsilon;  %replace by epsilon
    end
                %compute the Routh array elements
    for j=1:index(i-2), 
        RA(i,j)=-det([RA(i-2,1) RA(i-2,j+1);RA(i-1,1) RA(i-1,j+1)])/RA(i-1,1);
    end
end

%part2 According to the routh array,judge the stablity of system
first_colomn_RA = RA(:,1);
if min(first_colomn_RA)<0
    result = 'The system is unstable';
elseif all(first_colomn_RA>0)      %first_colomn_RA has no zero
    if flag == 1
        result = 'The stablity can not be judged simply by Routh Criterion';
    elseif flag == 0
        result = 'The system is stable';
    end
end

在matlab的workspace里面输入

guide

会出现如下图,点击新建,然后拖拽各种控件实现自己想要的效果

新建GUI界面

这里我主要想实现的效果是:输入系统闭环传函特征多项式的系数向量,点击按钮,就可以得到稳定性判定结果,并且显示得到的劳斯表(注意要把那个可编辑文本的框的属性里面的max调大一点,否则只能显示一行文本)还设计了一个按钮,一点就可以跳转到一个网页。所以设计如下(后来我还优化了一些细节,比如运行以后怎么让控件和字体自动适应分辨率
我的GUI界面

会生成两个文件:routhGUI.m和routhGUI.fig,我的routhGUI.m里面如下,大部分是matlab自动生成的

function varargout = routhGUI(varargin)
% ROUTHGUI MATLAB code for routhGUI.fig
%      ROUTHGUI, by itself, creates a new ROUTHGUI or raises the existing
%      singleton*.
%
%      H = ROUTHGUI returns the handle to a new ROUTHGUI or the handle to
%      the existing singleton*.
%
%      ROUTHGUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in ROUTHGUI.M with the given input arguments.
%
%      ROUTHGUI('Property','Value',...) creates a new ROUTHGUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before routhGUI_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to routhGUI_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help routhGUI

% Last Modified by GUIDE v2.5 21-May-2019 14:45:35

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @routhGUI_OpeningFcn, ...
                   'gui_OutputFcn',  @routhGUI_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before routhGUI is made visible.
function routhGUI_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to routhGUI (see VARARGIN)

% Choose default command line output for routhGUI
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes routhGUI wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = routhGUI_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;



function editC_Callback(hObject, eventdata, handles)
% hObject    handle to editC (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of editC as text
%        str2double(get(hObject,'String')) returns contents of editC as a double


% --- Executes during object creation, after setting all properties.
function editC_CreateFcn(hObject, eventdata, handles)
% hObject    handle to editC (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in btnC.
function btnC_Callback(hObject, eventdata, handles)
% hObject    handle to btnC (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
feature_polynomial = str2num(get(handles.editC,'String'));% 这里用系统提示的str2double不行
[RA,result] = myrouth(feature_polynomial);
Ra = num2str(eval(RA));
set(handles.editResult,'String',result);
set(handles.editTable,'String',Ra);


function editResult_Callback(hObject, eventdata, handles)
% hObject    handle to editResult (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of editResult as text
%        str2double(get(hObject,'String')) returns contents of editResult as a double


% --- Executes during object creation, after setting all properties.
function editResult_CreateFcn(hObject, eventdata, handles)
% hObject    handle to editResult (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function editRouth_Callback(hObject, eventdata, handles)
% hObject    handle to editRouth (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of editRouth as text
%        str2double(get(hObject,'String')) returns contents of editRouth as a double


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
url = 'https://en.wikipedia.org/wiki/Edward_Routh';
web(url,'-browser');



function editTable_Callback(hObject, eventdata, handles)
% hObject    handle to editTable (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of editTable as text
%        str2double(get(hObject,'String')) returns contents of editTable as a double


% --- Executes during object creation, after setting all properties.
function editTable_CreateFcn(hObject, eventdata, handles)
% hObject    handle to editTable (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

运行一下,检验一下:

右上角点击放大后

正常运行出来的大小

系统不稳定

其实在编写的时候,发现劳斯判据有小BUG,就是劳斯判据的初衷就是之前人们没有很强的计算能力,发明的代数稳定判据方法。但是会出现一种全零行的特例,那时还需要求一下上一行构成的辅助方程(auxiliary equation)的根的情况,才能判断整个系统的稳定性,而不只是看补全后的劳斯表,所以还是roots()函数来的暴力直接!!
但毕竟锻炼了一下matlab的GUI编程,也对之前的知识复习一遍,在自己动手编的时候才会更深入发现问题,也是有收获的!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容