My piecewise function becomes NaN

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 comentarios

R.G.
R.G. el 31 de Ag. de 2019
Hello. As I can see you want to evalute integral numerically with integrand function myfunc(arg) and limits [itta, inf], where itta - is some variable and inf - means infinity. If so, it's not correct because numerical integration implies finite number of operations (in your case matlab must show warning message: 'Reached the limit...').
Could you provide more information about the task?
Adam Danz
Adam Danz el 31 de Ag. de 2019
Editada: Adam Danz el 31 de Ag. de 2019
What are myFun, a, and b? I'm assuming your question is why you're getting -inf within the integral.
Shailee Yagnik
Shailee Yagnik el 1 de Sept. de 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 el 1 de Sept. de 2019
See walter's answer to understand why you're getting a NaN and see his comment(s) under his answer.

Iniciar sesión para comentar.

 Respuesta aceptada

Walter Roberson
Walter Roberson el 31 de Ag. de 2019

1 voto

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 comentarios

Shailee Yagnik
Shailee Yagnik el 1 de Sept. de 2019
Editada: Shailee Yagnik el 1 de Sept. de 2019
If I use the piecewise function ,I get the following error :
Undefined function 'piecewise' for input arguments of type 'double'.
This is what i use the function as:
Nz2=piecewise(t1n(j)>0 & t1d(j)==0,integral(),t1n(j)>0 &t1d(j) > 0,1);
where t1n(j) and t1d(j) are a fixed value for a particular jth value in loop.
Please help.
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 el 1 de Sept. de 2019
Thanks! It worked for my problem.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Performance and Memory en Centro de ayuda y File Exchange.

Preguntada:

el 31 de Ag. de 2019

Comentada:

el 1 de Sept. de 2019

Community Treasure Hunt

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

Start Hunting!

Translated by