Wolfram mathematica 在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
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]} \[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您的数学意图的好方法。我真的希望有一些属性可以让你在需要的时候指定真实的、积极的、非消极的、消极的等等;甚至可能是非恒定的(考虑模型构建)。假设/简化可能很笨拙。我选择的答案不是最一般的,但首先它解决了我的问题。第二,它教会了我道德“你应该注意你的代码”。谢谢所有其他的好的和有用的答案!