MATLAB实现求解一阶以及二阶电路时相关的电压

**

MATLAB实现求解一阶以及二阶电路时相关的电压

**
人机界面的设计思路
本文选用matlab进行源码的编写,并运用appdesigner来进行可视化。人机界面的设计思路以及框架如下:
1.首先由于需要实现RC零输入状态,RC零响应状态等许多情况,所以选用了appdesigner中的切换按钮组,来实现一开始进入界面对于相应功能的选择。
2.选择完相应功能后,需要输入节点信息。选用一系列的标签和编辑框来输入信息,最后添加一个输入完成后点击的确定按钮。
3.再建立一个表和一个确定按钮。来显示已经输入的数据,并且也可以根据表中的数据来进行回调函数中对于数据的处理。核对完表中的数据无误后,点击确定按钮。
4.由于可能需要输入电容初始电压值,以及电感初始电流值,如RC零输入,RL零输入等情况,在这些情况下需要显示电容初始电压值以及电感初始电流值,因此在这些情况下还要显示相关的标签和编辑框,以及相应的确定按钮。
5.建立一个坐标区,把输出的图形显示在坐标区内。
6.建立时间标签以及电容电压标签(或电感电压标签),以及一个确定旋钮。在输入一个时间后,点击确定旋钮,确保输出相应的电压值。
7.为了界面的美观,一开始设定元件的可视情况,并且在相关按钮的回调函数中调整相关元件的可视情况。
一阶RC全响应时各个元件的显示情况如下:
在这里插入图片描述

理论准备部分:
1:首先编写一个子程序,使之能够实现对电路的戴维宁等效或诺顿等效
2:对于一阶RL、RC电路
RC零输入响应
1:先用戴维宁等效化简为基本电路:即一个电容和一个等效电阻的串联
2:代入等效电阻和电容值及其电压初始值到微分方程:RC (du_c)/dt+u_c=0(u_0=u_c (0_+))
3:解微分方程:u_c=u_0 e^- t/RC τ=RC
4:根据微分方程的解画出图像
RL零输入响应
1:先用戴维宁等效化简为基本电路:即一个电感和一个等效电阻的串联
2:代入等效电阻和电感值到微分方程:L/R (di(t))/dt+i(t)=0 i_0=i_L (0_+)
3:解微分方程:i=i_0 e^- Rt/L τ=L/R
4:根据微分方程的解画出图像

RC零状态响应
1:先用戴维宁等效化简为基本电路:即一个电感和一个等效电阻及等效电压源的串联
2:代入等效电阻、等效电压源和电容值到微分方程:RC (du_c)/dt+u_c=U_s
3: 解微分方程:u_c=U_S (1-e^- t/RC) τ=RC
4:根据微分方程的解画出图像
RL零状态响应
1:先用诺顿等效化简为基本电路:即一个电感和一个等效电阻及等效电流源的并联
2:代入等效电阻、等效电流源和电感值及其电流初始值到微分方程:L/R (di(t))/dt+i(t)=I_S
3:解微分方程:i=I_s (1-e^- Rt/L) τ=L/R
4:根据微分方程的解画出图像
RC全响应
1:先用戴维宁等效化简为基本电路:即一个电感和一个等效电阻及等效电压源的串联
2:代入等效电阻、等效电压源和电容值及其电压初始值到微分方程:RC (du_c)/dt+u_c=U_s(u_0=u_c (0_+))
3: 解微分方程:u_c=u_0 e^- t/RC +U_S (1-e^- t/RC) τ=RC
4:根据微分方程的解画出图像
RL全响应
1:先用诺顿等效化简为基本电路:即一个电感和一个等效电阻及等效电流源的并联
2:代入等效电阻、等效电流源和电感值及其电流初始值到微分方程:L/R (di(t))/dt+i(t)=I_S i_0=i_L (0_+)
3:解微分方程:i=i_0 e^- Rt/L+I_s (1-e^- Rt/L) τ=L/R
4:根据微分方程的解画出图像
对RLC二阶电路
RLC电路
1:先用戴维宁等效化简为基本电路:即一个电感、一个电容和一个等效电阻及一个等效电压源的串联(若为零输入响应,则等效后的电压源值为0)
2:代入等效电阻、等效电压源(若为零输入响应,则等效后的电压源值为0)和电容及其电压初始值、以及电感及其电流初始值到微分方程:LC (d^2 u_c)/(dt^2 )+RC (du_c)/dt+u_c=U_s 其中(u_0=u_c (0_+))(i_0=i_L (0_+)),若为零状态响应(u_0=u_c (0_+ )=0)(i_0=i_L (0_+ )=0)
3:解微分方程:
若R>2√(L/C) ,则有两个不相等的实数根
1:解出实数根p_1和p_2
2:解微分方程得:u_c=u_0/(p_1-p_2 )(p_2 e^(p_1 t)-p_1 e^(p_2 t))
3:i=C (du_c)/dt 、u_L=L (di(t))/dt
4:根据微分方程的解画图
若R<2√(L/C) ,则解为一对共轭复根
1:δ=R/2L 、ω2=1/LC-(R/2L)2、β=arctan⁡(ω/δ)、ω_0=√(δ2+ω2 )
2:u_c=(U_0 ω_0)/ω e^(-δt)sin(ωt+β)
3:i=C (du_c)/dt 、u_L=L (di(t))/dt
4:根据微分方程的解画图
若R=2√(L/C) ,则解为一对相等的实数根
1:p_1=p_2=-R/2L;
2:u_c=(A_1+A_2 t) e^(-δt);
3:i=C (du_c)/dt 、u_L=L (di(t))/dt
4:根据微分方程的解画图
对于二阶GLC电路
先用诺顿等效化简为基本电路:即一个电感、一个电容和一个等效电阻及等效电流源的并联(若为零输入响应,则等效电流源则为0)、(若为零状态响应,则u_0=u_c (0_+ )=0)(i_0=i_L (0_+ )=0)
其他的分析方法与RLC类似,同样根据G与2√(C/L)的大小关系来分三种情况讨论
MATLAB的编程思路以及代码展示:
对于电路的理论分析以及等效过程和Python的编程思路相似,重点介绍如何处理输入的数据。总体的思路为:若为RC零输入,RL零输入,以及二阶的零输入情况,此时直接根据输入的数据解方程即可。否则就需要求出等效电源和等效电阻。
根据本app使用的求节点电压的算法,求出的解向量最后几个元素为流入电压源的电流,就想到用电压极小的电压源来替代要求等效电流源的节点,此时就需要用到替换函数。例如RC零状态的替换并进行求解的函数如下:

