Asked by ahmed salah
on 22 May 2019

I plot x-y graph (Gaussian function) and want to get the x-axis value (will be two points in this case) at a certain y-axis value (half of the maximum)

I tried this but it didn't work:

clc;

clear all;

Fs = 150; % Sampling frequency

t = -0.5:1/Fs:0.5; % Time vector of 1 second

x = 1/(sqrt(2*pi*0.01))*(exp(-t.^2/(2*0.01)));

figure;

plot(t,x);

xi = 0.5*max(x) ;

z=find(x==xi);

ti = x(z) ;

hold on

plot(ti,xi,'*r')

Answer by Geoff Hayes
on 22 May 2019

Accepted Answer

ahmed - your code assumes that there is an x value that is identical to xi

z=find(x==xi);

This need not be true. And comparing doubles in this manner is not generally a good idea (due to precision, see Why is 0.3 - 0.2 - 0.1 (or similar) not equal to zero?). Usually a tolerance of some kind should be used (i.e. abs(x - y) < eps). In your case, a tolerance might not work as well because you will not know what that tolerance should be. You could try different values...the following seems to work for this dataset

z=find(abs(x-xi)< 0.10);

ti = t(z) ;

hold on

plot(ti,xi,'*r')

(Note how ti is obtained from the t array instead of x.)

Answer by Jan
on 22 May 2019

You cannot expect that any of the points at t = -0.5:1/Fs:0.5 is exactly 0.5*max(x). Remember that you evaluate x at some time steps only and rounding errors have to be considered also.

There is an analytical solution also, but you can use fzero to find the searched points. But you have to find the maximum value of the curve at first. Setting the derivative to 0 will help you.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.