使用mathematica中的实际函数

Dro*_*ror 10 wolfram-mathematica

通常,mathematica总是假定最常见的情况,即,如果我设置了一个函数

a[s_]:={a1[s],a2[s],a3[s]}
Run Code Online (Sandbox Code Playgroud)

并且想要计算它的标准Norm[a[s]],例如,它将返回:

Sqrt[Abs[a1[s]]^2 + Abs[a2[s]]^2 + Abs[a3[s]]^2]
Run Code Online (Sandbox Code Playgroud)

但是,如果我知道一切ai[s]都是真的,我可以调用:

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[a[s]]]]
Run Code Online (Sandbox Code Playgroud)

将返回:

Sqrt[a1[s]^2 + a2[s]^2 + a3[s]^2]
Run Code Online (Sandbox Code Playgroud)

这是我的期望.

例如,尝试派生a[s]然后(注意D)时会出现问题:

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[D[a[s],s]]]]
Run Code Online (Sandbox Code Playgroud)

再次返回一个涉及绝对值的结果 - 来自假设数字可能是虚数.

克服这个问题的方法是什么?我想定义一个实值函数,并使用它.也就是说,例如,我希望它的衍生物是真实的.

Sas*_*sha 7

我会改用自定义函数,例如

vecNorm[vec_?VectorQ] := Sqrt[ vec.vec ]
Run Code Online (Sandbox Code Playgroud)

然后

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]
Run Code Online (Sandbox Code Playgroud)


Sza*_*lcs 6

警告:我没有太多的实际经验,所以下面的例子没有经过彻底的测试(即我不知道过于笼统的假设是否可以打破我没想过的任何事情).


您可以使用它$Assumptions来定义永久假设:

我们可以说所有a1[s], a2[s], a3[s]都是实物:

$Assumptions = {(a1[s] | a2[s] | a3[s]) \[Element] Reals}
Run Code Online (Sandbox Code Playgroud)

但如果你有例如a1[x](不a1[s]),那么它将无法工作.所以我们可以使用模式来改进它:

$Assumptions = {(a1[_] | a2[_] | a3[_]) \[Element] Reals}
Run Code Online (Sandbox Code Playgroud)

或者只是说所有的值a[_]都是真实的:

$Assumptions = {a[_] \[Element] Reals}
Run Code Online (Sandbox Code Playgroud)

甚至大胆地说一切都是真实的:

$Assumptions = {_ \[Element] Reals}
Run Code Online (Sandbox Code Playgroud)

(我想知道这会打破什么)

AppendTo对于添加$Assumptions和保留先前的假设很有用.

就像Assuming,这只适用于类似SimplifyIntegrateAssumtpions选项的功能. 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]也是真实的.