2011-09-26 41 views
8

Giả sử tôi đã kiểm tra danh tính bên dưới, cách triển khai danh tính đó trong Mathematica?cách triển khai quy tắc tích hợp?

(* {\[Alpha] \[Element] Reals, \[Beta] \[Element] Reals, \[Mu] \[Element] Reals, \[Sigma] > 0} *) 

Integrate[CDF[NormalDistribution[0, 1], \[Alpha] + \[Beta] x] PDF[ 
NormalDistribution[\[Mu], \[Sigma]], 
x], {x, -\[Infinity], \[Infinity]}] -> CDF[NormalDistribution[0, 1], (\[Alpha] + 
\[Beta] \[Mu])/Sqrt[1 + \[Beta]^2 \[Sigma]^2]] 

Trả lời

7

Hầu hết các cách để làm những gì bạn yêu cầu có lẽ sẽ đòi hỏi thêm quy tắc để tích hợp chức năng (như Integrate, CDF, PDF, vv), mà có thể không là một lựa chọn tốt. Dưới đây là một cách hơi nhẹ nhàng, sử dụng các trick Block - dựa vĩ mô:

ClearAll[withIntegrationRule]; 
SetAttributes[withIntegrationRule, HoldAll]; 
withIntegrationRule[code_] := 
    Block[{CDF, PDF, Integrate, NormalDistribution}, 
     Integrate[ 
     CDF[NormalDistribution[0, 1], \[Alpha]_ + \[Beta]_ x_] PDF[ 
      NormalDistribution[\[Mu]_, \[Sigma]_], x_], {x_, -\[Infinity], \[Infinity]}] := 
       CDF[NormalDistribution[0, 1], (\[Alpha] + \[Beta] \[Mu])/ 
        Sqrt[1 + \[Beta]^2 \[Sigma]^2]]; 
     code]; 

Đây là cách chúng ta có thể sử dụng nó:

In[27]:= 
withIntegrationRule[a=Integrate[CDF[NormalDistribution[0,1],\[Alpha]+\[Beta] x] 
    PDF[NormalDistribution[\[Mu],\[Sigma]],x],{x,-\[Infinity],\[Infinity]}]]; 
a 

Out[28]= 1/2 Erfc[-((\[Alpha]+\[Beta] \[Mu])/(Sqrt[2] Sqrt[1+\[Beta]^2 \[Sigma]^2]))] 

Khi quy tắc của chúng tôi không phù hợp, nó sẽ vẫn làm việc, tự động chuyển sang con đường đánh giá bình thường:

In[36]:= 
    Block[{$Assumptions = \[Alpha]>0&&\[Beta]==0&&\[Mu]>0&&\[Sigma]>0}, 
    withIntegrationRule[b=Integrate[CDF[NormalDistribution[0,1],\[Alpha]+\[Beta] x] 
     PDF[NormalDistribution[\[Mu],\[Sigma]],x],{x,0,\[Infinity]}]]] 

Out[36]= 1/4 (1+Erf[\[Alpha]/Sqrt[2]]) (1+Erf[\[Mu]/(Sqrt[2] \[Sigma])]) 

nơi tôi đặt \[Alpha]-0 trong các giả định để làm cho hội nhập thể trong một hình thức đóng cửa.

Một giải pháp thay thế khác có thể là triển khai trình tích hợp chuyên dụng của riêng bạn.

+0

Làm cách nào để có thể phát hành HoldAll sao cho nó sẽ hoạt động cho tích phân, giả sử, của '(CDF [NormalDistribution [0, 1], \ [Alpha] + \ [Beta] x] + CDF [NormalDistribution [0, 1 ], \ [Gamma] + \ [Delta] x]) PDF [NormalDistribution [\ [Mu], \ [Sigma]], x] '? Tôi đã thử 'Distribute' nhưng nó không hoạt động. –

+0

@ b.gatessucks Đây không phải là vấn đề của 'HoldAll'. Nếu tôi phát hành điều đó, tích phân bên trong macro của chúng tôi sẽ đánh giá thông qua tuyến đường bình thường của nó trước khi macro nhìn thấy nó, đó là những gì chúng tôi không muốn. Tuy nhiên, bên trong 'Block', tất cả các chức năng' Blocked' đều hoàn toàn quên mất chúng là gì. Vì vậy, trong giải pháp này, lựa chọn duy nhất là thêm một quy tắc khác vào 'Tích phân', chẳng hạn như' Integarte [x_ + y_, varlims _]: = Tích hợp [x, varlims] + Tích hợp [y, varlims] '. Cuối cùng, mặc dù, bạn sẽ kết thúc việc thực hiện lại toàn bộ 'Tích hợp', do đó, có thể có ý nghĩa để hạn chế những gì bạn muốn nhận được từ điều này, ngay từ đầu. –

Các vấn đề liên quan