2011-12-02 14 views
9

は、Mathematicaは常に最も一般的なケースを想定しているMathematicaで実関数での作業、例えば、それが返されます:私はすべてのai[s]が本物であることを知っていれば、つまり、一般的に

Sqrt[Abs[a1[s]]^2 + Abs[a2[s]]^2 + Abs[a3[s]]^2] 

しかし、私が呼び出すことができます。

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[a[s]]]] 
戻ります

私が期待するものである
Sqrt[a1[s]^2 + a2[s]^2 + a3[s]^2] 

。しようとしたとき

問題が発生し、例えば、(Dに注意)、その後a[s]を導出して:再び

Assuming[{a1[s], a2[s], a3[s]} \[Element] Reals, Simplify[Norm[D[a[s],s]]]] 

戻り値絶対値を含む結果 - 数字は架空であり得ることを仮定から来るの。

この問題を解決する方法は何ですか。私は実数値関数を定義し、そのような関数を使って作業したいと思います。つまり、例えば、私はその派生物を真実にしたい。

+0

私が選んだ答えは最も一般的なものではありませんが、最初のそれは私の問題を解決しました。第二に、それは私に道徳的な "あなたのコードの世話をするべき"と教えてくれました。他のすてきで有益な答えをありがとう! – Dror

答えて

7

代わりにカスタム関数を使用します。実数のみのモードでMathematicaを入れアドオンパッケージRealOnlyにするために使用が古いMathematicaのバージョンの

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は役に立ちますに追加し、以前の前提を維持してください。

だけAssumingのように、これが唯一のAssumtpionsオプションを持ってSimplifyIntegrateのような機能のために動作します。 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にinfoを指定すると、そのような属性を設定するように見えるようになるので、Mathematicaに数学的な意図を知らせることができます。私は実際に、Real、PositiveReal、NonNegativeReal、NegativeRealなどを指定できるようにするための属性があれば幸いです。おそらくNonConstant(モデル構築の考え方)でも。前提/簡素化はぎこちないことがあります。 – telefunkenvf14

2

この場合、回避策を使用してComplexExpandを使用できます。例えば

ComplexExpand[Norm[a'[s], t]] /. t -> 2 

戻りComplexExpand[Norm[a'[s], 2]](または実際にpが有理数であるComplexExpand[Norm[a'[s], p]])のようなものをやってすることは、何らかの理由で動作しないこと

Sqrt[Derivative[1][a1][s]^2 + Derivative[1][a2][s]^2 + Derivative[1][a3][s]^2] 

は注意してください。

+1

それは変です。 'TargetFunctions - > {Sign}'を使うこともできます。これは "Abs'を使わず、" Sign'を使わない "という意味です。次に、Norm [...、2]の必要はありません。 – Szabolcs

2

。それ以降のバージョンで利用できるバージョンがあり、互換性のアップグレードは最小限に抑えてonlineです。それは本当のみのソリューションに多くの状況は減少しますが、あなたのNorm場合には機能しません:

enter image description here

関連する問題