通常,mathematica总是假设最常见的情况,即,如果我设置了一个函数
a[s_]:={a1[s],a2[s],a3[s]}
并且想要计算其范数Norm[a[s]]
,例如,它将返回:
Sqrt[Abs[a1[s]]^2 + Abs[a2[s]]^2 + Abs[a3[s]]^2]
但是,如果我知道所有ai[s]
都是真的,我可以调用:
Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[a[s]]]]
将返回:
Sqrt[a1[s]^2 + a2[s]^2 + a3[s]^2]
这是我的期望。
例如,尝试导出a[s]
然后(注意D
)时出现问题:
Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[D[a[s],s]]]]
再次返回涉及绝对值的结果 - 来自假设数字可能是虚数。
克服这个问题的方法是什么?我想定义一个实值函数,并使用它。也就是说,例如,我希望它的衍生物是真实的。
答案 0 :(得分:7)
我会改用自定义函数,例如
vecNorm[vec_?VectorQ] := Sqrt[ vec.vec ]
然后
In[20]:= vecNorm[D[{a1[s], a2[s], a3[s]}, s]]
Out[20]= Sqrt[
Derivative[1][a1][s]^2 + Derivative[1][a2][s]^2 +
Derivative[1][a3][s]^2]
答案 1 :(得分:6)
警告:我对此没有多少实际经验,所以下面的例子没有经过全面测试(即我不知道是否有太多一般的假设可以打破我没想过的任何事情的)。
您可以使用$Assumptions
来定义永久性假设:
我们可以说所有a1[s], a2[s], a3[s]
都是实物:
$Assumptions = {(a1[s] | a2[s] | a3[s]) \[Element] Reals}
但如果你有例如a1[x]
(不是a1[s]
),那么它将无效。所以我们可以使用模式对其进行一些改进:
$Assumptions = {(a1[_] | a2[_] | a3[_]) \[Element] Reals}
或者只是说a[_]
的所有值都是真实的:
$Assumptions = {a[_] \[Element] Reals}
甚至大胆地说一切都是真实的:
$Assumptions = {_ \[Element] Reals}
(我不知道这会破坏什么)
AppendTo
对于添加$Assumptions
并保留以前的假设非常有用。
与Assuming
一样,此功能仅适用于Simplify
或Integrate
等具有Assumtpions
选项的功能。 D
不是这样的功能。
Reduce
,FindInstance
等某些函数可以选择仅在Reals,Integers等域上工作,这些函数假定它们使用的所有表达式和子表达式都是真实的。
ComplexExpand[]
,有时FunctionExpand[]
在类似情况下也可能有用(但不是真的在这里)。示例:ComplexExpand[Abs[z]^2, TargetFunctions -> {Sign}]
和FunctionExpand[Abs'[x], Assumptions -> {x \[Element] Reals}]
。
一般,据我所知,没有数学方式告诉Mathematica变量是真的。只能使用模式以正式方式执行此操作,并且仅对具有Assumptions
选项的某些函数执行此操作。 “正式”是指如果你告诉它a[x]
是真实的,它将不会自动知道a'[x]
也是真实的。
答案 2 :(得分:2)
在这种情况下,您可以使用ComplexExpand
,但需要解决方法。例如
ComplexExpand[Norm[a'[s], t]] /. t -> 2
返回
Sqrt[Derivative[1][a1][s]^2 + Derivative[1][a2][s]^2 + Derivative[1][a3][s]^2]
请注意,执行类似ComplexExpand[Norm[a'[s], 2]]
(或ComplexExpand[Norm[a'[s], p]]
p
其中{{1}}为理性数字)的内容由于某种原因无效。
答案 3 :(得分:2)
对于较旧的Mathematica版本,曾经有一个附加软件包RealOnly
,它将Mathematica置于仅实数模式。在更高版本和online中提供了一个版本,其兼容性升级最少。它将许多情况简化为纯粹的解决方案,但不适用于Norm
案例: