在可变数量的点之间调试样条的构造

时间:2012-05-08 20:07:32

标签: matlab interpolation splines

给定x和y中的点数量,我想创建与所有点相交的样条曲线,并且在交叉点中具有相同的斜率。

我的方法是建立一组点的交点方程,并在交点处规定相等的斜率,然后使用fsolve()来确定系数。

然而,在绘制找到的样条线时,它们在交叉点处没有相同的斜率,尽管它们与x和y中给出的正确点相交。

我一直试图在两天的大部分时间里调试这个脚本而没有任何运气。有人可以指出为什么我的花键没有得到正确的斜率?或者可以在找到满意的解决方案之前退出fsolve()吗?

主档案:

result = fsolve(@(K) eqns(x,y,K) , ones(1,(size(x,1)-1)*3) ); %Calls eqns() in eqns.m

A = result(1 : size(x,1)-1 );
B = result(size(x,1) : 2*size(x,1)-2 );
C = result(2*size(x,1)-1 : 3*size(x,1)-3 );


%Plot splines
splinePts = size(A,2)*100;
x_spline = [0 : x(end)/splinePts : x(end)];
fx = ones(splinePts,1);
for i = 1:size(A,2)
    for j = 1:100
        k = i*100-100 + j;
        fx(k) = A(i) * x_spline(k)^2 + B(i) * x_spline(k) + C(i);
    end
end

plot(fx);

eqns.m

function fcns=eqns(x,y,K)

A = K(1 : size(x,1)-1 ); %Coefficients for X^2
B = K(size(x,1) : 2*size(x,1)-2); %Coefficients for X
C = K(2*size(x,1)-1 : 3*size(x,1)-3); %Constants

%Equations for hitting all points
syms H;
temp = H; %Initiate variable for containing equations.

for i = 1:size(B,2)
    temp(end+1) = eqn(x(i),y(i),A,B,C,i); %Calls eqn() in eqn.
    temp(end+1) = eqn(x(i+1),y(i+1),A,B,C,i);
end


%Equations for slopes at spline intersections
syms X;
temp(end+1) = subs( diff(eqn(X,0,A,B,C,1),X) - 0 , 'X' , x(1) );

for i = 1:size(A,2)-1
    temp(end+1) = subs( diff(eqn(X,1,A,B,C,i),X) - diff(eqn(X,1,A,B,C,i+1),X) , 'X' , x(i)+1 );
end

fcns = double( temp(2:end) );

end

eqn.m

function fcn=eqn(X,Y,A,B,C,i)

fcn = A(i)*X^2 + B(i)*X + C(i) - Y;

end

0 个答案:

没有答案