Plot3D sẽ không chạy với hàm 2 biến

Sep 15 2020

Tôi đang cố gắng vẽ một hàm 2 biến cũng có một số tham số. Tôi đã định nghĩa nó là:

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

nơi parslà tập hợp các thông số. Tuy nhiên, tôi không thể vẽ hàm. Tôi đã cố gắng sử dụng:

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

và

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

nhưng không hoạt động. Dấu ngoặc đen xuất hiện ở bên phải và chương trình đang chạy, nhưng không có đầu ra. Làm sao tôi có thể giải quyết việc này?

Đây là liên kết đến sổ ghi chép: https://drive.google.com/file/d/1NdrBwRJ7BWaguXHxmt2bnJdkHhg5IIb4/view?usp=sharing

Trả lời

2 JasonB. Sep 15 2020 at 21:15

Trước khi ghim lỗi vào, Plot3Dhãy xem chức năng bạn đang cho nó ăn. Nếu tôi chạy B[-a, -a][pars]trong sổ ghi chép của bạn, nó không quay lại kịp thời. Nhìn vào định nghĩa của Bbạn có

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

nhưng lưu ý rằng parsnó không hiển thị ở phía bên phải của biểu thức đó. Vì vậy, khi bạn gọi Bnó không được sử dụng, và các biến thực tế Nm, Nn, vv, vẫn không xác định khi gọi B.

Thay vào đó hãy làm điều gì đó như

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

Vì parslà danh sách các quy tắc, điều này sử dụng Lookupđể nhận các giá trị số thực tế và sau đó sử dụng Withđể thay thế.

Sau đó, tôi có thể kiểm tra xem nó đánh giá

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

Out[44]= 119996.

và nó hoạt động khá nhanh chóng.

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.