11
votes

Résoudre des équations vectorielles en mathématica

J'essaie de comprendre comment utiliser Mathematica pour résoudre des systèmes d'équations lorsque certaines variables et coefficients sont des vecteurs. Un exemple simple serait quelque chose comme

A + Vt = Pt p> où je sais un fort> strong> v strud> et la magnitude de p fort>, et je dois résoudre pour t em> et direction em> de P. (en fait, compte tenu de deux rayons A et B, où je connais tout sur A, mais seulement l'origine et l'ampleur de B, figure ce que la direction de B doit être telle qu'elle intersecte a.) p>

Maintenant, je sais comment résoudre ce genre de chose à la main, mais c'est lent et sujette à l'erreur, alors j'espérais pouvoir utiliser Mathematica pour accélérer les choses et les erreurs. . Cependant, je ne vois pas comment amener Mathematica à résoudre symboliquement des équations impliquant des vecteurs comme celui-ci. P>

J'ai regardé dans le forfait vectoranalyse, sans rien trouver là qui semble pertinent; Pendant ce temps, le paquet algébra linéaire semble avoir un solveur pour les systèmes linéaires (ce que ce n'est pas, car je ne sais pas t em> ou p fort>, juste | P | strong>). P>

J'ai essayé de faire la chose simplicité: élargir les vecteurs dans leurs composants (prétendre qu'ils sont 3D) et les résoudre comme si j'essayais d'assimiler deux fonctions paramétriques, P>

Solve[ 
      { Function[t, {Bx + Vx*t, By + Vy*t, Bz + Vz*t}][t] == 
          Function[t, {Px*t, Py*t, Pz*t}][t],
        Px^2 + Py^2 + Pz^2 == Q^2 } , 
      { t, Px, Py, Pz } 
     ]


3 commentaires

Cela vaut peut-être votre temps pour poser également la question aux personnes Mathematica. Ils connaissent probablement leur propre logiciel mieux que nous.


Je vais essayer de poster sur les forums Mathgroup ( forums.wolfram.com ). Cela ne semble pas que Simple Mailing Support@wolfram.com fournira des résultats utiles.


Il est surprenant, cependant, à quelle fréquence le rapport signal au bruit (et que tout le système en général) est meilleur ici que dans une liste de diffusion «à l'ancienne» / forum / groupe de discussion.


3 Réponses :


5
votes

Je n'ai pas une solution générale pour vous par tout moyen (MathForum peut être la meilleure façon d'aller), mais il y a quelques conseils que je peux vous offrir. La première consiste à faire l'expansion de vos vecteurs en composants d'une manière plus systématique. Par exemple, je résoudre l'équation que vous avez écrit comme suit.

  In[3] := t /. rawSol //. vectorRules // Simplify // InputForm
  Out[3] = {(A \[CenterDot] V - Sqrt[A^2*(P^2 - V^2) + 
                                   (A \[CenterDot] V)^2])/(P^2 - V^2), 
            (A \[CenterDot] V + Sqrt[A^2*(P^2 - V^2) + 
                                   (A \[CenterDot] V)^2])/(P^2 - V^2)}


1 commentaires

Les deux règles de point-produit peuvent être fusionnées en une seule en remplaçant le c _ dans la première règle avec c _. ou c: 1 , où le La période indique à Mathematica d'utiliser la valeur par défaut standard pour la multiplication.



8
votes


3 commentaires

Dans Résolvez [A + V T == P, P] Vous avez manqué le t multiplier p .


Vous tapez le produit croisé avec : ESC: Cross: ESC: .


@RCollyer Mon erreur devrait fonctionner avec l'addition. @Kennytm merci d'avoir souligné cela.



2
votes

J'ai pris une approche quelque peu différente de cette question. J'ai fabriqué des définitions qui renvoient cette sortie: EXEMPLES VEXPAND Les motifs connus pour être des quantités de vecteur peuvent être spécifiés à l'aide de Vec [_] code>, des motifs qui ont un survecteur [] code> ou Overhat [] code> wrapper (Les symboles avec un vecteur ou un chapeau sur eux) sont supposés être des vecteurs par défaut par défaut.

Les définitions sont expérimentales et devraient être traitées comme telles, mais elles semblent bien fonctionner. Je m'attends à ajouter à cela au fil du temps. P>

Voici les définitions. La nécessité d'être collé dans une cellule de portable Mathematica et converti en StandardForm pour les voir correctement. P>

Unprotect[vExpand,vExpand$,Cross,Plus,Times,CenterDot];

(* vec[pat] determines if pat is a vector quantity.
vec[pat] can be used to define patterns that should be treated as vectors.
Default: Patterns are assumed to be scalar unless otherwise defined *)
vec[_]:=False;

(* Symbols with a vector hat, or vector operations on vectors are assumed to be vectors *)
vec[OverVector[_]]:=True;
vec[OverHat[_]]:=True;

vec[u_?vec+v_?vec]:=True;
vec[u_?vec-v_?vec]:=True;
vec[u_?vec\[Cross]v_?vec]:=True;
vec[u_?VectorQ]:=True;

(* Placeholder for matrix types *)
mat[a_]:=False;

(* Anything not defined as a vector or matrix is a scalar *)
scal[x_]:=!(vec[x]\[Or]mat[x]);
scal[x_?scal+y_?scal]:=True;scal[x_?scal y_?scal]:=True;

(* Scalars times vectors are vectors *)
vec[a_?scal u_?vec]:=True;
mat[a_?scal m_?mat]:=True;

vExpand$[u_?vec\[Cross](v_?vec+w_?vec)]:=vExpand$[u\[Cross]v]+vExpand$[u\[Cross]w];
vExpand$[(u_?vec+v_?vec)\[Cross]w_?vec]:=vExpand$[u\[Cross]w]+vExpand$[v\[Cross]w];
vExpand$[u_?vec\[CenterDot](v_?vec+w_?vec)]:=vExpand$[u\[CenterDot]v]+vExpand$[u\[CenterDot]w];
vExpand$[(u_?vec+v_?vec)\[CenterDot]w_?vec]:=vExpand$[u\[CenterDot]w]+vExpand$[v\[CenterDot]w];

vExpand$[s_?scal (u_?vec\[Cross]v_?vec)]:=Expand[s] vExpand$[u\[Cross]v];
vExpand$[s_?scal (u_?vec\[CenterDot]v_?vec)]:=Expand[s] vExpand$[u\[CenterDot]v];

vExpand$[Plus[x__]]:=vExpand$/@Plus[x];
vExpand$[s_?scal,Plus[x__]]:=Expand[s](vExpand$/@Plus[x]);
vExpand$[Times[x__]]:=vExpand$/@Times[x];

vExpand[e_]:=e//.e:>Expand[vExpand$[e]]

(* Some simplification rules *)
(u_?vec\[Cross]u_?vec):=\!\(\*OverscriptBox["0", "\[RightVector]"]\);
(u_?vec+\!\(\*OverscriptBox["0", "\[RightVector]"]\)):=u;
0v_?vec:=\!\(\*OverscriptBox["0", "\[RightVector]"]\);

\!\(\*OverscriptBox["0", "\[RightVector]"]\)\[CenterDot]v_?vec:=0;
v_?vec\[CenterDot]\!\(\*OverscriptBox["0", "\[RightVector]"]\):=0;

(a_?scal u_?vec)\[Cross]v_?vec :=a u\[Cross]v;u_?vec\[Cross](a_?scal v_?vec ):=a u\[Cross]v;
(a_?scal u_?vec)\[CenterDot]v_?vec :=a u\[CenterDot]v;
u_?vec\[CenterDot](a_?scal v_?vec) :=a u\[CenterDot]v;

(* Stealing behavior from Dot *)
Attributes[CenterDot]=Attributes[Dot];

Protect[vExpand,vExpand$,Cross,Plus,Times,CenterDot];


0 commentaires