主要内容

求解刚性晶体管微分代数方程

这个例子展示了如何使用ode23t来求解描述电路[1]的僵硬微分代数方程(DAE)。在示例文件中编码的单晶体管放大器问题amp1dae.m可以重写为半显式形式,但这个例子解决了它的原始形式 u ϕ u .这个问题包括一个常数的奇异质量矩阵

晶体管放大电路由六个电阻、三个电容和一个晶体管组成。

  • 初始电压信号为 U e t 0 4 2 0 0 π t

  • 工作电压为 U b 6

  • 节点的电压是 U t 1 2 3. 4 5

  • 电阻的值 R 1 2 3. 4 5 6 是恒定的,通过每个电阻的电流满足 U / R

  • 电容器的值 C 1 2 3. 是恒定的,通过每个电容器的电流满足 C / dt

目标是求出通过节点5的输出电压, U 5 t

要在MATLAB®中求解该方程,需要对方程进行编码,对质量矩阵进行编码,并在调用求解器之前设置初始条件和积分区间ode23t.您可以将所需的函数作为本地函数包含在文件的末尾(如这里所做的),或者将它们作为单独的、命名的文件保存在MATLAB路径的一个目录中。

代码质量矩阵

利用基尔霍夫定律使通过每个节点(1到5)的电流相等,可以得到一个由五个方程组成的描述电路的方程组:

节点 1 U e t R 0 - U 1 R 0 + C 1 U 2 - U 1 0 节点 2 U b R 2 - U 2 1 R 1 + 1 R 2 + C 1 U 1 - U 2 - 0 01 f U 2 - U 3. 0 节点 3. f U 2 - U 3. - U 3. R 3. - C 2 U 3. 0 节点 4 U b R 4 - U 4 R 4 + C 3. U 5 - U 4 - 0 99 f U 2 - U 3. 0 节点 5 - U 5 R 5 + C 3. U 4 - U 5 0

这个系统的质量矩阵,通过收集方程左边的导数项得到,有这样的形式

- c 1 c 1 0 0 0 c 1 - c 1 0 0 0 0 0 - c 2 0 0 0 0 0 - c 3. c 3. 0 0 0 c 3. - c 3.

在哪里 c k k × 1 0 - 6 k 1 2 3.

用适当的常数创建一个质量矩阵 c k ,然后使用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情况,选择);

阴谋的结果

绘制初始电压图 U e t 和输出电压 U 5 t

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”);

图中包含一个轴对象。标题为“One Transistor Amplifier DAE Problem Solved by ODE23T”的轴对象包含2个类型为line的对象。这些对象表示输入电压U_e(t),输出电压U_5(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)];结束

另请参阅

|

相关的话题