在MATLAB中通过伯森斯坦基函数逼近其他函数
1.构建伯森斯坦基函数
function result = Bernstein_Base_function(n,i,x)
%其中n为该伯森斯坦基函数的次数,i为该伯森斯坦基函数x的次数
result = nchoosek(n,i)* x.^i.*(1-x).^(n-i);
2.设出被逼近函数
y = ( x 4 + 2 ) ∗ s i n ( π x ) , . \ y = (x^4+2)*sin(\pi x),. y=(x4+2)∗sin(πx),.
function y = f(x)
y = (x.^4+2).*sin(pi.*x);
3.观察伯森斯坦基函数形状
function First_first()
x = linspace(0,1,100);
y1 = Bernstein_Base_function(3,0,x);
y2 = Bernstein_Base_function(3,1,x);
y3 = Bernstein_Base_function(3,2,x);
y4 = Bernstein_Base_function(3,3,x);
plot(x,y1,'r',x,y2,'b',x,y3,'g',x,y4,'m');
4.Bernstein逼近并绘制拟合曲线
function first_second()
x1 = linspace(0,1,101);
f1 = f(x1);
x2 = linspace(0,1,4);
x3 = linspace(0,1,11);
x4 = linspace(0,1,21);
f2 = f(x2);
f3 = f(x3);
f4 = f(x4);
%此时我们已经计算完成每个基函数的系数
%于是再计算出来每个基函数的值,做点积即可
y2 = zeros([1,101]);
for j =1:101;
for i=1:4
y2(j) = y2(j)+f2(i)*Bernstein_Base_function(3,i-1,x1(j));
end
end
y3 = zeros([1,101]);
for j =1:101;
for i=1:11
y3(j) = y3(j)+f3(i)*Bernstein_Base_function(10,i-1,x1(j));
end
end
y4 = zeros([1,101]);
for j =1:101;
for i=1:21
y4(j) = y4(j)+f4(i)*Bernstein_Base_function(20,i-1,x1(j));
end
end
figure(1)
plot(x1,f1,'m',x1,y2,'b',x1,y3,'r',x1,y4,'g');
figure(2)
plot(x1,f1-y2,'g',x1,f1-y3,'r',x1,f1-y4,'b');
其中
蓝色曲线为3次Bernstein基函数逼近
红色曲线为10次Bernstein基函数逼近
绿色曲线为20次Bernstein基函数逼近
显然次数越高逼近效果越好!
上边的这个代码是有点拖沓的,因为出现了好几个for,所以还是肯定有更简洁的代码,欢迎小伙伴们交流!