非均勻B樣條擬合MATLAB程式

2022-03-23 23:49:19 字數 1956 閱讀 8577

update on : 20.6.14

直接上**,多的不再說了。

1、寫乙個base函式

檔案儲存為base.m檔案

function result = base(i,k,u,t)

%第i段k次b樣條基,deboor遞推遞迴演算法

%t為變數,u(i)<=t2、b樣條程式

檔案隨便儲存為乙個指令碼檔案即可,如demo.test.m。

%------------------非均勻b樣條擬合matlab程式-----------------

clear

k=3;

% x=load('data.txt');

data_x = [-1;-1;1;1;0.2];

data_y = [1;-0.5;-1;1;0.8];

x = [data_x,data_y];

[n,m]=size(x);

%-----------弦長引數化--------------------------------------

u(k+n)=0;

for i=1:n-1

u(k+i+1)=u(k+i)+sqrt((x(i+1,1)-x(i,1))^2+(x(i+1,2)-x(i,2))^2);

endl=u(n+k);

for i=1:n

u(k+i)=u(k+i)/l;

endfor i=1:3

u(k+i+n)=1;

end%控制多邊線

plot(x(:,1),x(:,2),'o');

hold on

%------------反求n+2個控制點--------------------

%首位重節點v1=v2

%首位與控制多邊形相切

a=zeros(n+2);

a(1,1)=1;a(1,2)=-1;

a(2,2)=1;

a(n+2,n+1)=-1;a(n+2,n+2)=1;

a(n+1,n+1)=1;

for i=3:n

for j=0:2

a(i,i+j-1)=base(i+j-1,k,u,u(i+2));

endend%e:方程右邊.

e=0;

for i=1:m

e(n+2,i)=0;

endfor i=1:n

e(i+1,:)=x(i,:);

end%求出控制點d

d=inv(a)*e;

plot(d(:,1),d(:,2),'g');

hold on

%------------插值並作出樣條曲線-----------------

x=0;y=0;down=0;

for j=1:(n-1)

uu=(u(j+3)):0.0005:u(j+4);

for kk=1:length(uu)

down=down+1;

x(down)=d(j,1)*base(j,3,u,uu(kk))+d(j+1,1)*base(j+1,3,u,uu(kk))+d(j+2,1)*base(j+2,3,u,uu(kk))+d(j+3,1)*base(j+3,3,u,uu(kk));

y(down)=d(j,2)*base(j,3,u,uu(kk))+d(j+1,2)*base(j+1,3,u,uu(kk))+d(j+2,2)*base(j+2,3,u,uu(kk))+d(j+3,2)*base(j+3,3,u,uu(kk));

endendaxis('equal');

plot(x,y,'red');

xlabel('x');ylabel('y');

grid on

效果

參考文章

3次非均勻b樣條擬合程式

非均勻B樣條擬合MATLAB程式

直接上 多的不再說了。1 寫乙個base函式 function result bbase i,k,u,t 第i段k次b樣條基,deboor遞推遞迴演算法 t為變數,u i t1 k 0時result 1 if k 0 if u i t t1 注意1 u i t1 1時的情況,這裡要用t u i 1 ...

b樣條和三次樣條 B樣條 貝塞爾曲線和b樣條曲線

在數學的子學科數值分析裡,b 樣條是樣條曲線一種特殊的表示形式。它是b 樣條基曲線的線性組合。b 樣條是貝茲曲線的一種一般化,可以進一步推廣為非均勻有理b樣.b樣條就相當於乙個函式,這個函式在係數不同時就可以變化成各種曲線形狀.在實際生產中,我們測量得到的是乙個個離散的點,那麼我們要知道相鄰兩個點之...

B樣條函式

給定節點ni 0,記其上分片 k 次多項式 k 1次連續可導函式構成的空間為 s 顯然任意s s 應有s x i 0k cixi 1k i 1 n 1d i x i k 其中 max 從此可看出 dims k n,然而這個形式的基底為全域性的,其支撐並不區域性,故無法避免大數加小數的誤差。以下尋找 ...