Mic*_*l C 1 wolfram-mathematica
假设我有这个Mathematica代码,其输出是一个实数,取决于输入,比如x,y,z.如何根据代码在x,y,z中创建实值函数?
如果代码描述了x,y,z之间的简单关系,我可以直接定义这个函数.这里的要点是给定的代码是一个非常复杂的块(或模块).
例如,如果代码简单地对x,y,z求和,我只需定义
f[x_,y_,z_]=x+y+z
Run Code Online (Sandbox Code Playgroud)
如果我有一个非常复杂的例子,如下所示:
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]
Run Code Online (Sandbox Code Playgroud)
要运行上面的代码,需要指定列表
{a,b,c,d,p,q,s,t}
Run Code Online (Sandbox Code Playgroud)
输出是实数.如何定义a,b,c,d,p,q,s,t中的函数来吐出这些实数?
你根本的问题是,你必须在你的辅助功能,大量的参数,但你的大字母的功能(F,G并且H顺便说一句单一资本字母在数学函数名是一个坏主意)只需要三个参数和你辅助函数(s0etc)只返回返回列表中的三个值.
您有两种可能的方法来解决这个问题.
您可以重新定义所有内容以要求整个系统中所需的所有参数 - 我假设辅助函数中的公共参数名称确实是常见值 - 如下所示:
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]]
Run Code Online (Sandbox Code Playgroud)
要么
您可以设置一些选项,为整个系统全局设置这些参数.查找Options和OptionsPattern.你会做这样的事情:
首先,定义默认选项:
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.}]
Run Code Online (Sandbox Code Playgroud)
然后写这样的函数:
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]] ]
Run Code Online (Sandbox Code Playgroud)
使用时也存在一些问题Extract(您假设列表中的部分比前几次迭代中的部分多),但这可以解决您的主要问题.
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |