Plot3D no se ejecutará con una función de 2 variables
Estoy tratando de trazar una función de 2 variables que también tiene algunos parámetros. Lo definí como:
f[x_,y_][pars_] := ...
donde parses el conjunto de parámetros. Sin embargo, no puedo trazar la función. Traté de usar:
Plot3D[f[x,y], ...]
y
Plot3D[f[x,y][pars], ...]
pero tampoco funciona. El corchete negro aparece a la derecha y el programa se está ejecutando, pero no hay salida. ¿Como puedo resolver esto?
Aquí está el enlace al cuaderno: https://drive.google.com/file/d/1NdrBwRJ7BWaguXHxmt2bnJdkHhg5IIb4/view?usp=sharing
Respuestas
Antes de echarle la culpa, Plot3Dfíjate en la función a la que le estás alimentando. Si ejecuto B[-a, -a][pars]en su cuaderno, no regresa de manera oportuna. Mirando la definición de Btienes
B[x_, y_][pars_] := ...
pero observe que parsno aparece en el lado derecho de esa expresión. Así que cuando se llama a Bque no se acostumbra, y las variables reales Nm, Nnetc, permanecen indefinidos cuando se llama B.
En lugar de eso, haz algo como
B[x_, y_][pars_] := With[
{Nm = Lookup[pars, Nm], Nn = Lookup[pars, Nn], <the rest of your variables>},
<your big expression>
]
Dado que parses una lista de reglas, esto se usa Lookuppara obtener los valores numéricos reales y luego se usa Withpara hacer la sustitución.
Después de esto, puedo comprobar que evalúa
In[44]:= B[-a, -a][pars]
Out[44]= 119996.
y lo hace con bastante rapidez.
Clear["Global`*"]
Subscript[B, 0] = 120000; (* in G*)
Subscript[Φ, 0] =
2.0679*10^-7*10^16 // Rationalize; (* in G A^2 *)
a = Sqrt[(2*Subscript[Φ, 0])/(Sqrt[3]*Subscript[B, 0])];
K[m_, n_] = Sqrt[(2*Pi^2*Subscript[B, 0])/
(Sqrt[3]*Subscript[Φ, 0])]*{(-Sqrt[3])*n,
2*m - n};
ξ0 = Sqrt[
Subscript[Φ, 0]/(2*Pi*Hc2)] /. {Hc2 -> 350000};
pars = {ξ -> ξ0, λ -> 2700, Nn -> 2, Nm -> 2};
B[x_, y_][{ξ_?NumericQ, λ_?NumericQ, Nn_Integer, Nm_Integer}] :=
Subscript[B, 0] + Subscript[B, 0]*
Sum[If[m == 0 && n == 0, 0,
If[K[n, m] . K[n, m]*ξ^2 < 0.05, 0,
Exp[(-ξ^2)*(K[m, n] . K[m, n]/2)]/
(1 + λ^2*K[m, n] . K[m, n])]*
Cos[K[m, n] . {x, y}]],
{m, -Nm, Nm}, {n, -Nn, Nm}]
Plot3D[
B[x, y][{ξ, λ, Nn, Nm} /. pars],
{x, -a, a}, {y, -a, a},
AxesLabel -> Automatic,
PlotPoints -> 50]
DensityPlot[
B[x, y][{ξ, λ, Nn, Nm} /. pars],
{x, -a, a}, {y, -a, a},
FrameLabel -> Automatic,
PlotPoints -> 100,
PlotLegends -> Automatic]
Bmax = B[0, 0] [{ξ, λ, Nn, Nm} /. pars] // N
120011.
Bmin = N[B[a/2, a/(2*Sqrt[3])][{ξ, λ, Nn, Nm} /. pars]]
119995.