解决硬晶体管微分代数方程
这个例子展示了如何使用ode23t
解决一个僵硬的微分代数方程(DAE)描述了一种电路[1]。有关晶体管放大器的问题示例文件的编码amp1dae.m可以在半显式重写形式,但这个例子解决了原来的形式
。这一问题包括一个常数,单一的质量矩阵
。
晶体管放大器电路包含六个电阻,三个电容器,晶体管。
初始电压信号 。
操作电压 。
的节点的电压 。
电阻的值 是常数,每个电阻电流满足吗 。
电容的值 是常数,当前通过每个电容器满足 。
我们的目标是通过节点5,解决输出电压的 。
在MATLAB®解这个方程,方程需要代码,代码质量矩阵,设置初始条件和时间间隔的集成在调用解算器之前ode23t
。你可以包括所需的函数作为本地功能的文件(如在这里完成),或者拯救他们作为独立,在MATLAB上的一个目录路径命名文件。
代码质量矩阵
利用基尔霍夫定律来平衡目前通过每个节点(1至5),你可以获得一个五方程组描述电路:
该系统的质量矩阵,发现通过收集导数项左边的方程,形式
在哪里 为 。
创建一个质量矩阵与适当的常数
,然后使用odeset
函数来指定质量矩阵。尽管很明显,质量矩阵是奇异的,离开“MassSingular”
选项的默认值“也许”
测试DAE的自动检测问题的解决者。
c = 1 e-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)%定义电压和参数问题= @ (t) 0.4 * sin(200 *π* 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.05 [0];[t u] = ode23t (@transampdae, tspan情况,选择);
阴谋的结果
情节的初始电压 和输出电压 。
问题= @ (t) 0.4 * sin(200 *π* t);情节(t)问题(t)“o”t u (:, 5),“。”轴([0 0.05 3 2]);传奇(的输入电压U_e (t)”,的输出电压U_5 (t)”,“位置”,“西北”);标题(“一个晶体管放大器DAE ODE23T问题解决”);包含(“t”);
引用
[1]头发,E。,and Gerhard Wanner.解常微分方程2:僵硬和微分代数问题。激飞柏林海德堡,1991,第377页。
本地函数
这里列出的是当地的辅助函数,ODE求解器进行求解ode23t
调用计算解决方案。或者,您可以保存这个函数作为其自己的文件在MATLAB上的一个目录路径。
函数dudt = transampdae (t, u)%定义电压和参数问题= @ (t) 0.4 * sin(200 *π* 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)];结束