Wolfram mathematica 在函数极其复杂的情况下,如何更快地绘制曲面?

Wolfram mathematica 在函数极其复杂的情况下,如何更快地绘制曲面?,wolfram-mathematica,Wolfram Mathematica,我试图在下面的代码中绘制函数hh的图形(请跳到代码的最后一行)。我已经设置了PlotPoints->2和MaxRecursion->0,但是代码仍然在运行,已经运行了大约8个小时。函数hh极其复杂,涉及大量迭代。有没有办法让代码运行得更快 s0[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, x_] := {a, b, u, c, d, v, p, q, z, s, t, w, 1, 0, (a + b) x + u} s1[a_, b_, u

我试图在下面的代码中绘制函数
hh
的图形(请跳到代码的最后一行)。我已经设置了
PlotPoints->2
MaxRecursion->0
,但是代码仍然在运行,已经运行了大约8个小时。函数
hh
极其复杂,涉及大量迭代。有没有办法让代码运行得更快

s0[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, x_] :=
 {a, b, u, c, d, v, p, q, z, s, t, w, 1, 0, (a + b) x + u}

s1[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, n_, x_] :=
 Which[0 <= x <= c, {a, b, u, c, d, v, p, q, z, s, t, w, 2, n - 1, x/c*q + p},
  c <= x <= c + d, {a, b, u, c, d, v, p, q, z, s, t, w, 2, n, (x - c)/d*p},
   c + d <= x <= 1, {a, b, u, c, d, v, p, q, z, s, t, w, 1, n + 1, (x - (c + d))/v*u}]

s2[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, n_, x_] :=
 Which[0 <= x <= w, {a, b, u, c, d, v, p, q, z, s, t, w, 2, n - 1, x/w*z + p + q},
  w <= x <= 1 - s, {a, b, u, c, d, v, p, q, z, s, t, w, 3, n - 1, (x - w)/t*v + c + d},
   1 - s <= x <= 1, {a, b, u, c, d, v, p, q, z, s, t, w, 3, n, (x - (1 - s))/s*d + c}]

s3[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, n_, x_] :=
 Which[0 <= x <= u, {a, b, u, c, d, v, p, q, z, s, t, w, 4, n - 1, x/u*t + w},
  u <= x <= 1 - a, {a, b, u, c, d, v, p, q, z, s, t, w, 4, n, (x - u)/b*w},
   1 - a <= x <= 1, {a, b, u, c, d, v, p, q, z, s, t, w, 3,n + 1, (x - (1 - a))/a*c}]

s4[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, n_, x_] :=
 Which[0 <= x <= p, {a, b, u, c, d, v, p, q, z, s, t, w, 4, n - 1, x/p*s + 1 - s},
  p <= x <= p + q, {a, b, u, c, d, v, p, q, z, s, t, w, 5, n - 1, (x - p)/q*a/(a+ b)+ b/(a + b)},
   p + q <= x <= 1, {a, b, u, c, d, v, p, q, z, s, t, w, 5, n, (x - (p + q))/z*b/(a + b)}]

f[{a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, k_, n_, x_}] :=
 Which[k == 0, s0[a, b, u, c, d, v, p, q, z, s, t, w, x],
  k == 1, s1[a, b, u, c, d, v, p, q, z, s, t, w, n, x],
   k == 2, s2[a, b, u, c, d, v, p, q, z, s, t, w, n, x],
    k == 3, s3[a, b, u, c, d, v, p, q, z, s, t, w, n, x],
     k == 4, s4[a, b, u, c, d, v, p, q, z, s, t, w, n, x]]

g[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, x_] := 
 NestWhile[f, {a, b, u, c, d, v, p, q, z, s, t, w, 0, 0, x}, Function[e, Extract[e, {13}] != 5]]

h[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, x_] := 
 Extract[g[a, b, u, c, d, v, p, q, z, s, t, w, x], {15}] + 
  Extract[g[a, b, u, c, d, v, p, q, z, s, t, w, x], {14}]

ff[{a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, x_}] := {a, b, u, c, d, v, p, q, z, s, t, w, h[a, b, u, c, d, v, p, q, z, s, t, w, x - Floor[x]] + Floor[x]}

gg[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_] := 
 N[Extract[Nest[ff, N[{a, b, u, c, d, v, p, q, z, s, t, w, 0}], 10^3], {13}]/10^3]

hh[x_, y_] := 
 gg[x, y, 1 - x - y, x, y, 1 - x - y, x, y, 1 - x - y, x, y, 1 - x - y]

Plot3D[hh[x, y], {x, 0, 1}, {y, 0, 1}, RegionFunction -> Function[{x, y, z}, x + y <= 1], PlotPoints -> 2,  MaxRecursion -> 0]
s0[a_uu,b_u,u_u,c_u,d_u,v_u,p_u,q_u,z_u,s_u,t_u,w_u,x_u]:=
{a,b,u,c,d,v,p,q,z,s,t,w,1,0,(a+b)x+u}
s1[a,b,u,c,d,v,p,q,z,s,t,w,n,x]:=

这[0我认为你的功能有一些问题。 不过,这里有一些想法;我修改了几个函数:

s0[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, n_, x_] = 
 {a, b, u, c, d, v, p, q, z, s, t, w, 1, 0, (a + b) x + u}    

(* so it matches the others *)

f[{a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, k_, n_, x_}] := 
 {s0[a, b, u, c, d, v, p, q, z, s, t, w, n, x],                         
  s1[a, b, u, c, d, v, p, q, z, s, t, w, n, x],
  s2[a, b, u, c, d, v, p, q, z, s, t, w, n, x],
  s3[a, b, u, c, d, v, p, q, z, s, t, w, n, x],
  s4[a, b, u, c, d, v, p, q, z, s, t, w, n, x]}[[k + 1]]

 g[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, x_] := 
  NestWhile[f, {a, b, u, c, d, v, p, q, z, s, t, w, 0, 0, x}, #[[13]] != 5 &]


 h[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_, x_] := 
   Total[g[a, b, u, c, d, v, p, q, z, s, t, w, x][[{14, 15}]]]

(* in order to avoid calculating the same quantity twice *)

gg[a_, b_, u_, c_, d_, v_, p_, q_, z_, s_, t_, w_] := 
  Nest[ff, {a, b, u, c, d, v, p, q, z, s, t, w, 0}, 10^3][[13]]/10^3

{elapsed, data} = Outer[If[#1 + #2 <= 1, {#1, #2, hh[#1, #2]}, {#1, #2, "bad"}] &, 
  Range[0.1, 1, 0.25], Range[0.1, 1, 0.25]] // AbsoluteTiming

(* {6.820061, {{{0.1, 0.1, -1.99961}, {0.1, 0.35, -1.99961}, {0.1, 0.6, -2.00009}, 
   {0.1, 0.85, -2.00001}}, {{0.35, 0.1, -1.99993}, {0.35, 0.35, -2.00004}, 
   {0.35, 0.6, -2.00017}, {0.35, 0.85, "bad"}}, {{0.6, 0.1, -1.99996}, 
   {0.6,0.35, -2.00024}, {0.6, 0.6, "bad"}, {0.6, 0.85, "bad"}}, 
   {{0.85, 0.1, -1.99967}, {0.85, 0.35, "bad"}, {0.85, 0.6, "bad"}, {0.85, 0.85, "bad"}}}} *)

ListPlot3D[Select[Flatten[data, 1], NumericQ[#[[3]]] &]]
s0[a,b,u,u,c,d,v,p,q,z,s,t,w,n,x]=
{a,b,u,c,d,v,p,q,z,s,t,w,1,0,(a+b)x+u}
(*因此它与其他的匹配*)
f[{a_uu,b_u,u_u,c_u,d_u,v_u,p_u,q_u,z_u,s_u,t_u,w_u,k_u,n_u,x_u]:=
{s0[a,b,u,c,d,v,p,q,z,s,t,w,n,x],
s1[a,b,u,c,d,v,p,q,z,s,t,w,n,x],
s2[a,b,u,c,d,v,p,q,z,s,t,w,n,x],
s3[a,b,u,c,d,v,p,q,z,s,t,w,n,x],
s4[a,b,u,c,d,v,p,q,z,s,t,w,n,x]}[[k+1]]
g[a,b,u,c,d,v,p,q,z,s,t,w,x]:
当[f,{a,b,u,c,d,v,p,q,z,s,t,w,0,0,x},#[13]!=5&]
h[a,b,u,c,d,v,p,q,z,s,t,w,x]:
总计[g[a,b,u,c,d,v,p,q,z,s,t,w,x][{14,15}]]
(*为了避免两次计算相同数量*)
gg[a_u,b_u,u_u,c_u,d_u,v_u,p_u,q_u,z_u,s_u,t_u,w_u]:=
嵌套[ff,{a,b,u,c,d,v,p,q,z,s,t,w,0},10^3][[13]]/10^3

{passed,data}=Outer[If[#1+#2您的函数有问题:例如,求值,
hh[1,1]
,打印消息并无限期运行:
Extract::partw:“f[s0[1,1.,-1,1,1.,-1,1,1,1,1,1,0.]的第13部分不存在。”
函数
hh
不允许输入
(1,1)
。参数
x,y
必须满足
x+y@gatessucks谢谢你的回答。修改后的代码现在在我的机器上只运行了8秒钟。不过我有一个问题。为什么需要使用
选择
?数据中的点似乎都是数字。@MichaelC不,我用了一种快速的方法获得了一些points.I包括不符合约束条件的点
x+y