My piecewise function becomes NaN

조회 수: 4 (최근 30일)
Shailee Yagnik
Shailee Yagnik 2019년 8월 31일
댓글: Shailee Yagnik 2019년 9월 1일
In the function below my integral becomes -inf when b is nonzero.
I think because of that my ans yields NaN instead of 2. How do I solve this problem?
Nz2=@(a,b) ((b==0)*integral(myfun,itta,inf)+(a>0 & b>0)*2)
Ans=Nz2(a,b)
  댓글 수: 4
Shailee Yagnik
Shailee Yagnik 2019년 9월 1일
Hi, the following is my task,
i want to compute
output=v4*Nz2(t1n,t1d)
where
Nz2=@(a,b) ((a>0&b==0)*q+(a==0&b==0)+(a>0&b>0));
t1n=qfunc(some variable value that changes & depends on a variable x that I define)
t1d=qfunc(some variable value that changes & depends on a variable x that I define)
q = some finite interval when b=0 and it equals to -Inf when b is non zero
So when b is non zero i get the ouput as NaN which is wrong.
My output should be a finite value
Adam Danz
Adam Danz 2019년 9월 1일
See walter's answer to understand why you're getting a NaN and see his comment(s) under his answer.

댓글을 달려면 로그인하십시오.

채택된 답변

Walter Roberson
Walter Roberson 2019년 8월 31일
You indicate that your integral becomes infinite when b is non-zero. You try to compensate for that by using (b==0) * integral() thinking that it will "select" the integral() calculation when b is 0 and thinking that otherwise it will skip it. But that is not what happens. When you calculate (b==0)*integral() then both sides are calculated no matter what the value of b is. When b is 0 then that is fine, as you get (0==0)*finite_value which is the finite_value. But when b is non-zero then you get (nonzero==0)*infinite_value which is 0*infinite_value which is NaN.
You cannot use the logical_condition*expression calculation form when the expression can be infinite or nan in any situation where the logical_condition is false.
To deal with this, you will either need to use the symbolic toolbox piecewise() function, or you will need to write a small function that uses if or logical indexing so that you do not calculate the integral in the b ~= 0 case.
  댓글 수: 3
Walter Roberson
Walter Roberson 2019년 9월 1일
Nz2=piecewise( sym(t1n(j))>0 & sym(t1d(j))==0,integral(), sym(t1n(j))>0 & sym(t1d(j)) > 0, 1, 0);
The extra 0 is needed for the cast where t1n(j) <= 0 or t1n(j) < 0
Shailee Yagnik
Shailee Yagnik 2019년 9월 1일
Thanks! It worked for my problem.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by