Wolfram mathematica 尝试用Mathematica解方程组

Wolfram mathematica 尝试用Mathematica解方程组,wolfram-mathematica,Wolfram Mathematica,我试图用mathematica解一个方程组。这是我的密码 f1[TA_, TB_] := TA - TB + C f2[TA_, TB_] := TA*(TB - TA) + TA*TB + 0.5*TA^2 + TB*(TB - TA) + 0.5*TB^2 Solve[{f1[TA, TB] == 0, f2[TA, TB] == 0}, {TA, TB}] Mathematica给我的输出很奇怪,我认为这是错误的(T变量代表时间,所以它们不能是负数) 0-1.5C是什么意思?这是否意味

我试图用mathematica解一个方程组。这是我的密码

f1[TA_, TB_] := TA - TB + C
f2[TA_, TB_] := 
TA*(TB - TA) + TA*TB + 0.5*TA^2 + TB*(TB - TA) + 0.5*TB^2
Solve[{f1[TA, TB] == 0, f2[TA, TB] == 0}, {TA, TB}]
Mathematica给我的输出很奇怪,我认为这是错误的(T变量代表时间,所以它们不能是负数)

0-1.5C是什么意思?这是否意味着-1.5摄氏度


谢谢您的帮助。

是的,0。-1.5C表示-3C/2,但用“实”而不是“有理”的语言编写。您的输入使用小数,Mathematica将其解释为近似/数字数据,而不是精确的有理数。“0.”表示浮点实数,它与Mathematica所能计算的接近于零。但您可以检查:

Head[0.]
Head[0]
。。你会发现0。是实数,但0是整数。0.5和1/2之间有类似的区别

我相信有几种方法可以改善这一点,其中至少有一种已经提到

首先,大写字母C是一个内置符号。一般来说,最好使用小写字母表示n、c、d等

其次,这些函数不需要延迟求值,因此:=是多余的

然而,这并不是问题的一部分。即使纠正这些小问题:

f1[ta_, tb_] = ta - tb + c;
f2[ta_, tb_] = ta*tc + ta*tb + 0.5*ta^2 + tb*tc + 0.5*tb^2;
Solve[{f1[ta, tb] == 0, f2[ta, tb] == 0}, {ta, tb}]
…仍将导致相同的错误。为什么?好吧,Mathematica以一种特殊的方式解决非线性方程组(当呈现“数值”数据时,即方程组中的0.5而不是1/2),它尝试以数值方式解决它们(与NSolve相同)

然而,数值求解方程不同于象征性地求解方程。正如我们在这里看到的那样,数值算法可能会对系统产生问题,这些问题可以用符号来解决。我对NSolve的了解还不够,不知道为什么会产生这个错误,这取决于NSolve使用的算法,但这可能与这个系统在解附近的雅可比矩阵可能为零(取决于tc)有关

当一个数值算法行为笨拙时,这可能表明将系统转换为一个精确的系统(它就是这样做的)将有所帮助。(事实上,将所有0.5替换为1/2将消除错误。)

另一种选择是使用FindRoot,但只有在这里没有像tc或c这样的其他符号的情况下。(如果修复了c=1和tc=2或任何其他值,FindRoot将毫无错误地运行,而Solve或Solve仍将使用仍然有效的解决方案产生相同的错误。)

一件对您有意义/有用的事情是:

f1[ta_, tb_] = ta - tb + c;
f2[ta_, tb_] = ta*tc + ta*tb + 0.5*ta^2 + tb*tc + 0.5*tb^2;
SOL = Solve[{f1[ta, tb] == 0, f2[ta, tb] == 0}, {ta, tb}]
Reduce[ReplaceAll[{ta >= 0, tb >= 0}, SOL[[1]]], {ta, tb}]
Reduce[ReplaceAll[{ta >= 0, tb >= 0}, SOL[[2]]], {ta, tb}]
另外两行取方程的两个解,检查ta和tb是否为非负,因为这是您感兴趣的。为此,输出为:

{{ta -> 0. - 0.5 c, tb -> 0. + 0.5 c}, {ta -> -0.5 c - 1. tc, tb -> 0.5 c - 1. tc}}
c == 0
(tc < 0 && 2. tc <= c <= -2. tc) || (tc == 0 && c == 0)

假设你对Mathematica有时会采取这种策略来解决输入的方程,就像它们是数值的一样,但最好是用符号来解决的,那么这应该可以抑制错误。

我想这将取决于
C
的值。如果
C<0
,则您的解决方案将是积极的。感谢您的帮助。可以肯定的是,0-1.5C意味着-1.5*C?而且,据我所知,我正确地使用了Solve?是的。我建议对变量使用小写,以避免与内置符号冲突。0.5被视为不精确的实值。使用1/2和讨厌的0。我会走的。谢谢大家的帮助。
Off["ratnz"];