이 Mathematica 코드가 있다고 가정합니다.이 코드의 출력은 실수입니다 (예 : x, y, z). 코드를 기반으로 x, y, z에서 실수 값 함수를 만드는 방법은 무엇입니까?함수 프로그래밍
코드에서 x, y, z 간의 간단한 관계를 설명하면이 함수를 직접 정의 할 수 있습니다. 요점은 주어진 코드가 매우 복잡한 블록 (또는 모듈)이라는 것입니다. 코드는 단순히 X, Y, Z를 합산 경우
예를 들어, 단순히 정의 할
f[x_,y_,z_]=x+y+z
어떤 I는 아래와 같은 매우 복잡한 예 않았다면 :
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 나 Split [] 함수에서 Partition [] 함수를 사용하십시오. "."을 사용하는 것을 기억하십시오. mathematica가 기호를 좋아하고 그것이 "."기호없이 실제 숫자와 같은지 알지 못하기 때문에 숫자를 진짜로 만들 수 있습니다. there –
온라인 도움말에서'Piecewise'와'Switch'를 확인하십시오. 최소한'F' 정의에'Switch'를 사용할 수 있습니다. 당신은'e'를 정의하지 않았으므로 그렇게해야합니다. 하지만 그렇지 않은 경우 문제가 무엇인지 명확하지 않습니다. 예, 코드를 읽을 수있게 유지하려면's1'과 같은 보조 함수를 정의해야하지만, 아무 문제가 없습니다.다른 매개 변수를 전달하려면 각 함수를 재정 의하여 목록의 모든 매개 변수를 가져 오거나 전역으로 설정할 수있는 옵션을 지정해야합니다. 도움말에서'SetOptions'를 찾으십시오. – Verbeia
@Verbeia 제 코드는'e'를 정의하지 않고 잘 돌아가는 것 같습니다. 나는'e'가 단지 반복되는 함수를 가리킬 것이라고 생각했다. 나의 경우에는'F'가 될 것이다. 이것이 올바른 이해입니까? –