Изучение численного метода интерполяции кубическими сплайнами с различными видами граничных условий, страница 7

Сплайн с заданной кривизной в крайних точках:

function G=Splain4(x,y,Deriv2)

for i=1:length(x)-1

    h(i)=x(i+1)-x(i);

end;

for i=1:length(y)-1

    d(i)=(y(i+1)-y(i))/h(i);

end;

for i=1:length(d)-1

    u(i)=6*(d(i+1)-d(i));

end;

M1=Progon(koefSplain4(h, u, d, Deriv2, length(x)),length(x));

n=length(x);

M(1)=Deriv2(1);

M(n)=Deriv2(1);

for i =2:n-1

    M(i)=M1(i-1);

end;

for i=1:length(x)-1

    G(i,1)=(M(i+1)-M(i))/(6*h(i));

    G(i,2)=M(i)/2;

    G(i,3)=d(i)-h(i)*(2*M(i)+M(i+1))/6;

    G(i,4)=y(i);

end;

x1=x(1):0.01:x(2);

x2=x(2):0.01:x(3);

x3=x(3):0.01:x(4);

y1=polyval(G(1,:),x1-x(1));

y2=polyval(G(2,:),x2-x(2));

y3=polyval(G(3,:),x3-x(3));

plot(x1,y1,x2,y2,x3,y3,x,y,'ko');

grid on;

hold off;

title('График сплайна с заданной кривизной');

end

Функция выполняет построение кубического сплайна, с помощью встроенной функции:

function y1= VsSplain(x,y)

pp=interp1(x,y,'splaine','pp');

x1=x(1):0.1:x(4);

y1=ppval(pp,x1);

plot(x,y,'ko');

hold on;

plot(x1,y1,'g-');

grid on;

hold off;

title('График, построенный с помощью встроенной функции');

end

Функция выполняет построение графиков кубических полиномов с разными граничными условиями:

function x= VseSplain(x,y,Deriv,Deriv2)

Q=Splain12(x,y,Deriv);

G1=Splain1(x,y);

G2=Splain2(x,y);

G3=Splain3(x,y);

G4=Splain4(x,y,Deriv2);

x1=0:0.01:1;

x2=1:0.01:2;

x3=2:0.01:3;

y10=polyval(Q(1,:),x1-x(1));

y20=polyval(Q(2,:),x2-x(2));

y30=polyval(Q(3,:),x3-x(3));

plot(x1,y10,x2,y20,x3,y30,x,y,'ko');

hold on;

y11=polyval(G1(1,:),x1-x(1));

y21=polyval(G1(2,:),x2-x(2));

y31=polyval(G1(3,:),x3-x(3));

plot(x1,y11,x2,y21,x3,y31,x,y,'ko');

hold on;

y12=polyval(G2(1,:),x1-x(1));

y22=polyval(G2(2,:),x2-x(2));

y32=polyval(G2(3,:),x3-x(3));

plot(x1,y12,x2,y22,x3,y32,x,y,'ko');

hold on;

y13=polyval(G3(1,:),x1-x(1));

y23=polyval(G3(2,:),x2-x(2));

y33=polyval(G3(3,:),x3-x(3));

plot(x1,y13,x2,y23,x3,y33,x,y,'ko');

hold on;

y14=polyval(G4(1,:),x1-x(1));

y24=polyval(G4(2,:),x2-x(2));

y34=polyval(G4(3,:),x3-x(3));

plot(x1,y14,x2,y24,x3,y34,x,y,'ko');

grid on;

hold off;

title('Графики кубических сплайнов с разными граничными условиями');

end            

Скрипт файл:

function CH = script()

choice=menu('Ограничения в крайних точках сплайна:',...

    'Смыкающий', 'Естественный','Экстраполяционный', ...

    'Заканчивающийся параболой', 'С заданной кривизной',...

    'Встроенная функция','Кубические сплайны');

switch choice

        case 1

prompt = {'значение аргумента','значение функции'...

    'значение производной'};

dlg_title = 'Splain';

num_lines = 1;

def = {'0 1 2 3','0 0.5 2 1.5', '0.2 -1',};

answer = inputdlg(prompt,dlg_title,num_lines,def);

x = str2num(answer{1});

y = str2num(answer{2});

Deriv = str2num(answer{3});

results{1} = 'Матрица коэффициентов';

results{2} = 'смыкающегося сплайна';

results{3} = strcat(num2str(Splain(x,y,Deriv)));

        case 2

prompt = {'значение аргумента','значение функции'};

dlg_title = 'Splain';

num_lines = 1;

def = {'0 1 2 3','0 0.5 2 1.5'};

answer = inputdlg(prompt,dlg_title,num_lines,def);

x = str2num(answer{1});

y = str2num(answer{2});

results{1} = 'Матрица коэффициентов';

results{2} = 'естественного сплайна';

results{3} = strcat(num2str(Splain3(x,y)));

       case 3

prompt = {'значение аргумента','значение функции'};

dlg_title = 'Splain';

num_lines = 1;

def = {'0 1 2 3','0 0.5 2 1.5'};

answer = inputdlg(prompt,dlg_title,num_lines,def);

x = str2num(answer{1});

y = str2num(answer{2});

results{1} = 'Матрица коэффициентов';

results{2} = 'экстраполяционнго сплайна';

results{3} = strcat(num2str(Splain1(x,y)));

      case 4

prompt = {'значение аргумента','значение функции'};

dlg_title = 'Splain';

num_lines = 1;

def = {'0 1 2 3','0 0.5 2 1.5'};

answer = inputdlg(prompt,dlg_title,num_lines,def);

x = str2num(answer{1});

y = str2num(answer{2});

results{1} = 'Матрица коэффициентов';