Wolfram mathematica 在mathematica中使用实函数

Wolfram mathematica 在mathematica中使用实函数,wolfram-mathematica,Wolfram Mathematica,一般来说,mathematica总是假设最一般的情况,也就是说,如果我设置一个函数 a[s_]:={a1[s],a2[s],a3[s]} 并且要计算其normnorm[a[s],例如,它将返回: Sqrt[Abs[a1[s]]^2 + Abs[a2[s]]^2 + Abs[a3[s]]^2] Sqrt[a1[s]^2 + a2[s]^2 + a3[s]^2] 但是,如果我知道所有的ai[s]都是真实的,我可以调用: Assuming[{a1[s], a2[s], a3[s]} \[Elem

一般来说,mathematica总是假设最一般的情况,也就是说,如果我设置一个函数

a[s_]:={a1[s],a2[s],a3[s]}
并且要计算其norm
norm[a[s]
,例如,它将返回:

Sqrt[Abs[a1[s]]^2 + Abs[a2[s]]^2 + Abs[a3[s]]^2]
Sqrt[a1[s]^2 + a2[s]^2 + a3[s]^2]
但是,如果我知道所有的
ai[s]
都是真实的,我可以调用:

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[a[s]]]]
将返回:

Sqrt[Abs[a1[s]]^2 + Abs[a2[s]]^2 + Abs[a3[s]]^2]
Sqrt[a1[s]^2 + a2[s]^2 + a3[s]^2]
这正是我所期望的

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

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


克服这个问题的方法是什么?我想定义一个实值函数,并以此来处理它。也就是说,例如,我希望它的衍生品是真实的。

警告:我在这方面没有太多实际经验,因此下面的例子没有经过彻底的测试(即,我不知道过于笼统的假设是否会打破我没有想到的任何东西)


您可以使用
$assemptions
定义永久性假设:

我们可以说所有的
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[\u]
的所有值都是实的:

$Assumptions = {a[_] \[Element] Reals}
甚至大胆地说一切都是真实的:

$Assumptions = {_ \[Element] Reals}
(我不知道这会打破什么)

AppendTo
用于添加到
$assessments
并保留以前的假设

就像
假设
,这只适用于具有
假设
选项的
简化
集成
等函数<代码>D不是这样的功能


一些函数,如
Reduce
FindInstance
等,可以选择仅在实数、整数等域上工作,这类函数假定它们使用的所有表达式和子表达式都是实数


ComplexExpand[]
和有时候
FunctionExpand[]
在类似的情况下也可能有用(但在这里不是很有用)。示例:
ComplexExpand[Abs[z]^2,TargetFunctions->{Sign}]
FunctionExpand[Abs'[x],假设->{x\[Element]Reals}]



一般来说,据我所知,没有数学方法告诉Mathematica变量是实的。只有使用模式,并且仅针对具有
假设
选项的特定函数,才能以正式的方式执行此操作。所谓“正式”,我的意思是,如果你告诉它
a[x]
是真实的,它不会自动知道
a'[x]
也是真实的。

在这种情况下,你可以使用
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
是一个有理数)的操作出于某些原因不起作用

vecNorm[vec_?VectorQ] := Sqrt[ vec.vec ]
然后


对于较早的Mathematica版本,曾经有一个附加包
reallonly
,将Mathematica置于reals only模式。有一个版本在更高版本中可用,并且具有最低限度的兼容性升级。它将许多情况简化为真正的唯一解决方案,但不适用于您的
Norm
情况:


真奇怪。您还可以使用
TargetFunctions->{Sign}
,我的意思是“不要使用
Abs
”而不是“使用
Sign
”。那么就不需要
Norm[…,2]
“…没有数学方法告诉Mathematica变量是真实的…”在我看来,这一直(并将继续)是我感到沮丧/困惑的一个主要问题。例如,可以将属性“常量”指定给符号和Dt上的信息,使设置这样一个属性似乎是通知Mathematica您的数学意图的好方法。我真的希望有一些属性可以让你在需要的时候指定真实的、积极的、非消极的、消极的等等;甚至可能是非恒定的(考虑模型构建)。假设/简化可能很笨拙。我选择的答案不是最一般的,但首先它解决了我的问题。第二,它教会了我道德“你应该注意你的代码”。谢谢所有其他的好的和有用的答案!