我试图在与高斯fn非常相似的图上找到每个y值的两个x值。困难在于,即使高斯fn非常接近于零,我也需要能够找到y的几个值的x值。
由于是新用户,我无法发布图像,但是想到高斯函数,然后考虑峰值两侧接近零的区域。 fn非常接近于零的这部分是我需要找到给定y的x值的地方。
我尝试过的: 当fn是离散的时候:我已经尝试过interp1,但是由于许多值接近于零,我得到的错误是它不是严格单调递增的。
当我适合两个高斯时: 我使用fzero(fzero(function-yvalue))但是我得到了很多NaN的。这些可能来自我没有足够接近的'猜测'值?
有没有人对我有任何其他建议?或者如何改进我已经尝试过的东西?
谢谢大家
编辑: 我在下面添加了一张图片。我实际拥有的数据是蓝线,而拟合的eqn是红色。 eqn应该足够准确。 同样,我试图挑选出给定y的x值,其中y非常小(接近0)。
我尝试将函数分为左右半部分,用于插值和fzero方法。
无论如何,谢谢你的回复,我会看一下二分。
答案 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
曲线看起来很像你的情节。