%此时运用将输入的电容元件替换成电压极小的电压源,以此来求得短路电流
                for i=1:number_of_components
                    if(data1{i}(1)=='C')
                        data1{i}(1)='V';
                        dianrong=data4{i};
                        data1{i}(2)=num2str(number_of_voltages);
                        temp_number=i;%用于记录此刻电容元件在列表中的位置
                    end
                end
                %若电容元件在列表中的位置就是在最后一位,那么只需进行相应的赋值运算
                if(temp_number==number_of_components)
                    w=data1{temp_number};
                    e=data2{temp_number};
                    r=data3{temp_number};
                    t=0.000000000001;
                    data1{number_of_components}=w;
                    data4{number_of_components}=t;
                    data2{number_of_components}=e;
                    data3{number_of_components}=r;
                end
                %若电容元件在列表中的位置不是最后一个,那么将后面的元件统统向前,最后把电容元件的信息放在最后一个
                if(temp_number<number_of_components)
                    w=data1{temp_number};
                    e=data2{temp_number};
                    r=data3{temp_number};
                    t=0.000000000001;
                    for j=temp_number:number_of_components-1
                        data1{j}=data1{j+1};
                        data2{j}=data2{j+1};
                        data3{j}=data3{j+1};
                        data4{j}=data4{j+1};
                    end
                    data1{number_of_components}=w;
                    data4{number_of_components}=t;
                    data2{number_of_components}=e;
                    data3{number_of_components}=r;
                end
                %电压源的数量
                number_of_voltages=voltages_number(data1,number_of_components);
                %电流源的数量
                number_of_current=current_number(data1,number_of_components);
                %构造电阻矩阵
                matrix_Resistance=zao_G(data1,data2,data3,data4,number_of_components,number_of_nodes);
                %构造电压矩阵
                matrix_Voltage=zao_V(data1,data2,data3,data4,number_of_components,number_of_nodes,number_of_voltages);
                %构造电压矩阵的转置矩阵
                matrix_Voltage_spin=matrix_Voltage';
                %构造零矩阵
                matrix_zero=zeros(number_of_voltages);
                %方程的系数
                xishu=[matrix_Resistance,matrix_Voltage;matrix_Voltage_spin,matrix_zero];
                %方程等式另一侧的值
                xiangliang=rightside(data1,data2,data3,data4,number_of_components,number_of_nodes,number_of_voltages);
                %解方程
                jie=(xishu^-1)*xiangliang;
                duanlu_current=jie(number_of_nodes+number_of_voltages,1);
                duanlu_current=abs(duanlu_current);
                %求戴维宁等效电压源
                data1=app.UITable.Data(:,1);
                data2=app.UITable.Data(:,2);
                data3=app.UITable.Data(:,3);
                data4=app.UITable.Data(:,4);
                %元件的数量
                number_of_components=length(data1);
                %节点的数量
                number_of_nodes=data3{1};
                for i=1:number_of_components
                    if number_of_nodes<data3{i}
                        number_of_nodes=data3{i};
                    end
                end
                %电压源的数量
                number_of_voltages=voltages_number(data1,number_of_components);
                %电流源的数量
                number_of_current=current_number(data1,number_of_components);

同理,要求等效电压的话,就用电阻值极大的电阻(程序中可用数值很大的值如999999来代替)接于要求的节点之间,求解方程,根据求出相应的节点电压值,做差并取绝对值得到等效电压源的电压,等效电压源的电压除以等效电流源的电流即可求得等效电阻。例如RC零状态的替换函数如下:

