Filter löschen
Filter löschen

My piecewise function becomes NaN

2 Ansichten (letzte 30 Tage)
Shailee Yagnik
Shailee Yagnik am 31 Aug. 2019
Kommentiert: Shailee Yagnik am 1 Sep. 2019
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 Kommentare
Shailee Yagnik
Shailee Yagnik am 1 Sep. 2019
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 am 1 Sep. 2019
See walter's answer to understand why you're getting a NaN and see his comment(s) under his answer.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 31 Aug. 2019
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 Kommentare
Walter Roberson
Walter Roberson am 1 Sep. 2019
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 am 1 Sep. 2019
Thanks! It worked for my problem.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by