给定函数211)(x x f +=
,现考察在区间【-5,5】上)(x f 上的等距插值问题。
1. 利用matlab 可以得到211)(x x f +=的图形如下图所示: x=-5:0.1:5;
y=1./(1+x.^2);
plot(x,y)
2. 作)(x f 的20个节点的分段线性插值)(20x lin ,其实现代码及图形如下:
x=-5:0.1:5;
y=1./(1+x.^2);
x1=linspace(-5,5,20);
y1=interp1(x,y,x1,'linear');
plot(x,y,’r ’,x1,y1,’b ’)
所得图形如下:
其中兰线我分段线性插值函数)(20x lin 的曲线
此处需说明由于此处利用的PLOT 函数其绘制曲线的原理既是描点,连线,其所得图形是折线。
所以通过plot 函数绘制)(x f 函数时,如果取点不够多,且恰好去20个等距节点时,其所得的图形和通过分段线性插值所得的)(20x lin 图形是一样,即若运行下列代码会得到下面图形:
x=linspace(-5,5,20);
y=1./(1+x.^2);
plot(x,y)
即其和通过分段线性插值所得的函数)(20x lin 的曲线是重合的。
3. 作)(x f 的21个等距节点的20次lagrange 插值函数)(20x l 。
此处由于matlab 中没有固定的lagrange 插值函数,所以定义lagrange 函数如下,并将其放入matlab 可搜索到的工作目录中:\\....\matlab7.0\work 中。
所定义的lagrange 函数如下:
(此处参考:Numerical Computing with MATLAB 【M 】 Cleve Moler, 并下载其附带的lagrange 函数)
% textbook page 35
function yh = lagrange(x,y,xh)
n = length(x);
m = length(xh);
x = reshape(x,n,1); % x = x(:);
y = reshape(y,n,1); % y = y(:);
xh = reshape(xh,m,1); % xh = xh(:);
yh = zeros(m,1);
c1 = ones(1,n-1);
c2 = ones(m,1);
for i=1:n,
xp = x([1:i-1,i+1:n]);
yh = yh + y(i) * prod((xh*c1-c2*xp')./(c2*(x(i)*c1-xp')),2);
end
然后运行下列代码:
x=linspace(-5,5,21)
y=1./(1+x.^2)
x1=linspace(-5,5,23)
y1=lagrange(x,y,x1)
plot(x,y,'r',x1,y1,'b')
可得到如下图形;
这里需说明用plot 函数所得的被插值函数)(x f 与20次lagrange 插值函数的曲线都不是其精确值,由于在绘制)(x f 曲线时,只取了【-5,5】上的21个点,而绘制)(20x l 函数时只取了【-5,5】上的23个点。
以下分别做出10次lagrange 插值函数)(10x l 与16次lagrange 插值函数)(16x l 以作比较。
如:)(x f 在【-5,5】上取11个点,再作10次lagrange 插值函数)(10x l ,然后运行下列代码:
x=linspace(-5,5,11)
y=1./(1+x.^2)
x2=linspace(-5,5,23)
y2=lagrange(x,y,x2)
plot(x,y,'r',x2,y2,'b')
即得如下图形
如:)(x f 在【-5,5】上取17个点,再作16次lagrange 插值函数)(16x l ,然后运行下列代码:
x=linspace(-5,5,17)
y=1./(1+x.^2)
x3=linspace(-5,5,23)
y3=lagrange(x,y,x3)
plot(x,y,'r',x3,y3,'b')
即得如下图形:
若将其绘制在一起则可得下面图形:plot(x1,y1,'r',x2,y2,'b',x3,y3,'g')。