How can I write this exponential function in matlab?

 채택된 답변

Walter Roberson
Walter Roberson 2018년 3월 28일
f = @(x) exp(-x.^2/4) .* cos(2*pi*x);
g = @(x) exp(x) .* (x <= 0) + sin(2*pi*x)./max(x,realmin) .* (x>0);

댓글 수: 3

thank you so much Walter
please can you explain the meaning of : max(x,realmin) in your code
Suppose x is 0 exactly. Then sin(2*pi*x)/x would be 0/0 which would be NaN. The (x>0) after that would multiply the NaN by 0, but NaN times anything is NaN, so you cannot use logical computations like this to mask out a NaN result.
Instead you need to avoid the NaN result. One way of doing that is to detect that you are dividing by 0 and to substitute a different value that is not 0.
The expression max(x,realmin) is equivalent to a vectorized version of
if x <= realmin
temp = realmin;
else
temp = x;
end
realmin is about 1E-308 -- a very small value but not 0. So max(x,realmin) substitutes the positive value realmin for all negative and 0 values, which is enough to prevent division by 0.
Another way of coding it would have been
sin(2*pi*x)./(x + (x == 0)) .* (x>0);
x == 0 would be 0 for all non-zero x and so would not change any x that was not 0. x == 0 would be 1 for x of 0, so for the case of any non-zero value (x+(x==0)) would be the same as the value and for zero exactly it would be 1, thereby preventing division by 0.

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

추가 답변 (1개)

Rajulapati Naveen
Rajulapati Naveen 2021년 11월 23일

0 개 추천

f = @(x) exp(-x.^2/4) .* cos(2*pi*x); g = @(x) exp(x) .* (x <= 0) + sin(2*pi*x)./max(x,realmin) .* (x>0);

카테고리

도움말 센터File Exchange에서 Logical에 대해 자세히 알아보기

질문:

2018년 3월 28일

댓글:

2021년 11월 23일

Community Treasure Hunt

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

Start Hunting!

Translated by