求解刚性晶体管微分代数方程
这个例子展示了如何使用ode23t
求解描述电路[1]的刚性微分代数方程(DAE)。在示例文件中编码的单晶体管放大器问题amp1dae.m可以用半显式形式重写,但是这个例子用原始形式解决了它
。这个问题包括一个恒定的奇异质量矩阵
。
晶体管放大电路包含六个电阻,三个电容和一个晶体管。
初始电压信号为 。
工作电压为 。
节点上的电压由 。
电阻的值 是恒定的,并且通过每个电阻的电流满足 。
电容器的值 是恒定的,并且通过每个电容器的电流满足 。
目标是求出节点5的输出电压, 。
要在MATLAB®中求解该方程,您需要对方程进行编码,对质量矩阵进行编码,并在调用求解器之前设置初始条件和积分间隔ode23t
。您可以将所需的函数作为本地函数包含在文件末尾(如此处所示),或者将它们保存为单独的命名文件,保存在MATLAB路径上的目录中。
代码质量矩阵
利用基尔霍夫定律均衡通过每个节点(1到5)的电流,你可以得到一个由五个方程组成的系统来描述电路:
这个系统的质量矩阵,通过收集方程左边的导数项得到,有这样的形式
在哪里 为 。
用适当的常量创建一个质量矩阵
,然后使用odeset
函数来指定质量矩阵。即使很明显质量矩阵是奇异的,留下“MassSingular”
选项的默认值为“也许”
测试求解器对DAE问题的自动检测。
C = 1e-6 * (1:3);M = 0 (5,5);M(1,1) = -c(1);M(1,2) = c(1);M(2,1) = c(1);M(2,2) = -c(1);M(3,3) = -c(2);M(4,4) = -c(3);M(4,5) = c(3);M(5,4) = c(3); M(5,5) = -c(3); opts = odeset(“质量”, M);
代码方程
这个函数transampdae
包含本例的方程组。该函数定义了所有电压和常数参数的值。聚集在方程左侧的导数在质量矩阵中编码,并且transampdae
对等式右边进行编码。
函数dut = transampdae(t,u)定义电压和参数Ue = @(t) 0.4*sin(200* *t);Ub = 6;R0 = 1000;R15 = 9000;Alpha = 0.99;Beta = 1e-6;Uf = 0.026;定义方程组f23 = *(exp((u(2) - u(3))/Uf) - 1);dudt =[(问题(t) - u (1)) / R0 -(乌兰巴托/ R15 - u (2) * 2 / R15 f23(1α)*)- (f23 - u (3) / R15) -((乌兰巴托- u (4)) / R15 -αf23 *) (u (5) / R15)];结束
注意:这个函数作为一个局部函数包含在示例的末尾。
初始条件
设置初始条件。本例对通过[1]计算的每个节点的电流使用一致的初始条件。
Ub = 6;0(1) = 0;u0(2) = Ub/2;u0(3) = Ub/2;u0(4) = Ub;U0 (5) = 0;
解方程组
在时间间隔内求解DAE系统0.05 [0]
使用ode23t
。
Tspan = [0 0.05];[t,u] = ode23t(@transampdae,tspan, 0,opts);
阴谋的结果
绘制初始电压 输出电压 。
Ue = @(t) 0.4*sin(200* *t);情节(t)问题(t)“o”t u (:, 5),“。”)轴([0 0.05 -3 2]);传奇(输入电压U_e(t),输出电压U_5(t),“位置”,“西北”);标题(ODE23T解决单晶体管放大器DAE问题);包含(“t”);
参考文献
海尔,E.和格哈德·万纳。常微分方程的求解II:刚性和微分代数问题。[10]柏林,海德堡,1991,第377页。
本地函数
这里列出的是ODE求解器使用的本地帮助函数ode23t
调用来计算解。或者,您可以将此函数作为其自己的文件保存在MATLAB路径上的目录中。
函数dut = transampdae(t,u)定义电压和参数Ue = @(t) 0.4*sin(200* *t);Ub = 6;R0 = 1000;R15 = 9000;Alpha = 0.99;Beta = 1e-6;Uf = 0.026;定义方程组f23 = *(exp((u(2) - u(3))/Uf) - 1);dudt =[(问题(t) - u (1)) / R0 -(乌兰巴托/ R15 - u (2) * 2 / R15 f23(1α)*)- (f23 - u (3) / R15) -((乌兰巴托- u (4)) / R15 -αf23 *) (u (5) / R15)];结束