Matlab - не удалось извлечь дифференциальные переменные для решения в dsolve

Я пытаюсь решить схему RLC как символьное дифференциальное уравнение в MATLAB, используя dsolve, уравнение

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

Матлаб выдает ошибку

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.

Это почему?


person sunside    schedule 11.02.2014    source источник


Ответы (1)


Похоже, вы используете sym/diff и symfun неправильно. Q(t) — это то, что называется произвольной (вместо этого help sym/diff используется термин «абстрактная») символическая функция, т. е. функция без определения. Имя вашей функции Q (думайте об этом как описатель функции) и оно представлено абстрактной формулой Q(t), что просто означает, что это функция t. Если вы хотите получить производную от абстрактной функции, передайте имя функции — в вашем случае Q (онлайн-документация делает это немного яснее, но не совсем). Если вы хотите оценить функцию, используйте формулу, например, 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 вы должны использовать чистую символьную форму для символьной математики (в отличие от строк).

person horchler    schedule 11.02.2014