320 likes | 477 Views
代数插值法. 插值的基本概念 拉格朗日插值法 牛顿插值法. 插值的基本概念. 用处:根据函数 f(x) 已有的数据表格来计算函数 f(x) 在一些新的点 x 处的函数值。 定义:在所给定的函数表格中间再插入一些所需要的新点上的函数值。 因为多项式具有各阶导数,求值也比较方便,所以通常选多项式函数作为近似函数。. 插值的基本思想. 首先设法根据表格中已有的函数值来构造一个简单的函数 y(x) 作为 f(x) 的近似表达式,然后再用 y(x) 来计算新的点上的函数值作为 f(x) 的近似值。. 其中. 代数插值问题.
E N D
代数插值法 插值的基本概念 拉格朗日插值法 牛顿插值法
插值的基本概念 • 用处:根据函数f(x)已有的数据表格来计算函数f(x)在一些新的点x处的函数值。 • 定义:在所给定的函数表格中间再插入一些所需要的新点上的函数值。 • 因为多项式具有各阶导数,求值也比较方便,所以通常选多项式函数作为近似函数。
插值的基本思想 • 首先设法根据表格中已有的函数值来构造一个简单的函数y(x)作为f(x)的近似表达式,然后再用y(x)来计算新的点上的函数值作为f(x)的近似值。
其中 代数插值问题 设函数y=f(x)在区间[a,b]上是连续的,且已知f(x)在区间[a,b]上n+1个互异点处的函数值,即 寻找一个次数不高于n的多项式: 使满足条件: 称 为f(x)的插值多项式
插值的三个问题 • 插值问题的解是否存在?若解存在,是否唯一? • 如果插值多项式存在,则具体地又如何去求解或构造? • 插值多项式函数与原来的函数f(x)的误差有多少?
代数插值问题的唯一有解性 • 求解下列线性方程组:
时,有 当满足: 代数插值解的唯一性 • 范德蒙行列式
拉格朗日插值法 • 通过n+1互异点构造次数不超过n的插值多项式 • 设想将插值多项式表示成n+1个n次多项式的线性组合,即: • 其中
拉格朗日插值多项式 即: 将给定的条件 代入得到: 则:
对称性 拉格朗日插值多项式 通过给定点的插值多项式是唯一的,拉格朗日插值多项式只是其中的一种表示形式
拉格朗日插值公式的两种情形: • 线性插值y=f(x): (x0,y0), (x1,y1) • 二次(抛物线)插值y=f(x): (x0,y0), (x1,y1) ,(x2,y2)
符号计算—智能功能 • y = sym(‘2*sin(x)*cos(x)’) • % 把字符表达式转换为符号变量 • y = simple(y) • % 按规则把已有的y符号表达式成最简形式。
求矩阵A的相关表达式 • 行列式,逆阵和特征值 • syms a11 a12 a21 a22; • A=[a11,a12;a21,a22] • DA=det(A),IA=inv(A),EA=eig(A)
积分 • syms A t tao w; • yf=int(A*exp(-i*w*t),t,-tao/2,tao/2); • Yf=simple(yf)
例5-1 • 已知函数y=f(x)的观测数据为:
计算拉格朗日插值多项式 • function LagrangeCz(A) • x = A(1,:); • y = A(2,:); • yp = []; • y_str = []; • len = length(x);
for ii = 1:len • yp = []; • for jj = 1:len • if(ii~=jj) • xii = num2str(x(ii)); • xjj = num2str(x(jj)); • yp = strcat(yp,'*(x-(',xjj,'))/((',xii,')-(',xjj,'))'); • end • end
yf = num2str(y(ii)); • if(1==ii) • y_str = strcat(yf,yp); • else • y_str = strcat(y_str,'+(',yf,')',yp); • end • end • y0 = sym(y_str); • y = simple(y0)
编程解题和验证拉格朗日法 • 例5-1 P135 • 例5-2 P135
牛顿插值法 • 差商及其主要性质 • 牛顿插值公式
差商及其主要性质 • 差商定义:若已知函数f(x)在点xi(i=0,1,2,…n)处的函数值f(xi),则: 0阶差商: 1阶差商: 2阶差商:
差商性质 • 性质一 • 性质二:若函数f(x)在包含结点的区间[a,b]上存在k阶导数:
牛顿插值公式 • 将n阶多项式表示为: • 则:
牛顿插值公式 • 类推: • 牛顿插值公式:
编程解题和验证牛顿插值法 • 例5-1 P135 • 例5-2 P135
计算牛顿插值多项式 • function NewtonCz(xy) • x = xy(1,:); • % y = xy(2,:); • yp = []; • y_str = []; • len = length(x);
for ii = 1:len • val = DifDiv(xy(:,1:ii)); • yf = num2str(val); • if 1==ii • y_str = yf; • else • yp = []; • for jj = 1:ii-1 • xjj = num2str(x(jj)); • yp = strcat(yp,'*(x-(',xjj,'))'); • end • y_str = strcat(y_str,'+(',yf,')',yp);
end • end • y0 = sym(y_str); • y = simple(y0)
function val = DifDiv(xy) • x = xy(1,:); • y = xy(2,:); • count = length(x); • if 1>count • val = NaN; • return; • end • switch count • case 1 • val = y(1);
case 2 • val = (DifDiv(xy(:,1))-DifDiv(xy(:,2)))/(x(1)-x(2)); • otherwise • val = (DifDiv(xy(:,1:end-1))-DifDiv([xy(:,1:end-2),xy(:,end)]))... • /(x(end-1)-x(end)); • end