我正在尝试使用dsolve
在MATLAB中将RLC电路解决为符号微分方程,方程为
U(t) = L*Q''(t) + R*Q'(t) + (1/C)*Q(t)
初始条件
Q(0) = 0
Q'(0) = 0
和
U(t) = 10*sin(2*t)
L = 1
R = 0
C = 1/4
当我明确地(并使用字符串)实现它时
Q = dsolve('D2Q(t) + 4*Q(t) = 10*sin(2*t)', 'DQ(0)=0, Q(0)=0');
Q = simplify(Q);
我会
Q =
5 sin(2 t) 5 t cos(2 t)
---------- - ------------
4 2
这是正确的。
出于纯粹深奥的原因,我尝试使用符号方程直接计算它,因为dsolve
上的文档声明可以这样做。
首先从
开始syms L R C t Q(t)
U = sym('10')*sin(sym('2')*t)
DEQ = L*diff(Q(t),t,2) + R*diff(Q(t),t) + (1/C)*Q(t)
DEQ = subs(DEQ, [L R C], [sym('1'), sym('0'), sym('1/4')])
eqn = (U == DEQ)
我收到了
eqn =
10*sin(2*t) == 4*Q(t) + diff(Q(t), t, t)
哪个是对的。如果我现在使用
将其输入dsolve
Q = dsolve(eqn, ...
Q(t) == 0, ...
diff(Q(t),t) == 0);
Matlab抛出错误
Error using symengine (line 58)
Could not extract differential variables to solve for. Use 'solve' or 'vpasolve'
to compute the solutions of non-differential equations.
为什么?
答案 0 :(得分:1)
您似乎错误地使用了sym/diff
和symfun
。 Q(t)
被称为任意(help sym/diff
使用术语“抽象”代替)符号函数,即没有定义的函数。您的函数名称为Q
(将其视为函数句柄),它由抽象公式Q(t)
表示,这意味着它是t
的函数。当你想要抽象函数的衍生物时,传入函数的名称 - 在你的情况下,Q
(online documentation使这个更清晰,但不是真的)。如果要评估函数,请使用公式,例如Q(0)
,其输出为sym
而不是symfun
。
以下是我为第二种情况编写代码的方法:
syms L R C t Q(t)
U = 10*sin(2*t); % No need to wrap integer or exactly-represenable values in sym
dQ = diff(Q,t);
d2Q = diff(dQ,t);
DEQ = L*d2Q + R*dQ + Q/C;
DEQ = subs(DEQ, {L, R, C}, {1, 0, 1/4});
eqn = (U == DEQ);
Q = dsolve(eqn, Q(0) == 0, dQ(0) == 0);
Q = simplify(Q)
返回
Q =
(5*sin(2*t))/4 - (5*t*cos(2*t))/2
你也忘了在第二种情况下将你的初始条件评估为零,所以我也解决了这个问题。顺便说一句,在Matlab的当前版本中,您应该使用纯符号形式进行符号数学(而不是字符串)。