我的情况如下图所示:
此图是两个向量的结果:
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)
但这不起作用。有人可以帮我吗?
答案 0 :(得分:3)
找到零交叉点的一种方法是“横向翻转图形”,使fi
是m
的函数,然后内插以找到m=0
。但是interp1
要求m
输入是单调的,不是单调的。实际上,每个m
的此函数都有两个不同的值。
MATLAB知道fzeros
function,它可以用数字找到函数的零交叉。它需要一个函数作为输入。我们可以使用interp1
定义一个匿名函数,该函数针对m-1
的任何值返回x
。在这里,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)])
答案 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来找到两个解决方案。