Bernstein基函数的绘制
在一张图上绘制Bernstein基函数,这里以三次为例
x=0:0.01:1;
hold on
B=nchoosek(3,0).*x.^0.*(1-x).^(3-0);
plot(x,B,'r');
B=nchoosek(3,1).*x.^1.*(1-x).^(3-1);
plot(x,B,'g');
B=nchoosek(3,2).*x.^2.*(1-x).^(3-2);
plot(x,B,'b');
B=nchoosek(3,3).*x.^3.*(1-x).^(3-3);
plot(x,B,'c');
title('三次Bernstein基函数');
xlabel('x轴');ylabel('y轴');
legend('i=0','i=1','i=2','i=3');
绘制结果如下
Bernstein多项式逼近函数
函数如下
Bernstein多项式如下
x=0:0.01:1;
y=(x.^4+2).*sin(pi.*x);
hold on
plot(x,y,'r');
%---------------------
n=3;B=0;
for i=0:n
B=B+((i/n)^4+2)*sin(pi*(i/n))*nchoosek(n,i).*x.^i.*(1-x).^(n-i);
end
plot(x,B,'c');
%---------------------
n=10;B=0;
for i=0:n
B=B+((i/n)^4+2)*sin(pi*(i/n))*nchoosek(n,i).*x.^i.*(1-x).^(n-i);
end
plot(x,B,'b');
%---------------------
n=20;B=0;
for i=0:n
B=B+((i/n)^4+2)*sin(pi*(i/n))*nchoosek(n,i).*x.^i.*(1-x).^(n-i);
end
plot(x,B,'m');
title('Bernstein 多项式');
xlabel('x轴');ylabel('y轴');
legend('f(x)','n=3','n=10','n=20');
运行结果如下
我们可以不同的n来分析误差。
x=0:0.01:1;
y=(x.^4+2).*sin(pi.*x);
hold on
%---------------------
n=3;B=0;
for i=0:n
B=B+((i/n)^4+2)*sin(pi*(i/n))*nchoosek(n,i).*x.^i.*(1-x).^(n-i);
end
R=y-B;
plot(x,R,'b');
%---------------------
n=10;B=0;
for i=0:n
B=B+((i/n)^4+2)*sin(pi*(i/n))*nchoosek(n,i).*x.^i.*(1-x).^(n-i);
end
R=y-B;
plot(x,R,'r');
%---------------------
n=20;B=0;
for i=0:n
B=B+((i/n)^4+2)*sin(pi*(i/n))*nchoosek(n,i).*x.^i.*(1-x).^(n-i);
end
R=y-B;
plot(x,R,'g');
title('误差函数');
xlabel('x轴');ylabel('y轴');
legend('f-B3','f-B10','f-B20');
运行结果如下
总结
代码写的过于傻……但是我们可以发现,随着Bernstein的次数提高,逼近的效果变好了,误差也变小了。