Построение параметрической кривой сплайна с использованием периодического сплайна - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу построить такую ​​кривую, используя периодический сплайн: enter image description here

У меня есть следующие значения: enter image description here

Итак, я создал следующий код Matlab для построения этой функции:

%initializing values
t = [1,2,3,4,5,6,7,8,9,10,11,12,13];
tplot = [1:0.1:13];
x = [2.5,1.3,-0.25,0.0,0.25,-1.3,-2.5,-1.3,0.25,0.0,-0.25,1.3,2.5];
y = [0.0,-0.25,1.3,2.5,1.3,-0.25,0.0,0.25,-1.3,-2.5,-1.3,0.25,0.0];
[a1, b1, c1, d1] = perspline2(t,x);
[a2, b2, c2, d2] = perspline2(t,y);

for i = 1:12
  xx = linspace(x(i), x(i+1), 100);
  xxx = a1(i) + b1(i)*(xx-x(i)) + c1(i)*(xx-x(i)).^2 ...
       + d1(i)*(xx-x(i)).^3;
  yyy = a2(i) + b2(i)*(xx-x(i)) + c2(i)*(xx-x(i)).^2 ...
       + d2(i)*(xx-x(i)).^3;
  h3=plot(xxx, yyy, 'r-');
  hold on
end
plot(x,y,'k.', 'MarkerSize', 30)
hold off

Если perspline2 () выглядит следующим образом:

function [a1,b1,c1,d1] = perspline2(xnot,ynot)
    x = xnot';
    y = ynot';
    n = length(x) - 1;

    h = diff(x);
    diag0 = [1; 2*(h(1:end-1)+h(2:end)); 2*h(end)];
    A = spdiags([[h;0], diag0, [0;h]], [-1, 0, 1], n+1, n+1);
    % Do a little surgery on the matrix:
    A(1,2)   = 0;
    A(1,end) = -1;
    A(end,1) = 2*h(1);
    A(end,2) = h(1);
    dy = diff(y);
    rhs = 6*[0; diff(dy./h); dy(1)/h(1)-dy(end)/h(end)];
    m = A \ rhs;     % Solve for the slopes, S''(x_i)

    % Compute the coefficients of the cubics.
    a1 = y;
    b1 = dy./h - h.*m(1:end-1)/2 - h.*diff(m)/6;
    c1 = m/2;
    d1 = diff(m)./h/6;

Итак, я знаю, что должен использовать параметрический сплайн, чтобы найти правильные точки для построения. Я использую t = [1,2,3,4,5,6,7,8,9,10,11,12,13]; в качестве своих индексов. Итак, я нахожу коэффициенты для полинома кубического сплайна t против x, а затем нахожу коэффициенты для t против y, а затем пытаюсь построить их друг против друга, используя значения из t для построения параметрической кривой. Тем не менее, я продолжаю получать эту кривую: enter image description here

Я действительно не уверен, почему это происходит.

P.S. Я знаю, что могу использовать функцию сплайна matlab, но когда я это делаю, это приводит к тому, что правый острие немного больше, чем у других остриев. Я хочу, чтобы все каспы были равны по размеру, и в задании сказано, что мы должны использовать кубический сплайн.

Любая помощь очень ценится.

...