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