Wolfram mathematica Mathematica:重新定义乘法,使0*(-Inf)=0

Wolfram mathematica Mathematica:重新定义乘法,使0*(-Inf)=0,wolfram-mathematica,undefined,logarithm,infinity,entropy,Wolfram Mathematica,Undefined,Logarithm,Infinity,Entropy,在我的Mathematica程序中,我做了一些熵计算,我想使用这个约定:Log[0]*0=0。有没有一个干净的方法来做它,或者我必须编写自己的函数 受此启发,我尝试了以下方法: Unprotect[Times]; Times[0, -Infinity] := 0; Protect[Times]; 但对我来说似乎不起作用。有没有一种优雅的方法可以做到这一点?我支持高性能马克的上述说法。然而,这是一个有趣的问题,因为答案并不重要 您需要: Unprotect[DirectedInfinity];

在我的Mathematica程序中,我做了一些熵计算,我想使用这个约定:
Log[0]*0=0。
有没有一个干净的方法来做它,或者我必须编写自己的函数

受此启发,我尝试了以下方法:

Unprotect[Times];
Times[0,  -Infinity] := 0;
Protect[Times];

但对我来说似乎不起作用。有没有一种优雅的方法可以做到这一点?

我支持高性能马克的上述说法。然而,这是一个有趣的问题,因为答案并不重要

您需要:

Unprotect[DirectedInfinity];

DirectedInfinity /: Log[0] 0 := 0
您需要
directedfinity
,因为:

Log[0] // FullForm

您需要使用
TagSet
生成一个UpValue,以覆盖对
-∞ * 0,因为UpValues是在其他定义之前尝试的。

我支持High Performance Mark的上述声明。然而,这是一个有趣的问题,因为答案并不重要

您需要:

Unprotect[DirectedInfinity];

DirectedInfinity /: Log[0] 0 := 0
您需要
directedfinity
,因为:

Log[0] // FullForm

您需要使用
TagSet
生成一个UpValue,以覆盖对
-∞ * 0
,因为UpValues是在其他定义之前尝试的。

我认为,如果你不知道如何颠覆Mathematica的评估过程,那么你几乎肯定不应该这样做,这对你没有帮助。例如,如果您(部分)重新定义乘法或
Log[]
,或为
0
提供
Up/Down/Own
值,则您需要非常确定在Mathematica处于不干净状态时使用Mathematica对其他所有操作的影响。为熵计算定义自己的函数,并在其范围内实现所需的简化,更安全、更直接。我认为,如果你不理解如何颠覆Mathematica的评估过程,那么你几乎肯定不应该这样做,这对你现在毫无帮助。例如,如果您(部分)重新定义乘法或
Log[]
,或为
0
提供
Up/Down/Own
值,则您需要非常确定在Mathematica处于不干净状态时使用Mathematica对其他所有操作的影响。为熵计算定义自己的函数,并在其范围内实现所需的简化,更安全、更直接。