返回双三次插值的系数

时间:2017-02-25 19:48:41

标签: matlab interpolation

假设我有一个函数z=f(x,y)。我在广场[0:3,0:3]x=[0,1,2,3] y=[0,1,2,3])中以16分计算出来。现在我想做双三次插值。但结果是,我需要这种插值的系数。

interp2让我计算预定义搭配点中的插值结果,但它本身并不返回系数。

spline仅适用于1D功能。

知道如何获得双三次插值系数? 我需要系数,因为之后我打算将它们用于数值解算器(我需要我的函数的解析表达式)。

1 个答案:

答案 0 :(得分:1)

我刚写下了返回系数的函数。假设16个值来自(x = -dx,0,dx,2dx)和(y = -dx,0,dx,2dx)。我还编写了函数'Deriv',它使我的数值函数的衍生物相对于x,y,xy:

function [out]=Deriv(in,str,dx)
    switch str
    case 'x'
        out=(circshift(in,[0 -1])-circshift(in,[0 1]))./(2*dx);
    case 'y'    
        out=(circshift(in,[-1 0])-circshift(in,[1 0]))./(2*dx);
    case 'xy'
        out=(circshift(in,[-1 -1])+circshift(in,[1 1])-circshift(in,[-1 1])-circshift(in,[1 -1]))./(4*dx*dx);
    end

function out=bl(in1,in2)
    out=[in1^3, in1^2, in1, 1,in2*[in1^3, in1^2, in1, 1], in2^2*[in1^3, in1^2, in1, 1]...
    in2^3*[in1^3, in1^2, in1, 1]];
end

function out=blx(in1,in2)
    out=[3*in1^2, 2*in1, 1, 0,in2*[3*in1^2, 2*in1, 1, 0], in2^2*[3*in1^2, 2*in1, 1, 0]...
    in2^3*[3*in1^2, 2*in1, 1, 0]];
end

function out=bly(in1,in2)
    out=[0,0,0,0,[in1^3, in1^2, in1, 1], 2*in2*[in1^3, in1^2, in1, 1]...
    3*in2^2*[in1^3, in1^2, in1, 1]];
end


function out=MyBicubic(in,dx)
A=zeros(16,16); C=zeros(16,1);
    A(1,:)=bl(0,0); C(1)=in(2,2);
    A(2,:)=bl(dx,0); C(2)=in(2,3);
    A(3,:)=bl(0,dx); C(3)=in(3,2);
    A(4,:)=bl(dx,dx); C(4)=in(3,3);
    A(5,:)=blx(0,0);  temp=Deriv(in,'x',dx); C(5)=temp(2,2); 
    A(6,:)=blx(dx,0); C(6)=temp(2,3);
    A(7,:)=blx(0,dx); C(7)=temp(3,2);
    A(8,:)=blx(dx,dx); C(8)=temp(3,3);
    A(9,:)=bly(0,0);   temp=Deriv(in,'y',dx); C(9)=temp(2,2);
    A(10,:)=bly(dx,0);  C(10)=temp(2,3);
    A(11,:)=bly(0,dx);  C(11)=temp(3,2);
    A(12,:)=bly(dx,dx); C(12)=temp(3,3);
    A(13,:)=blxy(0,0);   temp=Deriv(in,'xy',dx); C(13)=temp(2,2);
    A(14,:)=blxy(dx,0);  C(14)=temp(2,3);
    A(15,:)=blxy(0,dx);  C(15)=temp(3,2);
    A(16,:)=blxy(dx,dx); C(16)=temp(3,3);
    out=A\C;
end