2017-02-25 6 views
0

私は関数z=f(x,y)を持っているとします。私は、例えば、[0:3,0:3]x=[0,1,2,3]y=[0,1,2,3])の16点で計算しました。今私はバイキュービック補間をしたいです。しかし、結果として、私はこの補間の係数が必要です。バイキュービック補間の係数を返す

interp2私は、定義済みのコロケーションポイントで補間の結果を計算できますが、係数自体は返されません。

splineは1D機能でのみ機能します。

どのように私はバイキュービック補間の係数を得ることができますか? 私は係数を必要とします。それ以降は数値ソルバーのために使用する予定です(そして私の関数の解析式が必要です)。

答えて

0

係数を返す関数を書き留めました。 16値が(x = -dx、0、dx、2dx)と(y = -dx、0、dx、2dx)から来ると仮定します。私はx、y、xyに関して私の数値関数の導関数をとる関数 'Deriv'を書いた:

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 
関連する問題