在matlab中进行样条插值以预测值

在matlab中进行样条插值以预测值,matlab,interpolation,Matlab,Interpolation,我的情况如下图所示: 此图是两个向量的结果: fi = [41.309180589278, 41.8087915220215, 42.8081880760916, ... 43.8078181874395, 44.8076823745539, 45.8077808710707, 46.3079179803177] m = [1.00047608139868, 1.00013712198767, 0.999680989440986, ... 0.99952419548782

我的情况如下图所示:

此图是两个向量的结果:

fi = [41.309180589278, 41.8087915220215, 42.8081880760916, ...
      43.8078181874395, 44.8076823745539, 45.8077808710707, 46.3079179803177]
m = [1.00047608139868, 1.00013712198767, 0.999680989440986, ...
     0.999524195487826, 0.999671686649694, 1.00012913666266, 1.00047608139868]
我需要得到
fi
的值,其中
m
等于1。所以大约是42.2和42.5

我尝试过样条曲线插值:

xq = [fi(1):0.25:fi(7)];
vq1 = interp1(fi,m,xq);
[fi1, fi2] = interp1(m, xq, 1)

但这是行不通的。有人能帮我解决这个问题吗?

找到零交叉点的一种方法是“将图形转向一边”,让
fi
成为
m
的函数,然后插值找到
m=0
。但是
interp1
要求
m
输入是单调的,这不是。事实上,此函数对每个
m
都有两个不同的值

MATLAB知道,它可以在数值上找到函数的零交叉点。它需要一个函数作为输入。我们可以使用
interp1
定义一个匿名函数,该函数为
x
的任何值返回
m-1
。这里,
x
fi
f(x)
m
定义:

fi = [41.309180589278, 41.8087915220215, 42.8081880760916, ...
      43.8078181874395, 44.8076823745539, 45.8077808710707, 46.3079179803177];
m = [1.00047608139868, 1.00013712198767, 0.999680989440986, ...
     0.999524195487826, 0.999671686649694, 1.00012913666266, 1.00047608139868];
fun = @(x)interp1(fi,m,x)-1;
x1 = fzero(fun,42)
x2 = fzero(fun,46)
这给了我:

x1 =  42.109
x2 =  45.525
注意,我们需要知道这两个零的大致位置。据我所知,没有简单的方法可以解决这个问题。如果知道有两个零交叉点,以及函数的一般形状,可以找到局部最小值:

[~,fimin] = min(m);
fimin = fi(fimin);
x1 = fzero(fun,[fi(1),fimin])
x2 = fzero(fun,[fimin,fi(end)])
然后找到每个端点和局部最小值之间的零交点:

[~,fimin] = min(m);
fimin = fi(fimin);
x1 = fzero(fun,[fi(1),fimin])
x2 = fzero(fun,[fimin,fi(end)])

您需要使用匿名函数,以便可以将其他参数传递给interp1

试试这个

fi = [41.309180589278, 41.8087915220215, 42.8081880760916, ...
      43.8078181874395, 44.8076823745539, 45.8077808710707, 46.3079179803177];
m = [1.00047608139868, 1.00013712198767, 0.999680989440986, ...
     0.999524195487826, 0.999671686649694, 1.00012913666266, 1.00047608139868];

fzero(@(x) 1-interp1(fi,m,x), 43)
fzero(@(x) 1-interp1(fi,m,x), 45)

43和45是fzero的x初始化。您需要运行fzero两次才能找到这两个解决方案。

您是否尝试过
fzero
?我现在尝试过,如下所示:xq=[fi(1):0.25:fi(7)];vq1=interp1(fi,m,xq);[F1,F2]=fzero(vq1,0),我得到vq1是未定义的函数。那么我应该如何定义函数呢?我在这里查看了一下:但是没有找到任何结果。对于最初的猜测,您可以使用所有点对
fi(a)
fi(b)
,其中
a和
b是连续的,带有
符号(1-m(a))=-符号(1-m(b))
,即交叉点。您可以使用类似于
[false,sign(1-m(1:end-1))===-sign(1-m(2:end)]
的矢量化方法找到这些点。然后您可以处理根数未知的类似问题。您可以从交叉点的索引中免费获得近似位置。