www.gusucode.com > ​数值分析课程设计,内附MATLAB源码和word,用三次样条插值设计中英文签名 > qianming.m

    figure
set(gcf,'menubar','none');
axes('position',[0.1 0.1 0.8 0.8]);
set(gca,'xlimmode','manual','ylimmode','manual');
X=[];
Y=[];
while 1
    [x,y]=ginput(1);
    line('Parent',gca,'Xdata',x,'Ydata',y,'Marker','p','color','r');
    X=[X,x];
    Y=[Y,y];
    if isempty([x,y])
        break;
    end
end
N0=length(X);
s=(1:N0)';
t=(1:0.05:N0)';
u=interp1(s,X,t,'cubic');
v=interp1(s,Y,t,'cubic');
l=spline(s,X,t);
m=spline(s,Y,t);
subplot(2,2,1);
plot(X,Y,'.',l,m,'b');
subplot(2,2,2);
plot(X,Y,'.',u,v,'r');
subplot(2,2,3);
z=plot(X,Y,'.',l,m,'b',u,v,'r');
axes_handle = get(gcf, 'children');
axes(axes_handle(3)); title('三次样条插值签名');
axes(axes_handle(2)); title('双三次函数签名');
axes(axes_handle(1)); title('对比');
[a,b,button] = ginput(1);
if button==1
   text(a,b, '英文签名');
elseif button==3
   text(a,b, '中文签名'); 
end
legend('节点(X,Y)','三次样条插值','双三次函数签名');
hold on;
m=length(X);A=zeros(m,m); n=m-1;H=zeros(1,n);lambda=zeros(1,n);
mu=zeros(1,n);lambda(1)=1;A(1,1)=2;A(1,2)=lambda(1);
D=zeros(1,n);H(1)=X(2)-X(1);mu(1)=1;D(1)=3*(Y(2)-Y(1));
for k=1:n
hk=X(k+1)-X(k);H(k+1)=hk;
end
H=H(2:n+1);
for k=1:n-1
lambdak=H(k)/(H(k)+H(k+1)); lambda(k+1)=lambdak;
muk=1-lambda(k+1);mu(k)=muk;
dk=3*((mu(k).*(Y(k+1)-Y(k))./H(k))+(lambda(k+1).*(Y(k+2)-Y(k+1))./H(k+1)));
D(k+1)=dk;
end
D(m)= 3*(Y(m)-Y(m-1))/H(m-1);mu(n)=1; n;H;lambda;mu;D;
for i=1:m-1
A(i,i)=2;A(m,m)=2; A(i,i+1)=lambda(i); A(i+1,i)=mu(i);
end
dY=A\D';
syms x
m=length(X);S=zeros(m-1,1);
X
Y

for k=2:m
Sx=Y(k-1)*((H(k-1)-2*X(k-1)+2*x)*(x-X(k))^2)/(H(k-1)^3)+Y(k)*((H(k-1)+2*X(k)-2*x)*(x-X(k-1))^2)/(H(k-1)^3)+dY(k-1)*((x-X(k-1))*(x-X(k))^2)/(H(k-1)^2)+dY(k)*((x-X(k))*(x-X(k-1))^2)/(H(k-1)^2)
fprintf('%6.4f<x<',X(k-1));fprintf('%6.4f\n',X(k));
end