% we have get sum when we get down % sum % for test
% sum is a number, so we get 2 * sum * lef frist rig = 2 * sum * ll;
% next we get the (x - x(j)) * rig rig = conv(rig,q); % last we get a[j](x)
% a = ll - rig,我们要使得ll与rig维数相同才可以想减,
% 分析可以知道ll相比与rig,其中rig比ll多一维,所以要让ll增加一维,且值为0 % 这里为了不影响ll的值,先增一个变量 lll = [0 ll]; a = lll - rig;
% arrive here. we get a[j](x)
%% we make H(2n - 1) = h1(x) + h2(x) + ... + hn(x) % and the h[j](x) = yj * a[j](x) + mj * b[j](x) % so first get the h[j](x) hemit = y(j) * a + z(j) * b;
%% last we get H(2n - 1) Hemit = Hemit + hemit; end
2.一次执行算法.
m2 = size(data,1); if mod(m2,3) == 1 m2 = m2 - 1; end
if mod(m2,3) == 2 m2 = m2 - 2; end m = m2 / 3;
x = zeros(1,m); % x的值
y = zeros(1,m); % 对应x的函数值 z = zeros(1,m); % 对应x的导数值 for i = 1:m
x(1,i) = data(3 * i - 2,1); %从表格或默认输入中解析出x的值 y(1,i) = data(3 * i - 1,1); %从表格或默认输入中解析出y的值 z(1,i) = data(3 * i, 1); %从表格或默认输入中解析出z的值 end
%对插值多项式而来说,此处有2*n个已知数,所以可以得到 H(2n - 1),首先解析出 n
n = size(x, 2); % 得到x的列数 Hemit = 0.0;
%%%%%%%%然后直接求 H(2n - 1) %%%%%%%%%%%%% for j = 1:n
%%%%%%%%%%%%%%%%%%解析l(x)的值%%%%%%%%%%%%%%%%%%% % 其中l(x) = up(x) / down % matlab 中数组以0开始
% up(x) = (x - x1)(x - x2)...(x - x[j -1])(x - x[j + 1])...(x - xn) % down = (xj - x1)(xj - x2)...(xj - x[j - 1])(xj - x[j + 1])...(xj - xn)
%%%%%%%%%%%%%%%%%首先求down%%%%%%%%%%%%%%%%%%%%% down = 1.0; % 用来求和,同时作为中间变量
sum = 0.0; % 由于在a[j](x)中求和和这个很相似,所以在这里先求出来 % sum = 1 / (xj - x1) + ... 1 / (xj - x[j - 1]) + 1 / (xj - x[j + 1]) ... + 1/(xj - xn) for i = 1 : n % i 从1到n if i == j
continue; % 因为dowm中要排除(xj - xj), 所以当i == j时直接跳到下次循环 else
down = down * ( x(j) - x(i) ); % 迭代求down sum = sum + 1 / ( x(j) - x(i) ); end end
%down % for test
%%%%%%%%%%%%%然后求up(x).介绍一个函数%%%%%%%%%%%%% %p = poly(r) where r is a vector returns a row vector whose elements are %the coefficients of the polynomial whose roots are the elements of r.
% r向量的元素是多线式的根,意思是 p = (x - r(0))(x - r(1))...(x - r(n))多项式展开 % for example: a = [1,2,3]; 则 p = poly(a) % step1: (x - 1)(x - 2)(x - 3) = x^3 - 6x^2 + 11x - 6 % step2: p = [1, -6, 11, -6] ( useful ) % next : let's use poly
% 观察多项式我们首先要去掉x向量中的x(j),方法很多,随便举一个 % 为了不影响到后面可能会用到x,所以不建议直接修改x xx = x; % 设置一个变量来得到x的值,直接修改此变量 xx(j) = [];
%xx % for test , we find it useful. we deleted xx[j] up = poly(xx);
% last : it easy for us to get l(x)... l = up / down;
%% stop here, we have get the l(x)
%%%%%%%%%%%求l(x) * l(x),介绍一个函数%%%%%%%%%%%%%%%% % w = conv(u,v) w = conv(u,v) convolves vectors u and v. Algebraically, % convolution is the same operation as multiplying the polynomials % whose coefficients are the elements of u and v
% 意思是系数为u和v两个向量的多项式采取代数相乘 % for example: y1 = x^3 + 4x + 2 , so the u as [1, 0, 4, 2]
% y2 = x^2 + x + 3, so the v as [1, 1, 3]; and w = conv(u, v) % step1: y1 * y2 = x^5 + x^4 + 7x^3 + 6x^2 + 14x + 6 % step2: w = [1, 1, 7, 6, 14, 6] ( very useful ) % last : it is easy to get the l(x) * l(x) ll = conv(l,l);
%%%%%%%%%%%%%%%%%%求b[j](x),%%%%%%%%%%%%%%% %分析b[j](x)只是在ll[j](x)的基础上乘以(x - xj),继续用conv函数 q = [1,-x(j)]; % mean x - x(j) %it is easy to get b[j](x) b = conv(ll,q);
%%%%%%%%%%%%%%%%求a[j](x)%%%%%%%%%%%%%%%% %对于a[j](x)有点麻烦,但想点办法依然可以求 %first : make a[j](x) = lef - 2(x - x(j)) * sum * lef % and lef is ll, the sum is the next step we will get
% sum = 1 / (xj - x1) + ... 1 / (xj - x[j - 1]) + 1 / (xj - x[j + 1]) ... + 1/(xj - xn) % we have get sum when we get down % sum % for test
% sum is a number, so we get 2 * sum * lef frist rig = 2 * sum * ll;
% next we get the (x - x(j)) * rig rig = conv(rig,q); % last we get a[j](x)
% a = ll - rig,我们要使得ll与rig维数相同才可以想减,
% 分析可以知道ll相比与rig,其中rig比ll多一维,所以要让ll增加一维,且值为0 % 这里为了不影响ll的值,先增一个变量 lll = [0 ll]; a = lll - rig;
% arrive here. we get a[j](x)
%% we make H(2n - 1) = h1(x) + h2(x) + ... + hn(x) % and the h[j](x) = yj * a[j](x) + mj * b[j](x) % so first get the h[j](x) hemit = y(j) * a + z(j) * b;
%% last we get H(2n - 1) Hemit = Hemit + hemit; end
试验及分析
实际问题中应用较广为Newton 插值和Lagrange 插值,虽然这
辆种插值法构造比较简单, 但都存在插值曲线在节点处有尖点、不光滑、插值多项式在节点处不可导等缺点.为了克这些缺点,我们引入了Hermite插值。
在实际应用中,应用最广也是最简单的Hermite插值情形即为导数完全的情况下,Hermite插值多项式的拟合.我们首先讨论该情形下的Matlab程序.
在给出程序之前,我们首先给出该公式所应用的Hermite插值公式.
?x?x???x?b 定理 设在节点a上, 12nf(xj)?yj,f?(xj)?y?j,,
,x?,x其中1?j?n,则函数f(x)在结点处x12,n处的Hermite插值多项
式为
y(x)?h[(xx)(2ayy)?y]?ii?ii?ii
i?1nnx?x1jh();a??i?i?其中 . xxj?1xj?1xi?ji?jnj?ij?i2该定理的证明详见文献.
1.输入格式为(点,这点的函数值,这点的导数值) 2.中间以分号隔开 3.x的值不可能相等 4.最后不要带分号
for example 1,2,3,4,5,6,7,8,9
H(x) = -1983.2913 x^7 + 10137.4073 x^6 - 21780.1241 x^5 + 25468.3639 x^4 - 17487.0206 x^3 + 7043.2112 x^2 - 1538.2717 x + 140.7399 1.1 1 0.9 0.8 0.7 0.6 0.5 0.40.40.50.60.70.80.91
1.1结论
Lagrange插值在向量X 区域内的插值较准确, 但向量X区域之外则不太准确.Newton插值仅适用于等距节点下的牛顿向前(后) 插值. 最近邻插值是最简便的插值, 在这种算法中, 每一个插值输出像素的值就是在输入图像中与其最临近的采样点的值, 当图像中包含像素之间灰度级变化的细微结构时, 最近邻插值法会在图像中产生人工的痕迹. 最近邻插值的特点是简单、快速, 缺点是误差较大。
三次样条插值一阶和二阶连续可导, 插值曲线光滑, 插值效果比较好。而且 Hermite插值法能较好的解决这些问题。
本次试验只讨论了函数值与导数个数相等的情况。
通过本次试验能了解Hermite插值的基本的运行步骤。了解Hermite插值在生活中的应用。获益良多。
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库数值分析实验报告(2)在线全文阅读。
相关推荐: