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
p> où je sais 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 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 Réponses :
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)}
Les deux règles de point-produit peuvent être fusionnées en une seule en remplaçant le c _ code> dans la première règle avec
c _. Code> ou
c: 1 code>, où le La période indique à Mathematica d'utiliser la valeur par défaut standard pour la multiplication.
Dans Résolvez [A + V T == P, P] CODE> Vous avez manqué le
t code> multiplier
p code>.
Vous tapez le produit croisé avec : ESC: Cross: ESC: code>.
@RCollyer Mon erreur devrait fonctionner avec l'addition. @Kennytm merci d'avoir souligné cela.
J'ai pris une approche quelque peu différente de cette question. J'ai fabriqué des définitions qui renvoient cette sortie:
Les motifs connus pour être des quantités de vecteur peuvent être spécifiés à l'aide de 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> 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.
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];
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.