1

给定 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
4

0 回答 0