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

时间:2018-08-23 21:54:57

标签: matlab interpolation

我的情况如下图所示:

enter image description here

此图是两个向量的结果:

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等于1的值m。因此大约是42.2和42.5。

我试图进行样条插值:

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

但这不起作用。有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

找到零交叉点的一种方法是“横向翻转图形”,使fim的函数,然后内插以找到m=0。但是interp1要求m输入是单调的,不是单调的。实际上,每个m的此函数都有两个不同的值。

MATLAB知道fzeros function,它可以用数字找到函数的零交叉。它需要一个函数作为输入。我们可以使用interp1定义一个匿名函数,该函数针对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)])

答案 1 :(得分:0)

您需要使用匿名函数,以便可以将其他参数传递给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来找到两个解决方案。