2011-12-02 1 views
9

En général, Mathematica suppose toujours le cas le plus général, qui est, si je mets une fonctionTravailler avec de vraies fonctions Mathematica

a[s_]:={a1[s],a2[s],a3[s]} 

et que vous voulez calculer la norme Norm[a[s]], par exemple, il sera de retour:

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

Cependant, si je sais que tous les ai[s] sont réels, je peux invoquer:

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

qui reviendra:

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

Ce qui est ce que j'attends.

problème se produit lorsque vous essayez, par exemple, dérivez a[s] puis (notez le D):

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

retour à nouveau un résultat impliquant des valeurs absolues - viennent de l'hypothèse que les chiffres peuvent être imaginaires.

Quelle est la manière de surmonter ce problème? Je veux définir une fonction à valeur réelle et travailler avec elle en tant que telle. C'est, par exemple, je veux que ses dérivés soient réels.

+0

La réponse que j'ai choisi est pas le plus général, mais d'abord il a résolu mon problème. Deuxièmement, il m'a appris la morale "vous devriez prendre soin de votre code". Merci pour toutes les autres réponses agréables et utiles! – Dror

Répondre

7

J'utiliserais plutôt une fonction personnalisée, par ex.

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

Puis

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

Attention: Je n'ai pas beaucoup d'expérience pratique avec cela, de sorte que les exemples ci-dessous ne sont pas testés à fond (à savoir que je ne sais pas si des hypothèses trop générales peuvent briser tout ce que je ne l'ai pas pensé).


Vous pouvez utiliser $Assumptions pour définir des hypothèses permanentes:

On pourrait dire que tous a1[s], a2[s], a3[s] sont: reals

$Assumptions = {(a1[s] | a2[s] | a3[s]) \[Element] Reals} 

Mais si vous avez par exemple a1[x] (pas a1[s]), alors cela ne fonctionnera pas. Ainsi, nous pouvons l'améliorer un peu en utilisant les modèles:

$Assumptions = {(a1[_] | a2[_] | a3[_]) \[Element] Reals} 

Ou tout simplement dire que toutes les valeurs de a[_] sont réelles:

$Assumptions = {a[_] \[Element] Reals} 

Ou même faire preuve d'audace et dire que tout est réel:

$Assumptions = {_ \[Element] Reals} 

(Je me demande ce que cela casse)

AppendTo est utile pour en ajoutant $Assumptions et en gardant les hypothèses précédentes.

Tout comme Assuming, cela ne fonctionnera que pour des fonctions comme Simplify ou Integrate qui ont une option Assumtpions. D n'est pas une telle fonction.


Certaines fonctions comme Reduce, FindInstance, etc. ont une option pour travailler uniquement sur le domaine de Reals, Entiers, etc., ce qui suppose que toutes les expressions et les sous-expressions avec lesquelles ils travaillent sont réels.


ComplexExpand[] et parfois FunctionExpand[] peuvent également être utiles dans des situations similaires (mais pas vraiment ici). Exemples: ComplexExpand[Abs[z]^2, TargetFunctions -> {Sign}] et FunctionExpand[Abs'[x], Assumptions -> {x \[Element] Reals}].


En général, pour autant que je sache, il n'y a pas mathématique façon de dire Mathematica qu'une variable est réelle. Il est seulement possible de le faire d'une manière formelle, en utilisant des modèles, et seulement pour certaines fonctions qui ont l'option Assumptions. Par "formel" je veux dire que si vous lui dites que a[x] est réel, il ne saura pas automatiquement que a'[x] est également réel.

+1

"... il n'y a pas de façon mathématique de dire à Mathematica qu'une variable est réelle ..." OMI, cela a été (et continue d'être) un point majeur de frustration/confusion pour moi. On peut assigner l'attribut 'Constante' à un symbole et l'information sur Dt, par exemple, donne l'impression que la définition d'un tel attribut est une excellente façon d'informer Mathematica de votre intention mathématique. J'aurais vraiment aimé qu'il y ait des attributs qui vous permettent, lorsque cela est souhaitable, de spécifier Real, PositiveReal, NonNegativeReal, NegativeReal, etc; peut-être même NonConstant (penser à construire un modèle). Les hypothèses/simplifications peuvent être maladroites. – telefunkenvf14

2

Dans ce cas, vous pouvez utiliser ComplexExpand avec une solution de contournement. Par exemple

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

retours

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

Notez que faire quelque chose comme ComplexExpand[Norm[a'[s], 2]] (ou bien ComplexExpand[Norm[a'[s], p]]p est un nombre rationnel) ne fonctionne pas pour une raison quelconque.

+1

C'est bizarre. Vous pouvez également utiliser 'TargetFunctions -> {Sign}' par lequel je veux dire "n'utilisez pas' Abs' "et non" use 'Sign'". Alors pas besoin de 'Norm [..., 2]'. – Szabolcs

2

Pour les versions plus anciennes Mathematica Il y avait un paquet d'add-on qui a mis RealOnly Mathematica en mode reals uniquement. Il existe une version disponible dans les versions ultérieures et online avec des mises à niveau de compatibilité minimales. Il réduit de nombreuses situations à une solution réelle seule, mais ne fonctionne pas pour votre Norm cas:

enter image description here

Questions connexes