用 Maxima 象征性地解决物理问题
Solving physics problems symbolically with Maxima
我正在尝试使用 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
。)
有几种不同的方法可以解决这个问题。让我们开始:
(%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
解方程。
添加到 Robert Dodier 的答案中,尽管它很丑陋,但在 solve() 中包含足够的 "dummy" 变量也有效:
(%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
当然 Robert Dodier 的更好,我不确定这是否有任何缺点。
我正在尝试使用 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
。)
有几种不同的方法可以解决这个问题。让我们开始:
(%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
解方程。
添加到 Robert Dodier 的答案中,尽管它很丑陋,但在 solve() 中包含足够的 "dummy" 变量也有效:
(%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
当然 Robert Dodier 的更好,我不确定这是否有任何缺点。