Plot3D wird nicht mit einer 2-Variablen-Funktion ausgeführt

Sep 15 2020

Ich versuche, eine 2-Variablen-Funktion zu zeichnen, die auch einige Parameter enthält. Ich habe es definiert als:

f[x_,y_][pars_] := ...

Wo parsist der Satz von Parametern. Ich kann die Funktion jedoch nicht zeichnen. Ich habe versucht zu verwenden:

Plot3D[f[x,y], ...]

und

Plot3D[f[x,y][pars], ...]

aber keine Arbeit. Die schwarze Klammer wird rechts angezeigt und das Programm wird ausgeführt, es erfolgt jedoch keine Ausgabe. Wie kann ich das lösen?

Hier ist der Link zum Notizbuch: https://drive.google.com/file/d/1NdrBwRJ7BWaguXHxmt2bnJdkHhg5IIb4/view?usp=sharing

Antworten

2 JasonB. Sep 15 2020 at 21:15

Bevor Sie die Schuld auf sich ziehen, Plot3Dschauen Sie sich die Funktion an, die Sie füttern. Wenn ich B[-a, -a][pars]in Ihrem Notizbuch laufe , wird es nicht rechtzeitig zurückgegeben. Betrachten Sie die Definition von BIhnen haben

B[x_, y_][pars_] := ...

Beachten Sie jedoch, dass parsdies nicht auf der rechten Seite dieses Ausdrucks angezeigt wird. Also , wenn Sie anrufen Bes nicht verwendet wird werden, und die tatsächlichen Variablen Nm, Nnusw., bleiben undefiniert wenn Sie anrufen B.

Mach stattdessen so etwas

B[x_, y_][pars_] := With[
    {Nm = Lookup[pars, Nm], Nn = Lookup[pars, Nn], <the rest of your variables>},
    <your big expression>
]

Da parses sich um eine Liste von Regeln handelt, werden Lookuphiermit die tatsächlichen numerischen Werte abgerufen und anschließend Withdie Ersetzungen vorgenommen.

Danach kann ich überprüfen, ob es ausgewertet wird

In[44]:= B[-a, -a][pars]

Out[44]= 119996.

und das ziemlich schnell.

1 BobHanlon Sep 15 2020 at 21:38
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.