Derivada sin coordenadas

Sep 08 2020

Dada la función \begin{align*} f \colon \mathbb{R}^n &\to \mathbb{R}^n\\ v&\mapsto \dfrac{v}{\|v\|}, \end{align*} Me gustaría calcular la derivada de $f$, es decir $df(v)$. Es posible derivarlo a mano, lo que conduce a

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

dónde $I_n$ es la matriz de identidad de segundo orden.

Creo que Mathematica no puede encontrar eso usando funciones integradas simples (sin definir explícitamente v = {v1, v2, v3}si$n=3$por ejemplo). Algunos paquetes están dedicados a la geometría diferencial (consulte Paquete de formas diferenciales libres de coordenadas o Complementos de geometría diferencial para Mathematica ) pero no logré realizar el cálculo anterior. Cualquier sugerencia sería apreciada.


Editar Para aquellos de ustedes que estén interesados ​​en cómo encontrar la fórmula anterior, pueden definir$g(t)=f(v(t))=\big(v(t)\cdot v(t)\big)^{1/2}v(t)$ y calcular $g'(t)$ con la regla de la cadena. $g'(t)$ es una función lineal de $v'(t)$ porque:

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

Tomando el coeficiente delante de $v'(t)$ da la expresión anterior.

Ahora, la implementación ingenua de este enfoque como sigue falla porque no captura la multidimensionalidad de 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 *)

Respuestas

8 vsht Sep 15 2020 at 15:39

Una solución usando FeynCalc sería escribir

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

que corresponde a $ \frac{v^i}{\sqrt{v^2}} $( CVDdenota un$D-1$vector cartesiano dimensional, CSPDes un producto escalar cartesiano en$D-1$dimensiones). Luego, usando la rutina ThreeDivergence($\nabla^j$)

ThreeDivergence[ex, CVD[v, j]]

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

Por supuesto, FeynCalc no es una herramienta para hacer geometría diferencial. Las rutinas de tensor solo cubren lo que normalmente se necesita en los cálculos del diagrama de Feynman. Así que supongo que para tareas más serias, el OP aún necesitaría familiarizarse con paquetes dedicados de álgebra tensorial.

8 MichaelSeifert Sep 16 2020 at 00:24

Puede abusar de la funcionalidad derivada variacional xTensorpara hacer esto:

<< 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 función ffaquí es un sustituto de "la inversa de la norma". Tiene que escribirse como una función escalar de algunos argumentos escalares, por lo que xTensorsabe cómo tomar su derivada. (Intentar hacer esto directamente usando Sqrtarroja errores; no estoy seguro de por qué).

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

Una vez que se toma la derivada variacional, puede configurar ffcualquier función que desee, incluida (en este caso) la función de potencia -1/2.

Tenga en cuenta que la dimensionalidad del colector dimpermanece sin especificar en este código. Podría ser necesario especificarlo en algunos casos relacionados (para simplificar o para calcular trazas de cantidades), pero no parece ser necesario aquí.

8 CarlWoll Sep 16 2020 at 01:03

Quizás podría utilizar el siguiente enfoque:

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]}
]

Luego:

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

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