Символьно решать физические задачи

Я пытаюсь решить некоторые основные физические проблемы с помощью Maxima, но я сталкиваюсь с проблемами.

Я хочу, чтобы код ниже дал 600 (как решение T2), но это просто дает пустой список ([]).

solve([
    (P1*V1)/T1 = (P2*V2)/T2,
    V1 = V2,
    P1 = 100000,
    T1 = 300,
    P2 = 200000
    ], [T2]);

Что мне не хватает? (Я также попробовал много других проблем, подобных этой, и все они, кажется, терпят неудачу.)

Я знаю, что мог бы решить этот конкретный вопрос численно, но я хочу, чтобы ответы были точными, и я также хочу иметь возможность решать проблемы, подобные этой:

solve([
    (P1*V1)/T1 = (P2*V2)/T2,
    V1 = V2
    ], [T2]);

(Где должно быть решение (T1*P2)/P1.)

3 ответа

Решение

Есть несколько разных способов сделать это. Давайте начнем с:

(%i1) eqn : (P1*V1)/T1 = (P2*V2)/T2 $
(%i2) myvalues : [V1 = V2,P1 = 100000,T1 = 300,P2 = 200000] $

(1) Подставьте значения в уравнение и затем решите уравнение.

(%i3) subst (myvalues, eqn);
                              1000 V2   200000 V2
(%o3)                         ------- = ---------
                                 3         T2
(%i4) solve (%, T2);
(%o4)                             [T2 = 600]

(2) Решите уравнение в целом и затем подставьте значения в решение.

(%i5) solve (eqn, T2);
                                      P2 T1 V2
(%o5)                           [T2 = --------]
                                       P1 V1
(%i6) subst (myvalues, %);
(%o6)                             [T2 = 600]

(3) Решите уравнение со значениями, временно присвоенными переменным.

(%i7) ev (solve (eqn, T2), myvalues);
(%o7)                             [T2 = 600]

или, что то же самое (эта формулировка встречается довольно часто):

(%i8) solve (eqn, T2), V1 = V2,P1 = 100000,T1 = 300,P2 = 200000;
(%o8)                             [T2 = 600]

(2), пожалуй, самый общий способ сделать это. (1) и (3) более или менее эквивалентны в том смысле, что переменные уже имеют значения, назначенные ко времени solve видит уравнение. Это часто может сделать уравнение проще для solve решить это.

В дополнение к solve, Взгляни на to_poly_solve решать уравнения.

Добавление к ответу Роберта Додье, и как бы он ни был уродлив, в том числе достаточно "фиктивной" переменной в solve(), также работает:

(%i2) solve([(P1*V1)/T1 = (P2*V2)/T2, V1 = V2, P1 = 100000, T1 = 300, P2 = 200000], [T2, P1, T1, P2, V1]);
(%o2) [[T2 = 600, P1 = 100000, T1 = 300, P2 = 200000, V1 = V2]]

а также

(%i4) solve([(P1*V1)/T1 = (P2*V2)/T2, V1 = V2], [T2, V1]);
                                   P2 T1
(%o4)                       [[T2 = -----, V1 = V2]]
                                    P1

Конечно, у Роберта Додье лучше, я не уверен, что в этом есть недостаток.

Поиграл немного в одну строчку:

      subst ([V1 = V2,P1 = 100000`Pa,T1 = 300`K,P2 = 200000`Pa],solve ((P1*V1)/T1 = (P2*V2)/T2,T2));

или

      subst (
[
V1 = V2,
P1 = 100000`Pa,
T1 = 300`K,
P2 = 200000`Pa
],
solve (
(P1*V1)/T1 = (P2*V2)/T2
,
T2
));
Другие вопросы по тегам