在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)]
的矢量化方法找到这些点。然后您可以处理根数未知的类似问题。您可以从交叉点的索引中免费获得近似位置。