Matlab - “无法在dsolve中提取要求的差分变量”

时间:2014-02-11 13:51:16

标签: matlab symbolic-math differential-equations

我正在尝试使用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.

为什么?

1 个答案:

答案 0 :(得分:1)

您似乎错误地使用了sym/diffsymfunQ(t)被称为任意(help sym/diff使用术语“抽象”代替)符号函数,即没有定义的函数。您的函数名称为Q(将其视为函数句柄),它由抽象公式Q(t)表示,这意味着它是t的函数。当你想要抽象函数的衍生物时,传入函数的名称 - 在你的情况下,Qonline 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的当前版本中,您应该使用纯符号形式进行符号数学(而不是字符串)。