如何在matlab中求向量函数的零点?fzero似乎只适用于分析函数

如何在matlab中求向量函数的零点?fzero似乎只适用于分析函数,matlab,Matlab,我想找到作为向量给出的函数的零点。它来自ode45 向量y(x)不一定在y=0轴上有点。如果函数从上方穿过y=0,下面的代码将起作用,但如果它是相切的,该怎么办。矢量类似于转储正弦波,但不完全相同。用七次多项式拟合只适用于半个周期 yx = find(y>0,1,'first'); % Choose 1st ‘y’ Point >0 y0 = 0; x0 = interp1(y(yx-1:yx),x(yx-1:yx),y0); % Find

我想找到作为向量给出的函数的零点。它来自ode45

向量y(x)不一定在y=0轴上有点。如果函数从上方穿过y=0,下面的代码将起作用,但如果它是相切的,该怎么办。矢量类似于转储正弦波,但不完全相同。用七次多项式拟合只适用于半个周期

yx = find(y>0,1,'first');                   % Choose 1st ‘y’ Point >0
y0 = 0;
x0 = interp1(y(yx-1:yx),x(yx-1:yx),y0);     % Find Zero Cross Between `enter code here`Bracket Points

如果您的数据非常干净,则查找函数更改符号或达到零的位置:

ix_solutions = find(y(1:end-1) .* y(2:end) <=0 );

你能不能不直接使用
ode45
来获得你的过零点?你说得对,
fzero
是一个真正的根解算器,需要函数实际跨越零。相切是不够的。如果是这种情况,您可以尝试
fsolve
。。。。或者
查找(符号(y(1:end-1))~=符号(y(2:end))
以避免乘法。
signs = sign(y(:));
ix_zeros     = find(signs == 0);
ix_crosses   = find(abs(diff(signs)) == 2);
ix_solutions = [ix_zeros; ix_crosses];