数值分析实验报告

2025-07-14

院 系: 数学与统计学学院 专 业: 信息与计算科学 年 级: 11级 课程名称: 数值分析课程设计 实验名称: Hermite插值法 小组成员:

学号: 11151227 姓名: 廖驰川 学号: 11151221 姓名: 葛绪意 学号: 11151215 姓名: 王宇驰 指导教师: 娄联堂

2014年 6 月 11 日

摘要

Hermite 插值是数值分析中的一个重要内容,在相同的节点下得到比拉格朗日插值更高次的插值多项式,而且,相应的曲线在部分节点处也更光滑.在我们所学课程中,只给出了当所有节点处一阶导数均已知时的Hermite 插值.不少实际问题不但要求在节点上的函数值相等,而且还要求它的导数值相等,甚至要求高阶导数值也相等.满足这种要求的插值多项式就是Hermite插值多项式.本次课程设计,只讨论函数值与导数值个数相等的情况.同时也给出了Hermite插值公式的Matlab算法.

关键词 Hermite 插值;Matlab 实现;数值分析

引言

在实际工作中, 人们得到的一些数据通常是一些不连续的点, 在土木工程、流体力学、经济学和空气动力学等学科中经常要遇到这样的问题.如果用户想得到这些分散点外的其他数值, 就必须运用这些已知的点进行插值.因此,对近似公式的构造产生了插值问题.

不少实际问题不但要求在节点上的函数值相等,而且还要求它的导数值相等,甚至要求高阶导数值也相等.满足这种要求的插值多项式就是Hermite插值多项式.

这里给出2n+2个条件,可以唯一确定一个次数不超过2n+1次的多项式.

H()x?[y?()x?m?()x].?2n?1jjjjj?0n

??a??2(lb,??1xlx().jxj)jj2j(xx?(?xx)?()?()0)xxj?1j?1xxn由于l()x?j(xx)(xx)(xx)xx)j?0j?j?1j?j?1(j?n

21a(x)?[1?2(x?x)]lx).?jjj(xj?xk0n 解得:

bj(x)?(x?xj)l2x)j(

常用的插值法有Lagrange插值、Newton插值、最近邻插值、

Hermite 插值和三次样条插值插值法等. 应用较广的是Newton 插值和Lagrange 插值虽然构造比较简单, 但都存在插值曲线在节点处有尖点、不光滑、插值多项式在节点处不可导等缺点.

为了保证插值多项式pn(x) 能更好地逼近f(x), 对pn(x)增加一些约束条件, 例如要求pn(x)在某些结点处与f(x)的微商相等, 这样就产生了切触插值问题.切触插值即为Hermite插值.它与被插函数一般有更高的密合度.

本课程设计主要对Hermite插值法进行总结

算法

1. 单步运算算法. m2 = m;

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)


数值分析实验报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:煤气柜安全操作规程

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219