Построение кубического сплайна с естественными граничными условиями без встроенных функций MATLAB - PullRequest
0 голосов
/ 02 января 2019

В рамках проекта я должен построить кубический сплайн с естественными граничными условиями без использования каких-либо встроенных функций MATLAB, таких как сплайн или csape. Я пытался программировать следующую функцию.

Хотя я почти уверен, что это правильно до того момента, когда вычисляются коэффициенты q, я не могу понять, как в итоге получу фактические кубические полиномы. То, что я сейчас получаю как выход при вызове функции, это 9 различных значений для S.

Любая помощь или советы будут оценены.

function S=cubic_s(x,y)

n=length(x);
%construction of the tri-diagonal matrix 
for j=1:n
    V(j,1)=1;
    V(j,2)=4;
    V(j,3)=1;
end
%the first row should be (1,0,...,0) and the last (0,0,...,0,1)
V(1,2)=1; V(n,2)=1; V(2,3)=0; V(n-1,1)=0;  
d=[-1 0 1];
A=spdiags(V,d,n,n);

%construction of the vector b
b=zeros(n,1);
%the first and last elements of b must equal 0
b(1)=0; b(n)=0;
%distance between two consecutive points 
h=(x(n)-x(1))/(n-1);
for j=2:n-1
    b(j,1)=(6/h^2)*(y(j+1)-2*y(j)+y(j-1));
end

%solving for the coefficients q
q=A\b;

%finding the polynomials with the formula for the cubic spline
for j=1:n-1
    for z=x(j):0.01:x(j+1)
        S(j)=(q(j)/(6*h))*(x(j+1)-z)^3+(q(j+1)/(6*h))*(z-x(j))^3+(z-x(j))* (y(j+1)/h-(q(j+1)*h)/6)+(x(j+1)-z)*(y(j)/h-(q(j)*h)/6);
    end
end

1 Ответ

0 голосов
/ 02 января 2019

Вы должны сохранять S каждый раз, см. Рисунок и код ниже Spline

function plot_spline
x = (0:10);
y = [1 4 3 7 1 5 2 1 6 2 3];
xx = x(1):0.01:x(2);


[XX,YY]=cubic_s(x,y);
plot(x,y,'*r', XX,YY,'-k')


function [XX,YY]=cubic_s(x,y)

n=length(x);
%construction of the tri-diagonal matrix 
for j=1:n
    V(j,1)=1;
    V(j,2)=4;
    V(j,3)=1;
end
%the first row should be (1,0,...,0) and the last (0,0,...,0,1)
V(1,2)=1; V(n,2)=1; V(2,3)=0; V(n-1,1)=0;  
d=[-1 0 1];
A=spdiags(V,d,n,n);

%construction of the vector b
b=zeros(n,1);
%the first and last elements of b must equal 0
b(1)=0; b(n)=0;
%distance between two consecutive points 
h=(x(n)-x(1))/(n-1);
for j=2:n-1
    b(j,1)=(6/h^2)*(y(j+1)-2*y(j)+y(j-1));
end

%solving for the coefficients q
q=A\b;

%finding the polynomials with the formula for the cubic spline
enum = 1;
for j=1:n-1
    for z=x(j):0.01:x(j+1)
        YY(enum)=(q(j)/(6*h))*(x(j+1)-z)^3+(q(j+1)/(6*h))*(z-x(j))^3+(z-x(j))* (y(j+1)/h-(q(j+1)*h)/6)+(x(j+1)-z)*(y(j)/h-(q(j)*h)/6);
        XX(enum)=z;
        enum = enum+1;
    end
end
...