23.用三次样条函数去模拟汽车车门的曲线,车门曲线的型值点数据如下 (P89页) :
优化后借助MATLAB用三次样条函数s(x)去模拟汽车门曲线--四川大学--硕士研究生数值分析作业_matlab

`%%%
function f=cf(y)
 p=length(y);
 for k=1:p-1;
     f(k)=y(k+1)-y(k);
 end
%%%
 function [lk,mk,ek]=jh(x,h,f)
 n=length(x);
 for k=2:n-1;
     lk(k)=h(k)/(h(k-1)+h(k));
     mk(k)=h(k-1)/(h(k-1)+h(k));
     ek(k)=3*(lk(k)*f(k-1)+mk(k)*f(k));
 end
%%%
 function h=bc(x)
 n=length(x);
 for k=1:n-1;
     h(k)=x(k+1)-x(k);
 end
%%%
x=[0,1,2,3,4,5,6,7,8,9,10];
y=[2.51,3.30,4.04,4.70,5.22,5.54,5.78,5.40,5.57,5.70,5.80];
h=bc(x)
f=cf(y)
[lk,mk,ek]=jh(x,h,f)
m1=0.8;
m11=0.2;
A=[2 mk(2) 0 0 0 0 0 0 0;lk(3) 2 mk(3) 0 0 0 0 0 0;0 lk(4) 2 mk(4) 0 0 0 0 0;...
    0 0 lk(5) 2 mk(5) 0 0 0 0;0 0 0 lk(6) 2 mk(6) 0 0 0;0 0 0 0 lk(7) 2 mk(7) 0 0;...
    0 0 0 0 0 lk(8) 2 mk(8) 0;0 0 0 0 0 0 lk(9) 2 mk(9);0 0 0 0 0 0 0 lk(9) 2]
B=[ek(2)-lk(2)*m1;ek(3);ek(4);ek(5);ek(6);ek(7);ek(8);ek(9);ek(10)-mk(10)*m11]
C=A\B
m2=C(1);m3=C(2);m4=C(3);m5=C(4);m6=C(5);m7=C(6);m8=C(7);m9=C(8);m10=C(9);
m=[m1 m2 m3 m4 m5 m6 m7 m8 m9 m10 m11]
for i=1:10;
    x1=[i-1:0.00001:i]
    s1=(x1-x(i+1)).^2.*(h(i)+2.*(x1-x(i))).*y(i)/h(i).^3;
    s2=(x1-x(i)).^2.*(h(i)+2.*(x(i+1)-x1)).*y(i+1)/h(i).^3;
    s3=(x1-x(i+1)).^2.*(x1-x(i)).*m(i)/(h(i).^2);
    s4=(x1-x(i)).^2.*(x1-x(i+1))*m(i+1)/(h(i).^2);
    s=s1+s2+s3+s4;
    plot(x,y,'bo-',x1,s,'--red')
    hold on
 end
 axis([0 10 0 8]);
 title('汽车车门的三次插值样条曲线')
 xlabel('插值点横坐标X');
 ylabel('插值点纵坐标Y');
%%%
function createfigure(X1, Y1, X2, Y2, X3, Y3, X4, Y4, X5, Y5, X6, Y6, X7, Y7, X8, Y8, X9, Y9, X10, Y10, X11, Y11)
%CREATEFIGURE(X1, Y1, X2, Y2, X3, Y3, X4, Y4, X5, Y5, X6, Y6, X7, Y7, X8, Y8, X9, Y9, X10, Y10, X11, Y11)
%  X1:  x 数据的矢量
%  Y1:  y 数据的矢量
%  X2:  x 数据的矢量
%  Y2:  y 数据的矢量
%  X3:  x 数据的矢量
%  Y3:  y 数据的矢量
%  X4:  x 数据的矢量
%  Y4:  y 数据的矢量
%  X5:  x 数据的矢量
%  Y5:  y 数据的矢量
%  X6:  x 数据的矢量
%  Y6:  y 数据的矢量
%  X7:  x 数据的矢量
%  Y7:  y 数据的矢量
%  X8:  x 数据的矢量
%  Y8:  y 数据的矢量
%  X9:  x 数据的矢量
%  Y9:  y 数据的矢量
%  X10:  x 数据的矢量
%  Y10:  y 数据的矢量
%  X11:  x 数据的矢量
%  Y11:  y 数据的矢量
%  由 MATLAB 于 04-Nov-2018 18:57:48 生成
% 创建 figure
figure1 = figure;
% 创建 axes
axes1 = axes('Parent',figure1);
hold(axes1,'on');
% 创建 plot
plot(X1,Y1,'Marker','o','Color',[0 0 1]);
% 创建 plot
plot(X2,Y2);
% 创建 plot
plot(X3,Y3);
% 创建 plot
plot(X4,Y4);

% 创建 plot
plot(X5,Y5);
% 创建 plot
plot(X6,Y6);
% 创建 plot
plot(X7,Y7);
% 创建 plot
plot(X8,Y8);
% 创建 plot
plot(X9,Y9);
% 创建 plot
plot(X10,Y10);
% 创建 plot
plot(X11,Y11,'LineStyle','--','Color',[1 0 0]);
% 创建 xlabel
xlabel('插值点横坐标X','FontSize',11);
% 创建 title
title('汽车车门的三次插值样条曲线','FontSize',11);
% 创建 ylabel
ylabel('插值点纵坐标Y','FontSize',11);
% 取消以下行的注释以保留坐标轴的 X 范围
% xlim(axes1,[0 10]);
% 取消以下行的注释以保留坐标轴的 Y 范围
% ylim(axes1,[0 8]);
box(axes1,'on');
% 创建 textarrow
annotation(figure1,'textarrow',[0.728928571428571 0.7075],...
    [0.468095238095238 0.660476190476191],'String',{'三次样条函数插值曲线'});
% 创建 textarrow
annotation(figure1,'textarrow',[0.520833333333333 0.559895833333333],...
    [0.533720930232558 0.686046511627907],'String',{'   用线段连接插值点'});
% 创建 textarrow
annotation(figure1,'textarrow',[0.384895833333333 0.364583333333333],...
    [0.436046511627907 0.582558139534884],'String',{'插值点'});`

更多文章请关注《万象专栏》