%将电容元件替换为无限大的电阻
                R_num=0;
                for i=1:number_of_components
                    if(data1{i}(1)=='R')
                        R_num=R_num+1;
                    end
                end%得到电阻的个数
                R_num=R_num+1;
                for i=1:number_of_components
                    if(data1{i}(1)=='C')
                        data1{i}(1)='R';
                        data1{i}(2)=num2str(R_num);
                        temp_number=i;%用于记录此刻电容元件在列表中的位置
                    end
                end
                %若电容元件在列表中的位置就是在最后一位,那么只需进行相应的赋值运算
                if(temp_number==number_of_components)
                    w=data1{temp_number};
                    e=data2{temp_number};
                    r=data3{temp_number};
                    t=999999999999999;
                    data1{number_of_components}=w;
                    data4{number_of_components}=t;
                    data2{number_of_components}=e;
                    data3{number_of_components}=r;
                end
                %若电容元件在列表中的位置不是最后一个,那么将后面的元件统统向前,最后把电容元件的信息放在最后一个
                if(temp_number<number_of_components)
                    w=data1{temp_number};
                    e=data2{temp_number};
                    r=data3{temp_number};
                    t=999999999999999;
                    for j=temp_number:number_of_components-1
                        data1{j}=data1{j+1};
                        data2{j}=data2{j+1};
                        data3{j}=data3{j+1};
                        data4{j}=data4{j+1};
                    end
                    data1{number_of_components}=w;
                    data4{number_of_components}=t;
                    data2{number_of_components}=e;
                    data3{number_of_components}=r;
                end
                %构造电阻矩阵
                matrix_Resistance=zao_G(data1,data2,data3,data4,number_of_components,number_of_nodes);
                %构造电压矩阵
                matrix_Voltage=zao_V(data1,data2,data3,data4,number_of_components,number_of_nodes,number_of_voltages);
                %构造电压矩阵的转置矩阵
                matrix_Voltage_spin=matrix_Voltage';
                %构造零矩阵
                matrix_zero=zeros(number_of_voltages);
                %方程的系数
                xishu=[matrix_Resistance,matrix_Voltage;matrix_Voltage_spin,matrix_zero];
                %方程等式另一侧的值
                xiangliang=rightside(data1,data2,data3,data4,number_of_components,number_of_nodes,number_of_voltages);
                %解方程
                jie=(xishu^-1)*xiangliang;
                %如果前节点为0,则断路电压只要取后节点的电压值的绝对值
                if(data2{number_of_components}==0)
                    hou_jiedian=data3{number_of_components};
                    duanlu_voltage=jie(hou_jiedian,1);
                end
                if(data2{number_of_components}>0)
                    qian_jiedian=data2{number_of_components};
                    hou_jiedian=data3{number_of_components};
                    duanlu_voltage=jie(hou_jiedian,1)-jie(qian_jiedian,1);
                end
                duanlu_voltage=abs( duanlu_voltage);
                v=duanlu_voltage;
                %求出等效电阻
                dengxiao_dianzu=duanlu_voltage/duanlu_current;

上述处理完之后需要进行的是解方程并且画图处理,运用MATLAB中的dsolve函数求解微分方程,并且根据得出的解根据plot函数求解出相应的图形。例如RC零状态的求解微分方程过程如下:

%解微分方程
                q=dianrong*dengxiao_dianzu;%时间常数
                app.EditField_6.Visible=true;
                app.EditField_6.Value=q;
                app.UIAxes.XLabel.String='时间t/s'
                app.UIAxes.YLabel.String='电容电压U(C)/v'
                app.UIAxes.Title.String='电容电压与时间的关系'
                app.UIAxes.Visible=true
                syms u(t)
                u=dsolve('q*Du+u=v','u(0)=0','t');
                q=10*q;
                t=0:0.5:q;
                u=eval(u);
                plot(app.UIAxes,t,u);
                app.tsEditField.Visible=true;
                app.UcvEditField.Visible=true;
                app.Button_5.Visible=true;
                app.tsLabel.Visible=true;
                app.UcvLabel.Text="U(C)/v";
                app.UcvLabel.Visible=true;
                app.Label_3.Visible=true;

最后根据输入的时间值,求解出相对应的电容或者电感电压值,运用dsolve来求解微分方程,运用subs将具体的值替代相应的除自变量,因变量以外的字符,运用matlabFunction求出具体的某一个时间点时相关的电压值。二阶并联零状态的求解过程如下:

  %解微分方程
                syms t b c z h
                i=dsolve('b*D2i+c*Di+z*i=h','i(0)=0,Di(0)=0','t');
                b=dianrong*diangan*R;
                c=diangan;
                z=R;
                h=duanlu_voltage;
                i=subs(i);
                syms  f(t)
                f=diangan*diff(i);
                f=matlabFunction(f);
                app.UcvEditField.Value=f(app.tsEditField.Value);
                app.EditField_8.Value=f(app.tsEditField.Value);
            end
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值