Wolfram mathematica 函数式编程

Wolfram mathematica 函数式编程,wolfram-mathematica,Wolfram Mathematica,假设我有一个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_,

假设我有一个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中的一个函数来吐出这些实数?

你的基本问题是,你的辅助函数中有大量的参数,但你的大号函数F,G和H,顺便说一下,Mathematica中的单大写字母函数名是个坏主意,只取三个参数,辅助函数s0等在返回列表中只返回三个值

您有两种可能的方法来解决此问题

您可以重新定义所有内容,以要求整个系统中所需的所有参数-我假设辅助函数中的公共参数名称实际上是公共值-如下所示:

 G[x_, a_, b_, c_, d_, p_, q_, s_, t_] := 
 NestWhile[F, {0, 0, x, a, b, c, d, p, q, s, t}, 
  Function[e, Extract[e, {1}] != 5]]

您可以设置一些选项,为整个系统全局设置这些参数。查找选项和选项模式。您可以这样做:

 G[x_, a_, b_, c_, d_, p_, q_, s_, t_] := 
 NestWhile[F, {0, 0, x, a, b, c, d, p, q, s, t}, 
  Function[e, Extract[e, {1}] != 5]]
首先,定义默认选项:

Options[mySystem] = {aa -> 0.2, bb -> 1., cc -> 2., dd -> 4., 
     pp -> 0.2, qq -> 0.1, ss -> 10., tt -> 20.}
SetOptions[mySystem, {aa->0.2, bb->1., cc->2., dd->4., pp->0.2, 
     qq->0.1, ss->10., tt->20.}]
然后像这样编写函数:

F[{k_, n_, x_}, OptionsPattern[mySystem]] :=
 With[{a = OptionValue[aa], b = OptionValue[bb], c = OptionValue[cc], 
   d = OptionValue[dd], p = OptionValue[pp], q = OptionValue[qq], 
   s = OptionValue[ss], t = OptionValue[tt]}, 
  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]] ]

使用Extract也有很大的问题,你假设列表中的部分比前几次迭代中的实际部分多,但这回答了你的主要问题。

你的基本问题是,你的辅助函数中有大量的参数,但是你的大号函数F,G和H,顺便说一下,Mathematica中的单大写字母函数名是个坏主意,只取三个参数,辅助函数s0等在返回列表中只返回三个值

您有两种可能的方法来解决此问题

您可以重新定义所有内容,以要求整个系统中所需的所有参数-我假设辅助函数中的公共参数名称实际上是公共值-如下所示:

 G[x_, a_, b_, c_, d_, p_, q_, s_, t_] := 
 NestWhile[F, {0, 0, x, a, b, c, d, p, q, s, t}, 
  Function[e, Extract[e, {1}] != 5]]

您可以设置一些选项,为整个系统全局设置这些参数。查找选项和选项模式。您可以这样做:

 G[x_, a_, b_, c_, d_, p_, q_, s_, t_] := 
 NestWhile[F, {0, 0, x, a, b, c, d, p, q, s, t}, 
  Function[e, Extract[e, {1}] != 5]]
首先,定义默认选项:

Options[mySystem] = {aa -> 0.2, bb -> 1., cc -> 2., dd -> 4., 
     pp -> 0.2, qq -> 0.1, ss -> 10., tt -> 20.}
SetOptions[mySystem, {aa->0.2, bb->1., cc->2., dd->4., pp->0.2, 
     qq->0.1, ss->10., tt->20.}]
然后像这样编写函数:

F[{k_, n_, x_}, OptionsPattern[mySystem]] :=
 With[{a = OptionValue[aa], b = OptionValue[bb], c = OptionValue[cc], 
   d = OptionValue[dd], p = OptionValue[pp], q = OptionValue[qq], 
   s = OptionValue[ss], t = OptionValue[tt]}, 
  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]] ]

使用Extract也有很大的问题。你假设列表中的部分比前几次迭代中的实际部分多,但这回答了你的主要问题。

好问题,因为mathematica中的诀窍是使用模式符号对模式进行函数编程。要分割数字,请使用mathematica中的Partition[]函数或split[]函数。记住使用。因为mathematica喜欢符号,不知道它就像没有符号的实数。因此,请逐段查看并在联机帮助中切换。至少可以对F定义使用开关。您还没有定义e,所以需要这样做。但除此之外,你的问题是什么还不清楚。是的,您需要定义像s1这样的辅助函数来保持代码的可读性,但这并没有错。要传递其他参数,您需要重新定义每个函数,以获取列表中的所有参数,或者具有可以全局设置这些参数的选项。在帮助中查找SetOptions。@Verbeia我的代码在没有定义e的情况下运行良好。我以为e只是指要迭代的函数,在我的例子中是F。这是正确的理解吗?@MichaelC你说得很对。你的代码有点混乱,我没有注意到它只是插槽的等价物。好问题,因为mathematica中的诀窍是使用模式符号对模式进行函数编程。要分割数字,请使用mathematica中的Partition[]函数或split[]函数。记住使用。因为mathematica喜欢符号,不知道它就像没有符号的实数。因此,请逐段查看并在联机帮助中切换。至少可以对F定义使用开关。您还没有定义e,所以需要这样做。但除此之外,你的问题是什么还不清楚。是的,您需要定义像s1这样的辅助函数来保持代码的可读性,但这并没有错。要传递其他参数,您需要重新定义每个函数,以获取列表中的所有参数,或者具有可以全局设置这些参数的选项。在帮助中查找SetOptions。@Verbeia我的代码在没有定义e的情况下运行良好。我以为e只是指要迭代的函数,在我的例子中是F。这是正确的理解吗?@MichaelC你说得很对。你的代码有点混乱,我
没有注意到它只是相当于插槽。第一个选项起作用了。对于第二个问题,我可能需要花更多的时间来理解它。我看不出使用提取物有什么不对。我的代码似乎在工作。你能解释一下吗?@MichaelC只是当我运行你的代码时,它想提取某个东西的第n部分,比如说列表中的第n-2部分。因此它找不到第n部分并抛出了一个错误。第一个选项有效。对于第二个问题,我可能需要花更多的时间来理解它。我看不出使用提取物有什么不对。我的代码似乎在工作。你能解释一下吗?@MichaelC只是当我运行你的代码时,它想提取某个东西的第n部分,比如说列表中的第n-2部分。所以它找不到第n部分并抛出了一个错误。