简化Mathematica中的绝对值

时间:2011-12-08 18:40:34

标签: wolfram-mathematica

我目前有一个包含许多形式

的大表达式
Abs[-2 b + 2 d1 m + l Tan[\[Theta]]]

我知道,从问题的几何学来看,

-2 b + 2 d1 m + l Tan[\[Theta]] > 0

但是,当我尝试简化表达时,

Simplify[Abs[-2 b + 2 d1 m + l Tan[\[Theta]]], -2 b + 2 d1 m + l Tan[\[Theta]] > 0]

我回来了

Abs[-2 b + 2 d1 m + l Tan[\[Theta]]]

如何让Mathematica简化不必要的绝对值?

编辑1

我想要简化的完整表达是

-(1/(2 (m - Tan[\[Theta]])))
 Sqrt[1 + m^2] (B2 Sqrt[(-2 b + 2 d1 m + l Tan[\[Theta]])^2] + 
    B4 Sqrt[(-2 b + 2 d2 m + l Tan[\[Theta]])^2] + 
    B5 Sqrt[(2 b + 2 d3 m + l Tan[\[Theta]])^2] + 
    B7 Sqrt[(2 b + 2 d4 m + l Tan[\[Theta]])^2] + 
    B1 Sqrt[(2 b - 2 (d1 + l) m + l Tan[\[Theta]])^2] + 
    B3 Sqrt[(2 b - 2 (d2 + l) m + l Tan[\[Theta]])^2] + 
    B6 Sqrt[(-2 (b + (d3 + l) m) + l Tan[\[Theta]])^2] + 
    B8 Sqrt[(-2 (b + (d4 + l) m) + l Tan[\[Theta]])^2])

已知每个基数下的平方项是正实数。

4 个答案:

答案 0 :(得分:4)

以下是两个想法:

1)

Simplify[Abs[-2 b + 2 d1 m + l Tan[\[Theta]]], 
 0 < \[Theta] < \[Pi]/2 && l > 0 && 2 d1 m > 0 && -2 b > 0]

2)

f[e_] := 100 Count[e, _Abs, {0, Infinity}] + LeafCount[e]
Simplify[Abs[-2 b + 2 d1 m + l Tan[\[Theta]]], -2 b + 2 d1 m + 
   l Tan[\[Theta]] > 0, ComplexityFunction -> f]

复杂性函数f使得Abs比Times更昂贵。请参阅文档以简化。这有帮助吗?

答案 1 :(得分:4)

由于这些术语都是真实的和正面的,所以平方和取平方根只会给你相同的数字。因此,您可以执行类似

的操作
expr /. Sqrt[(x___)^2] :> x

其中expr是你上面的巨型表达。

答案 2 :(得分:1)

如果您只想删除绝对值的特定实例,您可以按照以下方式执行操作:

Clear[removeAbs]
removeAbs[expr_, r_] := expr /. {Sqrt[r^2] :> r, Abs[r] :> r}

这样它只会从你指定的任何表达式中删除绝对值:

In: removeAbs[Abs[x] + Abs[y], x]
Out: x + Abs[y]

我会看看我是否能找到比这更好看的解决方案。

答案 3 :(得分:1)

我经常被Abs[a]^2之类的东西所激励,而像Assuming使用a\[Element]Reals之类的东西却无济于事。

我在WolframMathWorld - Absolute SquareComplexExpand[Abs[a]^2, TargetFunctions -> {Conjugate}]找到了一些帮助,但有时它仍会返回Conjugate[Sqrt[a^2 + b^2]]之类的内容,而且我发现包裹了第二个ComplexExpand(没有参数)周围有帮助。