integration of a piecewise function
조회 수: 3 (최근 30일)
이전 댓글 표시
Can anyone help me understand why
integral(@(mu) (1.0+0.0*mu).*(mu>0)+(1-exp(1.0./mu)).*(mu<0),0,1)
gives a "NaN", while
integral(@(mu) (1.0+0.0*mu).*(mu>0)+(1-(1.0./mu)).*(mu<0),0,1)
gives the correct answer "1.0"?
It's bugging me for so long.
Background, I started with a two variate function
psi_MMS =@(x,mu) (1.0+0.0*x+0.0*mu).*(mu>0) + (1-exp((Tau-x)./(mu+1e-16))).*(mu<0);
And I wanted to integrate it over mu to get a function of x:
phi0_MMS =@(x) integral(@(mu) psi_MMS(x,mu), -1,1);
Thanks!
댓글 수: 0
답변 (1개)
Sarah Mohamed
2017년 9월 14일
It looks like NaN values are generated in the first function when you try to multiply -INF and logical 0’s.
For ease of demonstration, let me go ahead and create a handle for the first function as follows:
f1 = @(mu) (1.0+0.0*mu).*(mu>0)+(1-exp(1.0./mu)).*(mu<0);
Let me also go ahead and create a range of values for “mu”, 0.1, 0.01, 0.001, etc, that are close to 0:
mu = 10.^(-1*[1:10]);
If I plug these values into f1, I get the following:
>> f1(mu)
ans =
1 1 NaN NaN NaN NaN NaN NaN NaN NaN
Let me try to localize the problem slightly more:
>> (1-exp(1.0./mu))
ans =
1.0e+43 *
-0.0000 -2.6881 -Inf -Inf -Inf -Inf -Inf -Inf -Inf -Inf
At mu = 0.001 and onwards, we find that "exp(1/mu)" evaluates to INF.
Let me now add in the piecewise part of the expression. “mu<0” should give a vector of logical 0’s:
>> (1-exp(1.0./mu)).*(mu<0)
ans =
0 0 NaN NaN NaN NaN NaN NaN NaN NaN
In summary, multiplying INF or -INF by a logical 0 (or just zero, for that matter) evaluates to NaN. As a quick check, we can confirm this quickly via:
>> inf*logical(0)
ans =
NaN
And as a final sanity check, let's try the original integration, but setting the lower limit to 0.01:
>> integral(f1, 0.01, 1)
ans =
0.9900
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Multidimensional Arrays에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!