接近极限时,查找给定y的x值

时间:2015-05-06 02:19:17

标签: matlab

我试图在与高斯fn非常相似的图上找到每个y值的两个x值。困难在于,即使高斯fn非常接近于零,我也需要能够找到y的几个值的x值。

由于是新用户,我无法发布图像,但是想到高斯函数,然后考虑峰值两侧接近零的区域。 fn非常接近于零的这部分是我需要找到给定y的x值的地方。

我尝试过的: 当fn是离散的时候:我已经尝试过interp1,但是由于许多值接近于零,我得到的错误是它不是严格单调递增的。

当我适合两个高斯时: 我使用fzero(fzero(function-yvalue))但是我得到了很多NaN的。这些可能来自我没有足够接近的'猜测'值?

有没有人对我有任何其他建议?或者如何改进我已经尝试过的东西?

谢谢大家

enter image description here

编辑: 我在下面添加了一张图片。我实际拥有的数据是蓝线,而拟合的eqn是红色。 eqn应该足够准确。 同样,我试图挑选出给定y的x值,其中y非常小(接近0)。

我尝试将函数分为左右半部分,用于插值和fzero方法。

无论如何,谢谢你的回复,我会看一下二分。

1 个答案:

答案 0 :(得分:0)

拟合高斯似乎是无效的,因为它与真实数据的偏差(在x坐标中)是显着的。

由于您的数据已经显示为数字向量y,因此直截了当的find(y<y0)似乎已足够。这是一个示例代码,其中y值是从扰动的高斯产生的。

x = 0:1:700;
y = 2000*exp(-((x-200)/50).^2 - sin(x/100).^2);     %  imitated data
plot(x,y)                

y0 = 1e-2;                                          % the y-value to look for

i = min(find(y>y0));                                % first entry above y0
if i == 1             
    x1 = x(i);
else
    x1 = x(i) - y(i)*(x(i)-x(i-1))/(y(i)-y(i-1));   % linear interpolation
end

i = max(find(y>y0));                                % last entry above y0 
if i == numel(y) 
    x2 = x(i);
else
    x2 = x(i) - y(i)*(x(i)-x(i+1))/(y(i)-y(i+1));   % linear interpolation
end

fprintf('Roots: %g, %g \n', x1, x2)

输出:Roots: 18.0659, 379.306

曲线看起来很像你的情节。

data