1

私がこの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でどのように定義しますか?

4

1 に答える 1

6

あなたの本質的な問題は、補助関数に多数のパラメーターがあることですが、大きな文字の関数(FGそしてH数学の単一大文字の関数名は悪い考えです)は3つのパラメーターしか取りません。補助関数(s0など)は、返されたリストで3つの値のみを返します。

これを修正するには、2つの方法があります。

すべてを再定義して、システム全体で必要なすべてのパラメーターを要求することができます-補助関数全体で共通のパラメーター名は実際には共通の値であると想定しています-次のようになります。

 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]]

また

これらのパラメータをシステム全体にグローバルに設定するいくつかのオプションを設定できます。見上げるOptionsOptionsPattern。あなたはこのようなことをするでしょう:

まず、デフォルトのオプションを定義します。

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(最初の数回の反復で実際に存在するよりも多くの部分がリストにあると想定しています)が、これは主な問題に答えます。

于 2012-08-07T06:40:45.210 に答える