좌표없는 미분

Sep 08 2020

주어진 기능 \begin{align*} f \colon \mathbb{R}^n &\to \mathbb{R}^n\\ v&\mapsto \dfrac{v}{\|v\|}, \end{align*} 나는 미분을 계산하고 싶습니다. $f$, 그건 $df(v)$. 손으로 유도하는 것이 가능합니다.

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

어디 $I_n$ 단위 2 차 행렬입니다.

Mathematica 는 간단한 내장 함수를 사용하여 찾을 수 없다고 생각 v = {v1, v2, v3}합니다.$n=3$예를 들어). 일부 패키지는 미분 지오메트리 전용이지만 ( 좌표가없는 미분 양식 패키지 또는 Mathematica 용 미분 지오메트리 애드온 참조 ) 위의 계산을 달성하지 못했습니다. 힌트를 주시면 감사하겠습니다.


편집 위의 공식을 찾는 방법에 관심이있는 분들을 위해 다음과 같이 정의 할 수 있습니다.$g(t)=f(v(t))=\big(v(t)\cdot v(t)\big)^{1/2}v(t)$ 그리고 계산 $g'(t)$ 체인 규칙과 함께. $g'(t)$ 다음의 선형 함수입니다. $v'(t)$ 때문에:

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

앞에 계수를 $v'(t)$ 위의 표현을 제공합니다.

이제 다음과 같은이 접근 방식의 순진한 구현은의 다차원 성을 포착하지 못하기 때문에 실패합니다 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 *)

답변

8 vsht Sep 15 2020 at 15:39

FeynCalc를 사용하는 해결책 은 다음과 같습니다.

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

에 해당하는 $ \frac{v^i}{\sqrt{v^2}} $( CVD$D-1$차원 데카르트 벡터 CSPD는 다음의 데카르트 스칼라 곱입니다.$D-1$치수). 그런 다음 루틴 ThreeDivergence($\nabla^j$)

ThreeDivergence[ex, CVD[v, j]]

우리는 찾는다 $ \frac{\delta ^{i j}}{\sqrt{v^2}}-\frac{v^i v^j}{\left(v^2\right)^{3/2}}. $

물론 FeynCalc는 미분 기하학을 수행하는 도구가 아닙니다. 텐서 루틴은 Feynman 다이어그램 계산에서 일반적으로 필요한 것만 포함합니다. 따라서 좀 더 심각한 작업을 위해서는 OP가 전용 텐서 대수 패키지에 익숙해 져야한다고 생각합니다.

8 MichaelSeifert Sep 16 2020 at 00:24

다음과 같이 변형 파생 기능을 남용 할 수 있습니다 xTensor.

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

여기서 함수 ff는 "표준의 역"을 의미합니다. 일부 스칼라 인수의 스칼라 함수로 형식화되어야하므로 xTensor파생물을 취하는 방법을 알고 있습니다. (이 작업을 직접 사용하면 Sqrt오류가 발생합니다. 이유를 모르겠습니다.)

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

변량 미분을 취 ff하면 -1/2 멱 함수를 포함하여 원하는 함수 로 설정할 수 있습니다 .

매니 폴드의 차원은 dim이 코드에서 지정되지 않은 상태로 유지됩니다. 일부 관련 사례 (단순화 또는 수량 추적 계산)에서이를 지정해야 할 수도 있지만 여기서는 필요하지 않은 것 같습니다.

8 CarlWoll Sep 16 2020 at 01:03

다음 접근 방식을 사용할 수 있습니다.

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

그때:

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

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