Existe uma maneira de uma equação implícita em forma paramétrica?

Oct 04 2020

Por exemplo, pegue a equação implícita para o círculo unitário

$\qquad x^2 + y^2 = 1$.

Existe uma função Parameterize[x^2 + y^2 == 1]que retornaria uma função com valor vetorial

$\qquad v(t) = \{\cos(t),\,\sin(t)\}$

Eu ParametricNDSolvedescobri, mas não consigo descobrir como funciona.

Posso estar fazendo a pergunta errada, por favor, me avise se você acha que é o caso.

Respostas

3 MichaelE2 Oct 04 2020 at 23:18

Geralmente, esse é um problema difícil de resolver simbolicamente. A função a seguir não verifica se o sistema foi resolvido, nem remove soluções singulares.

ClearAll[parametrize];
(* Polar parametrization centered at basepoint *)
parametrize[eqn_, v : {x_, y_}, t_, basepoint : {_, _}] :=      
  parametrize[eqn, v, t, 
   Function[{param, elim}, basepoint + elim*{Cos[param], Sin[param]}]];
(* Default: polar parametrization centered at origin as in OP *)
parametrize[eqn_, v : {x_, y_}, t_, 
   paramform_ : Function[{param, elim}, elim*{Cos[param], Sin[param]}]
   ] :=
  Module[{r},
   Simplify@Solve[
     Eliminate[Flatten@{eqn, v == paramform[t, r]}, r],
     {x, y}
     ]
   ];

Exemplos:

parametrize[x^2 + y^2 == 1, {x, y}, t]
(*  {{x -> -Cos[t], y -> -Sin[t]}, {x -> Cos[t], y -> Sin[t]}}  *)
parametrize[x^2 + y^2 == 1, {x, y}, t, {1, 0}]
(*  {{x -> 1, y -> 0}, {x -> -Cos[2 t], y -> -2 Cos[t] Sin[t]}}  *)
(* The "Pythagorean Triples" parametrization *)
parametrize[x^2 + y^2 == 1, {x, y}, m, 
 Function[{m, x}, {x, m*(x + 1)}]]
(*  {{x -> -1, y -> 0}, {x -> (1 - m^2)/(1 + m^2), y -> (2 m)/(1 + m^2)}}  *)
2 MichaelE2 Oct 05 2020 at 01:44

Aqui está um complemento numérico para minha outra resposta. Basta integrar ortogonalmente ao gradiente. O código abaixo produz uma parametrização por comprimento de arco. Deve falhar (interromper a integração) se atingir um ponto singular. NDSolvenão permite que o domínio de integração seja infinito em ambos os lados, ou seja {t, -Infinity, Infinity},. Se você deseja começar no meio e integrar as duas formas, altere {t, 0, Infinity}de nParametrizeacordo.

ClearAll[nParametrize];
ClearAll[periodify];
periodify[list_List] := ReplacePart[list, -1 -> First@list];

ClearAll[closeIF];
closeIF[ifn_InterpolatingFunction] := Interpolation[Transpose@{
     ifn["Grid"],
     periodify@ifn["ValuesOnGrid"], 
     periodify@Derivative[1][ifn]["ValuesOnGrid"]}, 
   PeriodicInterpolation -> True];
nParametrize[eqn_, v : {x_, y_}, basepoint : {x0_, y0_}, 
   tol_ : 0.001] :=
  Module[{vel, t, periodicQ = False},
   vel = Simplify[
     ComplexExpand@Normalize@Cross@D[eqn /. Equal -> Subtract, {v}],
     eqn];
   With[{res = NDSolve[
       {{x'[t], y'[t]} == (vel /. u : x | y :> u[t]),
        x[0] == x0, y[0] == y0,
        WhenEvent[
         x[t] == x0 && 
          Abs[y[t] - y0] < (tol + Sqrt@$MachineEpsilon*Abs[y0]), periodicQ = True; "StopIntegration"], WhenEvent[ y[t] == y0 && Abs[x[t] - x0] < (tol + Sqrt@$MachineEpsilon*Abs[x0]),
         periodicQ = True; "StopIntegration"]},
       v, {t, 0, Infinity}]},
    res /. if_InterpolatingFunction /; periodicQ :> closeIF[if]
    ]
   ];

Exemplo:

psol = nParametrize[x^2 + y^2 == 1, {x, y}, {1, 0}]

Nesse caso, nParametrizeconstrói uma solução periódica, portanto, na verdade, o domínio é todo composto por números reais (até as limitações de flutuação da máquina).

ParametricPlot[{x[t], y[t]} /. psol // Evaluate, {t, 10, 14}]