我有一个函数V,它是从两个输入(X,Y)计算出来的。由于计算要求很高,我只是在点网格上执行它,并希望依赖于2d线性插值。我现在想要将该函数反转为固定的Y.所以基本上我的出发点是:
X = [1,2,3];
Y = [1,2,3];
V =[3,4,5;6,7,8;9,10,11];
当然,在(X,Y)的任意组合中很容易获得V,例如:
Vq = interp2(X,Y,V,1.8,2.5)
给出
Vq =
8.3000
但是如何使用2d线性插值找到给定V和Y的X?我将不得不多次执行此任务,因此我需要一个快速且易于实施的解决方案。
感谢您的帮助,我们非常感谢您的努力。
P上。
答案 0 :(得分:1)
如果不是必须找到x和y两者,但是给出了其中一个,则该问题减少到仅在1个方向(即在x方向上)找到最小值。一个简单的方法是在一个问题中制定这个问题,这个问题可以通过优化例程(例如fminsearch
)来缩小。因此,我们定义函数f
,它返回值Vq
和插值结果之间的差异。在我们给出初始猜测x
之后,我们尝试找到最小化这种差异的x0
。根据最初的猜测,结果将是我们正在寻找的:
% Which x value to choose if yq and Vq are fixed?
xq = 1.8; % // <-- this one is to be found
yq = 2.5; % // (given)
Vq = interp2(X,Y,V,xq,yq); % // 8.3 (given)
% this function will be minimized (difference between Vq and the result
% of the interpolation)
f = @(x) abs(Vq-interp2(X, Y, V, x, yq));
x0 = 1; % initial guess)
x_opt = fminsearch(f, x0) % // solution found: 1.8
答案 1 :(得分:0)
Nras,非常感谢你。在此期间我做了其他事情:
function [G_inv] = G_inverse (lambda,U,grid_G_inverse,range_x,range_lambda)
for t = 1:size(U,1)
for i = 1:size(U,2)
xf = linspace(range_x(1), range_x(end),10000);
[Xf,Yf] = meshgrid(xf,lambda);
grid_fine = interp2(range_x,range_lambda,grid_G_inverse',Xf,Yf);
idx = find (abs(grid_fine-U(t,i))== min(min(abs(grid_fine-U(t,i))))); % find min distance point and take x index
G_inv(t,i)=xf(idx(1));
end
end
G_inv应该包含x,U在上面的例子中是yq,grid_G_inverse包含Vq。 range_x和range_lambda是网格轴的对应矢量。您对此解决方案有何看法,与您的解决方案相比如何?我猜我的速度更快但准确度更低。然而,Spped是我的代码中的一个主要问题。