2009-10-16 4 views
3

저는 (x, y)에서 다 변수 분포를 알고있는 함수를 가지고 있습니다. 그리고 mathematica는 한계 분포를 만들 때 수치 안정성 문제가 있습니다.^나는 결과가 배포해야합니다 알고 있기 때문에, 난 그냥 전자를 추출하고 싶습니다 0.e^(154.88-0.5x^2)mathematica에서 분포 생성하기

: 예를 들어

는 Y를 따라 주 변화하면 다음을 산출 (-.5x^2) 나 자신을 재 정규화해라. 또는 mathematica가 다 변수 함수를 사용하고 어떻게 든 그것을 확률 분포로 지정할 수 있다면 더 좋을 것입니다.

어쨌든, 위의 두 솔루션 중 하나를 프로그래밍 방식으로 구현하는 방법을 아는 사람이 있습니까?

+0

더 완전한 문제의 진술과 그것을 해결하는 접근 방식을 볼 유용 할 것이다. 그러나 변수에 대한 주 변화는 밀도를 대수 양식으로 사용하는 경우 Mathematica가 수행 할 수있는 통합을 통해 이루어집니다. 또는 주 변화가 소외 대상이 될 변수에 대해 전혀 알지 못하는 척도로 간주하는 것이 유용 할 수 있습니다. – Microserf

답변

1

좋아, 다음은 내가 말하는 의미의 예입니다. 나는 다음과 같은 2D 유통 있다고 가정 :

Dist = 
3.045975040844157` E^(-(x^2/2) - y^2/ 
2) (-1 + E^(-1.` (x + 0.1` y) UnitStep[x + 0.1` y]))^2 

을 그리고 난 티카 답변을 제공하지 않습니다, 또는 적어도 내 컴퓨터에 꽤 오랫동안 그렇게하지 않습니다

Integrate[Dist, {y, -Infinity, Infinity}] 

에 시도합니다. 제안?

편집 : 그래, 실제로 그렇긴하지만 4GB 램을 장착 한 인텔 i5에서 5 분이 걸립니다. Mathematica에 내장 된 배포 유형을 활용할 수 있기를 바라고 있어요. (단 하나의 변수 인 것 같지만 오직) 자신의 RandomReal [dist]을 사용하십시오. Mathematica가이 2D 함수를 배포판으로 지정하고 RandomRealVector [dist]를 호출 할 수 있다면 최선을 다할 수 있습니다.

1

ProbabilityDistribution Dist 기능이 다소 맛이 있지만 다 변수 기능을 사용합니다.

또한 사용자 정의 다 변수 배포본은 현재 RandomVariate (약간 더 다양한 V8 버전 RandomReal/RandomInteger)과 함께 작동하지 않는 것으로 보입니다. 단 변량 배포판이 작동합니다. WRI에 버그 보고서를 제출했습니다.

1

글쎄, 티카의 상징적 표현을 다루는, 그것은 대략적인 숫자, 정확한 일을 계속 즉 않도록하는 것이 가장 좋습니다 :

In[56]:= cvr = 
First[Solve[{10 x + y == u, (10 y - x)/101 == v}, {x, y}]] 

Out[56]= {x -> (10 u)/101 - v, y -> u/101 + 10 v} 
: 문제를 공격하기 위해

In[36]:= pdf = PiecewiseExpand[Rationalize[E^(-(x^2/2) - y^2/2)* 
     (-1 + E^(-1.*(x + 0.1*y)*UnitStep[x + 0.1*y]))^2], 
    Element[{x, y}, Reals]] 

Out[36]= Piecewise[{{E^(-2*x - x^2/2 - y/5 - y^2/2)*(-1 + 
     E^(x + y/10))^2, 10*x + y >= 0}}, 0] 

를,이 변수를 변경하는 것이 좋습니다

In[42]:= jac = Simplify[Det[Outer[D, {x, y} /. cvr, {u, v}]]] 

Out[42]= 1 
: 계수가 코비안 있도록 선택되었는지

공지 화합 인 지금 변수 'U'이고 'v에'

In[45]:= npdf = FullSimplify[jac*pdf /. cvr] 

Out[45]= Piecewise[{{E^(-(u/5) - u^2/202 - (101*v^2)/2)*(-1 + 
     E^(u/10))^2, u >= 0}}, 0] 

는 독립적 인 : 변수의 변경 후 414,, 당신은 밀도가 제품에 factorizes 것을 알 수있다. 'v'변수는 NormalDistribution[0, 1/101]이고 'u'변수는 좀 더 복잡하지만 이제는 ProbabilityDistribution으로 처리 할 수 ​​있습니다.{u,v}{x,y} 사이의 관계를 알고 있기 때문에

dist = ProductDistribution[NormalDistribution[0, 1/101], 
    ProbabilityDistribution[updf, {u, 0, Infinity}]]; 

{x,y}의 생성이 variates

은 간단하다 :

XYRandomVariates[len_] := 
RandomVariate[dist, len].{{-1, 10}, {10/101, 1/101}} 

In[53]:= updf = 
Refine[npdf/nc, u >= 0]/PDF[NormalDistribution[0, 1/Sqrt[101]], v] 

Out[53]= (E^(-(u/5) - u^2/202)*(-1 + E^(u/10))^2*Sqrt[2/(101*Pi)])/ 
    (1 - 2*E^(101/200)*Erfc[Sqrt[101/2]/10] + 
    E^(101/50)*Erfc[Sqrt[101/2]/5]) 

그래서 당신은 지금 벡터 {u,v}의 공동 분배를 정의 할 수 있습니다 축적 된 지식을 TransformedDistribution :을 사용하여 캡슐화 할 수 있습니다.

origdist = 
    TransformedDistribution[{(10 u)/101 - v, 
    u/101 + 10 v}, {Distributed[v, NormalDistribution[0, 1/101]], 
    Distributed[u, ProbabilityDistribution[updf, {u, 0, Infinity}]]}]; 

예컨대 :

In[68]:= Mean[RandomVariate[origdist, 10^4]] 

Out[68]= {1.27198, 0.126733}