天天看點

matlab如何表示一階導數,三階樣條插值(一階導數邊界條件) matlab程式

該樓層疑似違規已被系統折疊 隐藏此樓檢視此樓

function

S=Threch1(X,Y,dy0,dyn,xi)

% X

為已知資料的橫坐标

%Y

為已知資料的縱坐标

%xi

插值點處的橫坐标

%S

求得的三次樣條插值函數的值

%dy0

左端點處的一階導數

% dyn

右端點處的一階導數

n=length(X)-1;

d=zeros(n+1,1);

h=zeros(1,n-1);

f1=zeros(1,n-1);

f2=zeros(1,n-2);

for

i=1:n

%

求函數的一階差商

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

f1(i)=(Y(i+1)-Y(i))/h(i);

end

for

i=2:n

%

求函數的二階差商

f2(i)=(f1(i)-f1(i-1))/(X(i+1)-X(i-1));

d(i)=6*f2(i);

end

d(1)=6*(f1(1)-dy0)/h(1);

d(n+1)=6*(dyn-f1(n-1))/h(n-1);

賦初值

A=zeros(n+1,n+1);

B=zeros(1,n-1);

C=zeros(1,n-1);

for

i=1:n-1

B(i)=h(i)/(h(i)+h(i+1));

C(i)=1-B(i);

end

A(1,2)=1;

A(n+1,n)=1;

for

i=1:n+1

A(i,i)=2;

end

for

i=2:n

A(i,i-1)=B(i-1);

A(i,i+1)=C(i-1);

end

M=A\d;

syms

x

;

for

i=1:n

Sx(i)=collect(Y(i)+(f1(i)-(M(i)/3+M(i+1)/6)*h(i))*(x-X(i))

...

+M(i)/2*(x-X(i))^2+(M(i+1)-M(i))/(6*h(i))*(x-X(i))^3);

digits(4);

Sx(i)=vpa(Sx(i));%

三樣條插值函數表達式

end

for

i=1:n

disp(

'S(x)='

);

fprintf(

'%s (%d,%d)\n'

,char(Sx(i)),X(i),X(i+1));

end

for

i=1:n

if

xi>=X(i)&&xi<=X(i+1)

S=Y(i)+(f1(i)-(M(i)/3+M(i+1)/6)*h(i))*(xi-X(i))+M(i)/2*(xi-X(i))^2+(M

(i+1)-M(i))/(6*h(i))*(xi-X(i))^3;

end

end

disp(

'xi S'

);

fprintf(

'%d,%d\n'

,xi,S);

return