寻找方程的零点可以等价于寻找两个曲线的交点,因此这里放在一起进行讨论。
思路为:首先对应函数值y0,对自变量x进行插值,找出给定区间内所有满足f(x)=y0的x值,再令y0=0,即可得到方程的零点或者两曲线的交点横坐标。
首先必须找出y=y0直线上下交错排列的所有数据点,即(xk,yk)和(xk+1,yk+1),在此区间内认为函数y为单调的,可以用逻辑运算加移位来实现。代码如下:
function [x0,y0]=invinterp(x,y,y0)
x=x(:);y=y(:);
n=numel(y);
if y0max(y)
x0=[];y0=[];%不存在则直接退出
else
below=y
above=y>=y0;
kth=(below(1:n-1)&above(2:n)) | (above(1:n-1)&below(2:n));
kp1=[false;kth];
alpha=(y0-y(kth))./(y(kp1)-y(kth));
x0=alpha.*(x(kp1)-x(kth))+x(kth);
y0=repmat(y0,size(x0));
end
以上函数实现给定x,y和y0的前提下利用线性插值找出对应y0的x值x0。
于是利用上面的函数即可实现寻找方程的零点或者曲线的交点。实例如下:
x=linspace(0,10);
y=sin(x);
z=2*cos(3*x);
x0=invinterp(x,y-z,0);
y0=interp1(x,y,x0);
plot(x,y,x,z,x0,y0,'o')
legend('曲线1:y=sin(x)','曲线2:y=2cos(3x)','交点')
http://liufanghit.blog.163.com/blog/static/402192201111141341151/