2012-08-06 6 views
1

이 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의 함수를 어떻게 정의 할 수 있습니까?

+0

좋은 질문 mathematica의 트릭은 패턴을 사용하여 함수 프로그래밍을 수행하기 위해 패턴 기호 "_"를 사용하기 때문입니다. 숫자를 나누려면 mathematica 나 Split [] 함수에서 Partition [] 함수를 사용하십시오. "."을 사용하는 것을 기억하십시오. mathematica가 기호를 좋아하고 그것이 "."기호없이 실제 숫자와 같은지 알지 못하기 때문에 숫자를 진짜로 만들 수 있습니다. there –

+0

온라인 도움말에서'Piecewise'와'Switch'를 확인하십시오. 최소한'F' 정의에'Switch'를 사용할 수 있습니다. 당신은'e'를 정의하지 않았으므로 그렇게해야합니다. 하지만 그렇지 않은 경우 문제가 무엇인지 명확하지 않습니다. 예, 코드를 읽을 수있게 유지하려면's1'과 같은 보조 함수를 정의해야하지만, 아무 문제가 없습니다.다른 매개 변수를 전달하려면 각 함수를 재정 의하여 목록의 모든 매개 변수를 가져 오거나 전역으로 설정할 수있는 옵션을 지정해야합니다. 도움말에서'SetOptions'를 찾으십시오. – Verbeia

+0

@Verbeia 제 코드는'e'를 정의하지 않고 잘 돌아가는 것 같습니다. 나는'e'가 단지 반복되는 함수를 가리킬 것이라고 생각했다. 나의 경우에는'F'가 될 것이다. 이것이 올바른 이해입니까? –

답변

6

귀하의 중요한 문제는 당신이 당신의 보조 기능의 매개 변수의 큰 숫자를 가지고있다,하지만 큰 문자 기능 (F, GH 및 매스 매 티카의 방법으로 단일 자본 편지 쓰기 함수 이름으로는 나쁜 아이디어)는 세 개의 매개 변수만을 사용하며 보조 함수 (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]] 

또는

전체 시스템에 대해 이러한 매개 변수를 전역으로 설정하는 몇 가지 옵션을 설정할 수 있습니다. OptionsOptionsPattern을 찾으십시오. ,

먼저 기본 옵션 정의 : 당신은 같은 것을 할 것 (Extract의 사용에 확실히 뭔가 잘못도 있습니다

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

이 같은

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

그리고 쓰기 당신의 기능을 처음 몇 번의 반복에서 실제로 목록에있는 것보다 더 많은 부분이 목록에 있다고 가정합니다.) 그러나 이것은 주요 문제점에 대한 답입니다.

+0

첫 번째 옵션이 작동했습니다. 두 번째 경우, 아마도 그것을 이해하기 위해 더 많은 시간을 할애해야 할 것입니다. 나는 Extract의 사용에있어 잘못된 점을 보지 못했다. 내 코드가 작동하는 것 같습니다. 당신은 조금 설명 할 수 있겠습니까? –

+0

@MichaelC 내가 코드를 실행했을 때, 그 시점에서리스트의 'n-2'부분이있을 때 'n'번째 부분을 'Extract'하고 싶었던 것입니다. 그래서 그것은 n 번째 부분을 찾지 못하고 오류를 던졌습니다. – Verbeia

관련 문제