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,然而這個形式的基底為全域性的,其支撐並不區域性,故無法避免大數加小數的誤差。以下尋找 ...