matlab中的样条插值以预测值

Spline interpolation in matlab in order to predict value

我的情况如下图所示:

此图是两个向量的结果:

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)

但这不起作用。有人可以帮我解决这个问题吗?

找到过零的一种方法是 "turn the graph sideways",使 fi 成为 m 的函数,然后进行插值以找到 m=0。但是 interp1 要求 m 输入是单调的,但事实并非如此。事实上,这个函数每个 m.

都有两个不同的值

MATLAB 知道 fzeros function,它以数值方式找到函数的零交叉点。它需要一个函数作为输入。我们可以使用 interp1 定义匿名函数,其中 returns m-1 用于 x 的任何值。这里,xfi 定义,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)])

您需要使用匿名函数,以便将额外的参数传递给 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 两次才能找到两个解决方案。