Matlab反向2D插值interp2

3

我有一个由两个输入(X,Y)计算出的函数V。由于计算非常复杂,我只在点网格上执行它,并希望依靠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

但是,我如何使用二维线性插值找到给定V和Y的X值?由于我需要经常执行此任务,因此需要一个快速易用的解决方案。

感谢您的帮助,非常感激您的努力。

P.


3
你的“函数”V = F(X,Y)是单射吗?即,对于给定的V_q是否只有一对(X_q, Y_q)可以使得F(X_q, Y_q) == V_q?否则将很难获得正确的一对。对于大于“max(V)”和小于“min(V)”的V_q会发生什么?无论如何:一个技巧性的方法是,在(非常)细的网格上评估数据。然后找到最近距离min(abs(V_fine_grid-Vq)),所需值将接近于矩阵中该位置。 - Nras
2个回答

1

使用额外信息进行编辑

如果不需要同时找到x和y,而只给出它们中的一个,这个问题就可以简化为只在一个方向(即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

谢谢,但似乎我们在这里尝试找到给定固定Z的x和y。我只需要在给定Z和Y的情况下找到x。以下是一些更多信息,您可能会发现有用:在给定Y的情况下,Z在X上(不是单调地)增加。Z始终在[0,1]范围内。 - InfiniteVariance
@user3575894,你的问题大大简化了,可以通过我写的最后一个代码块来解决。看一下吧! - Nras
非常感谢您,我以不同的方式解决了这个问题,请看下面,我很乐意和您讨论。 - InfiniteVariance

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 是网格轴的相应向量。您对这个解决方案有什么看法,与您的解决方案相比如何?我猜我的更快但不够准确。然而,在我的代码中速度是一个主要问题。


我不确定。为什么你现在使用不同的变量名?你内部循环的前三行可以移动到两个循环之外(“grid_fine”在循环中不会改变)。此外,我认为可以避免两个循环,请查看我的答案中的编辑以获取非循环细网格方法。结果是否相同(即几乎相同)?至于速度:我不知道。你有检查速度吗? - Nras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接