2011-12-02 11 views
9

一般來說,數學總是採用最一般的情況下,也就是,如果我設置的功能與真正的功能在數學工作

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

我選擇的答案是不是最一般的,但首先它解決了我的問題。其次,它教會了我的道德「你應該照顧你的代碼」。感謝所有其他好的和有益的答案! – Dror

回答

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] 
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一樣,此功能只適用於SimplifyIntegrate這些有Assumtpions選項的功能。 D不是這樣的功能。


ReduceFindInstance等一些功能有一個選項,只對實數,整數等領域,它假設他們一起工作的所有表達式和子表達式是真正的工作。


ComplexExpand[]有時FunctionExpand[]也可能是類似的情況(但不是真的在這裏)是有用的。示例:ComplexExpand[Abs[z]^2, TargetFunctions -> {Sign}]FunctionExpand[Abs'[x], Assumptions -> {x \[Element] Reals}]


一般,據我所知,還有就是告訴Mathematica的一個變量是真正的無數學方式。只能使用模式以正式方式進行此操作,並且只能用於具有Assumptions選項的某些功能。 「正式」我的意思是,如果你告訴它a[x]是真實的,它不會自動知道a'[x]也是真實的。

+1

「......沒有什麼數學方法可以告訴Mathematica變量是真實的......」IMO已經(並且將繼續)爲我提供一個挫折/困惑的主要觀點。例如,可以將屬性「常量」分配給符號和Dt信息,看起來像設置這樣一個屬性是向Mathematica通知數學意圖的好方法。我真的希望有些屬性允許您在需要時指定Real,PositiveReal,NonNegativeReal,NegativeReal等;也許甚至是NonConstant(思考模型構建)。假設/簡化可能很笨重。 – telefunkenvf14

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

這很奇怪。你也可以使用'TargetFunctions - > {Sign}',我的意思是「不要使用'Abs'」而不是「使用'Sign'」。那麼不需要'Norm [...,2]'。 – Szabolcs

2

對於舊版本的數學那裏曾經是一個附加軟件包RealOnly是把數學中僅雷亞爾模式。在較新版本中有一個版本,並且具有最小的兼容性升級。它減少了許多情況下,以一個真實的唯一的解決辦法,但對你的Norm情況下不工作:

enter image description here