Existe uma maneira de uma equação implícita em forma paramétrica?
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
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)}} *)
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}]