假设我有这个Mathematica代码,其输出是一个实数,取决于输入,比如x,y,z。如何根据代码在x,y,z中创建实值函数?功能性编程
如果代码描述了x,y,z之间的简单关系,我可以直接定义这个函数。这里的要点是给定的代码是一个非常复杂的块(或模块)。
例如,如果代码简单地总结X,Y,Z,我会简单地定义
f[x_,y_,z_]=x+y+z
如果我有一个非常复杂的例子,像下面这样:
s0[a_, b_, x_] :=
{1, 0, (a + b) x + (1 - a - b)}
s1[a_, b_, c_, d_, p_, q_, n_, x_] :=
Which[0 <= x <= c, {2, n - 1, x/c*q + p},
c <= x <= c + d, {2, n, (x - c)/d*p},
c + d <= x <= 1, {1, n + 1, (x - (c + d))/(1 - c - d)*(1 - a - b)}]
s2[s_, t_, c_, d_, p_, q_, n_, x_] :=
Which[0 <= x <= 1 - s - t, {2, n - 1,
x/(1 - s - t)*(1 - p - q) + p + q},
1 - s - t <= x <= 1 - s, {3,
n - 1, (x - (1 - s - t))/t*(1 - c - d) + c + d},
1 - s <= x <= 1, {3, n, (x - (1 - s))/s*d + c}]
s3[c_, a_, b_, s_, t_, n_, x_] :=
Which[0 <= x <= 1 - a - b, {4, n - 1, x/(1 - a - b)*t + 1 - s - t},
1 - a - b <= x <= 1 - a, {4, n, (x - (1 - a - b))/b*(1 - s - t)},
1 - a <= x <= 1, {3, n + 1, (x - (1 - a))/a*c}]
s4[p_, q_, s_, a_, b_, n_, x_] :=
Which[0 <= x <= p, {4, n - 1, x/p*s + 1 - s},
p <= x <= p + q, {5, n - 1, (x - p)/q*a/(a + b) + b/(a + b)},
p + q <= x <= 1, {5, n, (x - (p + q))/(1 - p - q)*b/(a + b)}]
F[{k_, n_, x_}] :=
Which[k == 0, s0[a, b, x],
k == 1, s1[a, b, c, d, p, q, n, x],
k == 2, s2[s, t, c, d, p, q, n, x],
k == 3, s3[c, a, b, s, t, n, x],
k == 4, s4[p, q, s, a, b, n, x]]
G[x_] := NestWhile[F, {0, 0, x}, Function[e, Extract[e, {1}] != 5]]
H[x_] := Extract[G[x], {2}] + Extract[G[x], {3}]
H[0]
对于上面的代码运行,需要指定列表
{a,b,c,d,p,q,s,t}
而输出是实数。如何在a,b,c,d,p,q,s,t中定义一个函数来分析这些实数?
好的问题因为在mathematica中的诀窍是使用模式符号“_”来使用模式进行函数式编程。在mathematica中使用Partition []函数或Split []函数来分割数字。记得用“。”对于数字来说,让他们真正成为数学家喜欢的符号,不知道它就像没有“。”的真实数字。有 – 2012-08-07 04:04:42
查看在线帮助中的“Piecewise”和“Switch”。至少可以使用'Switch'作为'F'定义。你还没有定义'e',所以你需要这样做。但否则,目前尚不清楚你的问题是什么。是的,你需要定义诸如's1'这样的辅助功能来保持代码的可读性,但是没有任何问题。要传递其他参数,您需要重新定义每个函数以获取列表中的所有参数,或者在可以在其中全局设置的选项中进行选择。在帮助中查找'SetOptions'。 – Verbeia 2012-08-07 06:05:43
@Verbeia我的代码似乎运行良好,没有定义'e'。我认为''e''''''''''''''''''''''''''''''''''''''''''''''s'''''''''''''''''''''''''''''''''''''''''''''''''''''''这是正确的理解吗? – 2012-08-15 22:42:38