Derivata senza coordinate

Sep 08 2020

Data la funzione \begin{align*} f \colon \mathbb{R}^n &\to \mathbb{R}^n\\ v&\mapsto \dfrac{v}{\|v\|}, \end{align*} Vorrei calcolare la derivata di $f$, questo è $df(v)$. È possibile ricavarlo a mano, il che porta a

$$df(v)=\dfrac{1}{\| v\|}\Big(I_n - \dfrac{v}{\|v\|}\otimes \dfrac{v}{\|v\|}\Big)$$

dove $I_n$ è la matrice dell'identità del secondo ordine.

Credo che Mathematica non riesca a trovarlo utilizzando semplici funzioni integrate (senza definire esplicitamente v = {v1, v2, v3}if$n=3$per esempio). Alcuni pacchetti sono dedicati alla geometria differenziale (vedi Pacchetto di forme differenziali libere di coordinate o Add-on di geometria differenziale per Mathematica ) ma non sono riuscito a ottenere il calcolo di cui sopra. Qualsiasi suggerimento sarebbe apprezzato.


Modifica Per quelli di voi che sono interessati a come trovare la formula sopra, è possibile definire$g(t)=f(v(t))=\big(v(t)\cdot v(t)\big)^{1/2}v(t)$ e calcolare $g'(t)$ con la regola della catena. $g'(t)$ è una funzione lineare di $v'(t)$ perché:

$$g'(t)=\dfrac{df}{dv}(v(t)) v'(t)$$

Prendendo il coefficiente davanti a $v'(t)$ dà l'espressione sopra.

Ora, l'implementazione ingenua di questo approccio come segue fallisce perché non cattura la multi-dimensionalità di f:

f[v_] = v/Norm[v]
h[t_] = D[f[v[t]], t]/v'[t] // Simplify
h[t] /. Norm'[v[t]] -> v[t]/Norm[v[t]] // Simplify
(* (Norm[v[t]]^2 - v[t]^2)/Norm[v[t]]^3 *)

Risposte

8 vsht Sep 15 2020 at 15:39

Una soluzione utilizzando FeynCalc sarebbe scrivere

ex = CVD[v, i]/Sqrt[CSPD[v, v]]

che corrisponde a $ \frac{v^i}{\sqrt{v^2}} $( CVDindica un$D-1$vettore cartesiano dimensionale, CSPDè un prodotto scalare cartesiano in formato$D-1$dimensioni). Quindi utilizzando la routine ThreeDivergence($\nabla^j$)

ThreeDivergence[ex, CVD[v, j]]

noi troviamo $ \frac{\delta ^{i j}}{\sqrt{v^2}}-\frac{v^i v^j}{\left(v^2\right)^{3/2}}. $

Ovviamente, FeynCalc non è uno strumento per eseguire la geometria differenziale. Le routine tensoriali coprono solo ciò che di solito è necessario nei calcoli del diagramma di Feynman. Quindi suppongo che per compiti più seri l'OP dovrebbe ancora acquisire familiarità con i pacchetti di algebra tensoriale dedicati.

8 MichaelSeifert Sep 16 2020 at 00:24

Puoi abusare della funzionalità derivativa variazionale xTensorper fare questo:

<< xAct`xTensor`
DefManifold[M, dim, IndexRange[a, m]];
DefMetric[1, metric[-a, -b], PD, PrintAs -> "\[Delta]", 
  FlatMetric -> True, SymbolOfCovD -> {",", "\[PartialD]"}];

DefTensor[v[a], M]
DefScalarFunction[ff]

La funzione ffqui è un sostituto per "l'inverso della norma". Deve essere digitato come una funzione scalare di alcuni argomenti scalari, quindi xTensorsa come prenderne la derivata. (Cercando di farlo direttamente utilizzando Sqrtgenera errori; non sono sicuro del perché.)

VarD[v[c], PD][v[a] ff[v[b] v[-b]]] // ScreenDollarIndices // ContractMetric
% /. ff -> (#^(-1/2) &)

Una volta presa la derivata variazionale, è possibile impostare ffqualsiasi funzione si desideri, inclusa (in questo caso) la funzione di potenza -1/2.

Si noti che la dimensionalità del collettore dimrimane non specificata in questo codice. Potrebbe essere necessario specificarlo in alcuni casi correlati (per semplificazione o per calcolare tracce di quantità), ma non sembra essere necessario qui.

8 CarlWoll Sep 16 2020 at 01:03

Forse potresti usare il seguente approccio:

Clear[VectorD]

VectorD[e_, v_] := ReplaceAll[
    D[e, VectorD, NonConstants->{v}],
    s_Dot:>TensorReduce[s,Assumptions->v ∈ Vectors[d]]
]

VectorD /: D[s_. v_,VectorD,NonConstants->{v_}] := s IdentityMatrix[d] + 
    TensorProduct[v, D[s, VectorD, NonConstants->{v}]]
VectorD /: D[Transpose[f_], VectorD, NonConstants->{x_}] := Transpose[
    D[f, VectorD, NonConstants->{x}]
]
VectorD /: D[a_Dot|a_Times|a_TensorProduct, VectorD, NonConstants->{x_}] := Sum[
    MapAt[D[#, VectorD, NonConstants->{x}]&, a, i],
    {i,Length[a]}
]

Poi:

VectorD[v/Sqrt[v.v], v]

IdentityMatrix [d] / Sqrt [vv] - TensorProduct [v, v] / (vv) ^ (3/2)