数值分析 插值法

数值分析 插值法

插值法的基本概念

对于一条未知曲线,通过已知过曲线的一些点来近似求出这个曲线的函数表达式

线性插值

通过泰勒展开式,已知任何一种曲线都可以多项式线性表出,已知点 x 1 , x 2 . . . x n x_1,x_2...x_n x1,x2...xn以及对应点的函数值 f ( x 1 ) , f ( x 2 ) . . . , f ( x n ) f(x_1),f(x_2)...,f(x_n) f(x1),f(x2)...,f(xn)(此条件以下默认),求过这些点的多项式

已知如果已知n个节点和对应的函数值,就有n个已知条件、可以求出n个位置数、可以确定n-1次方程

拉格朗日插值法

拉格朗日插值多项式的基本表达式:
f ( x ) = ∑ i = 0 n l i f ( x i ) f(x)=\sum_{i=0}^{n}l_if(x_i) f(x)=i=0nlif(xi)
其中 l i l_i li是拉个朗日插值基函数
l i = ∏ j = 0 , j ≠ i n x − x j x i − x j l_i=\prod_{j=0,j\neq{i}}^n\frac{x-x_j}{x_i-x_j} li=j=0,j=inxixjxxj

n个插值点的拉格朗日插值多项是的误差:
R n = f n + 1 ( ξ ) ( n + 1 ) ! ω n + 1 ( x ) R_n=\frac{f^{n+1}(\xi)}{(n+1)!}\omega_{n+1}(x) Rn=(n+1)!fn+1(ξ)ωn+1(x)
其中
ω n + 1 ( x ) = ∏ i = 0 n ( x − x i ) \omega_{n+1}(x)=\prod _{i=0}^{n}(x-x_i) ωn+1(x)=i=0n(xxi)
ps:线性插值的多项式是唯一的,及拉格朗日插值多项式和牛顿插值多项是虽然表示形式不同,本质还是一样的,并且误差项也是相同的

常用的拉格朗日插值多项式:

  1. 拉格朗日线性插值(n=2),方程式
    f ( x ) = x − x 2 x 1 − x 2 f ( x 1 ) + x − x 1 x 2 − x 1 f ( x 2 ) f(x)=\frac{x-x_2}{x_1-x_2}f(x_1)+\frac{x-x_1}{x_2-x_1}f(x_2) f(x)=x1x2xx2f(x1)+x2x1xx1f(x2)

    误差项
    R n ( x ) = f ′ ′ ′ ( ξ ) 6 ( x − x 1 ) ( x − x 2 ) R_n(x)=\frac{f'''(\xi)}{6}(x-x_1)(x-x_2) Rn(x)=6f(ξ)(xx1)(xx2)

  2. 拉格朗日抛物线插值(n=3),方程式
    f ( x ) = ( x − x 2 ) ( x − x 3 ) ( x 1 − x 2 ) ( x 1 − x 3 ) f ( x 1 ) + ( x − x 1 ) ( x − x 3 ) ( x 2 − x 1 ) ( x 2 − x 3 ) f ( x 2 ) + ( x − x 1 ) ( x − x 2 ) ( x 3 − x 1 ) ( x 3 − x 2 ) f ( x 2 ) f(x)=\frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)}f(x_1)+\frac{(x-x_1)(x-x_3)}{(x_2-x_1)(x_2-x_3)}f(x_2)+\frac{(x-x_1)(x-x_2)}{(x_3-x_1)(x_3-x_2)}f(x_2) f(x)=(x1x2)(x1x3)(xx2)(xx3)f(x1)+(x2x1)(x2x3)(xx1)(xx3)f(x2)+(x3x1)(x3x2)(xx1)(xx2)f(x2)

    误差项
    R n ( x ) = f ( 4 ) ( ξ ) 24 ( x − x 1 ) ( x − x 2 ) ( x − x 3 ) R_n(x)=\frac{f^{(4)}(\xi)}{24}(x-x_1)(x-x_2)(x-x_3) Rn(x)=24f(4)(ξ)(xx1)(xx2)(xx3)

牛顿插值多项式法

牛顿插值多项式的基本表达式:
f ( x ) = f ( x 0 ) + f [ x 0 , x 1 ] ( x − x 0 ) + f [ x 0 , x 1 , x 2 ] ( x − x 0 ) ( x − x 1 ) + . . . + f [ x 0 , x 1 , . . . . , x n ] ( x − x 0 ) ( x − x 1 ) . . . ( x − x n − 1 ) f(x)=f(x_0)+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)+...+f[x_0,x_1,....,x_n](x-x_0)(x-x_1)...(x-x_n-1) f(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)+...+f[x0,x1,....,xn](xx0)(xx1)...(xxn1)
牛顿插值多项式的误差
R n ( x ) = f [ x , x 0 , x 1 , . . . , x n ] ω n + 1 ( x ) = R n = f n + 1 ( ξ ) ( n + 1 ) ! ω n + 1 ( x ) R_n(x)=f[x,x_0,x_1,...,x_n]\omega_{n+1}(x)=R_n=\frac{f^{n+1}(\xi)}{(n+1)!}\omega_{n+1}(x) Rn(x)=f[x,x0,x1,...,xn]ωn+1(x)=Rn=(n+1)!fn+1(ξ)ωn+1(x)

其中 f [ x 0 , x 1 ] f[x_0,x_1] f[x0,x1] 表示均差(差商),一阶均差 f [ x 0 , x 1 ] = f ( x 0 ) − f ( x 1 ) x 0 − X 1 f[x_0,x_1]=\frac{f(x_0)-f(x_1)}{x_0-X_1} f[x0,x1]=x0X1f(x0)f(x1)

n+1阶均差可由n阶均差求得
f n + 1 [ x 0 , x 1 , . . . , x n ] = f n [ x 0 , x 1 , . . . , x n − 1 ] − f n [ x 1 , x 2 , . . . , x n ] x 0 − x n f_{n+1}[x_0,x_1,...,x_n]=\frac{f_{n}[x_0,x_1,...,x_{n-1}]-f_{n}[x_1,x_2,...,x_{n}]}{x_0-x_n} fn+1[x0,x1,...,xn]=x0xnfn[x0,x1,...,xn1]fn[x1,x2,...,xn]
亦可以通过均差表线性表出

x i x_i xi y i y_i yi一阶均差二阶均差n阶均差
x 0 x_0 x0 y 0 y_0 y0
x 1 x_1 x1 y 1 y_1 y1 f [ x 0 , x 1 ] f[x_0,x_1] f[x0,x1]
x 2 x_2 x2 y 2 y_2 y2 f [ x 1 , x 2 ] f[x_1,x_2] f[x1,x2] f [ x 0 , x 1 , x 2 ] f[x_0,x_1,x_2] f[x0,x1,x2]
x n x_n xn y n y_n yn f [ x n − 1 , x n ] f[x_{n-1},x_{n}] f[xn1,xn] f [ x n − 2 , x n − 1 , x n ] f[x_n-2,x_n-1,x_n] f[xn2,xn1,xn] f [ x 0 , x 1 , . . . , x n ] f[x_0,x_1,...,x_n] f[x0,x1,...,xn]

由均差表可以知道在增加一个节点的时候只需要在表的最下方增加一行,原有的计算可以全部保留,对于迭代计算来说省去计算量

埃米尔特插值

三次埃米尔特插值公式,已知两点以及两点的导数求原函数
H 3 ( x ) = y 0 α 0 ( x ) + y 1 α 1 ( x ) + m 0 β 0 ( x ) + m 1 β 1 ( x ) H_3(x)=y_0\alpha_0(x)+y_1\alpha_1(x)+m_0\beta_0(x)+m_1\beta_1(x) H3(x)=y0α0(x)+y1α1(x)+m0β0(x)+m1β1(x)
其中
α 0 ( x ) = ( 1 + 2 x − x 0 x 1 − x 0 ) ( x − x 1 x 0 − x 1 ) 2 α 1 ( x ) = ( 1 + 2 x − x 1 x 0 − x 1 ) ( x − x 0 x 1 − x 0 ) 2 β 0 ( x ) = ( x − x 0 ) ( x − x 1 x 0 − x 1 ) 2 β 1 ( x ) = ( x − x 1 ) ( x − x 0 x 1 − x 0 ) 2 \\[5pt]\alpha_0(x)=(1+2\frac{x-x_0}{x_1-x_0})(\frac{x-x_1}{x_0-x_1})^2 \\[5pt]\alpha_1(x)=(1+2\frac{x-x_1}{x_0-x_1})(\frac{x-x_0}{x_1-x_0})^2 \\[5pt]\beta_0(x)=(x-x_0)(\frac{x-x_1}{x_0-x_1})^2 \\[5pt]\beta_1(x)=(x-x_1)(\frac{x-x_0}{x_1-x_0})^2 α0(x)=(1+2x1x0xx0)(x0x1xx1)2α1(x)=(1+2x0x1xx1)(x1x0xx0)2β0(x)=(xx0)(x0x1xx1)2β1(x)=(xx1)(x1x0xx0)2
埃米尔特三次插值多项式的误差
R 3 ( x ) = 1 4 ! f ( 4 ) ( ξ ) ( x − x 0 ) 2 ( x − x 1 ) 2 R_3(x)=\frac{1}{4!}f^{(4)}(\xi)(x-x_0)^2(x-x_1)^2 R3(x)=4!1f(4)(ξ)(xx0)2(xx1)2

三个节点的埃米尔特三次插值多项式

已知三个节点和对应节点的函数值以及对应一个节点的导数值求三次多项式

利用三个节点构造二阶牛顿插值多项式 N 2 N_2 N2加上,利用导数值列出等式,求出待定系数
P ( x ) = N 2 ( x ) + C ( x − x 0 ) ( x − x 1 ) ( x − x 2 ) N 2 ( x ) = f ( x 0 ) + f [ x 0 , x 1 ] ( x − x 0 ) + f [ x 0 , x 1 , x 2 ] ( x − x 0 ) ( x − x 1 ) \\[5pt]P(x)=N_2(x)+C(x-x_0)(x-x_1)(x-x_2) \\[5pt]N_2(x)=f(x_0)+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1) P(x)=N2(x)+C(xx0)(xx1)(xx2)N2(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)

三次埃米尔特插值多项式的误差项
R n ( x ) = f ( 4 ) ( ξ ) 4 ! ( x − x 0 ) ( x − x 1 ) 2 ( x − x 2 ) R_n(x)=\frac{f^{(4)}(\xi)}{4!}(x-x_0)(x-x_1)^2(x-x_2) Rn(x)=4!f(4)(ξ)(xx0)(xx1)2(xx2)

分段插值多项式
分段线性插值

将区间分成n个小区间,每个小区间里面使用拉格朗日线性插值得到一个多项式

避免了龙格现象,误差不会扩散

分段线性插值多项式的误差项为
R ( x ) = ∣ f ( x ) − φ ( x ) ∣ ≤ h 2 8 M M = max ⁡ x ∈ [ a , b ] f ′ ′ ( x ) R(x)=|f(x)-\varphi(x)|\le\frac{h^2}{8}M \\M=\max \limits_{x\in[a,b]}f''(x) R(x)=f(x)φ(x)8h2MM=x[a,b]maxf(x)

三次样条插值函数

2021年4月8日20点36分
待更新…

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数值分析实验 插值法 java版 import java.awt.*; import java.awt.event.*; import java.util.StringTokenizer; import javax.swing.Box; class chazhifa extends Frame implements ActionListener { TextArea area, result, result2; Button butt, butt2, butt3; Label lab, lab3; Box box1, box2, box3, box4, box5, box6, box7; TextField field, field2; chazhifa() { super("插值法:"); area = new TextArea(5, 34); result = new TextArea(4, 8); result.setEditable(false); result2 = new TextArea(4, 8); result2.setEditable(false); butt = new Button("拉格朗日插值:"); butt3 = new Button("牛顿插值:"); butt2 = new Button("清除"); field = new TextField(5); field2 = new TextField(5); lab = new Label("依次输入xi和yi的值:"); lab3 = new Label("输入n和x:"); box2 = Box.createHorizontalBox(); box1 = Box.createVerticalBox(); box3 = Box.createHorizontalBox(); box4 = Box.createHorizontalBox(); box5 = Box.createHorizontalBox(); box6 = Box.createHorizontalBox(); box7 = Box.createVerticalBox(); setLayout(new FlowLayout()); box2.add(lab3); box2.add(field); box2.add(field2); box2.add(butt2); box3.add(lab); box4.add(area); box5.add(butt); box5.add(butt3); box6.add(result); box6.add(result2); box7.add(Box.createVerticalStrut(6)); box7.add(box2); box7.add(Box.createVerticalStrut(5)); box7.add(box3); box7.add(Box.createVerticalStrut(5)); box7.add(box4); box7.add(Box.createVerticalStrut(5)); box7.add(box5); box7.add(Box.createVerticalStrut(5)); box7.add(box6); box7.add(Box.createVerticalStrut(5)); add(box7); butt.addActionListener(this); butt2.addActionListener(this); butt3.addActionListener(this); validate(); setBounds(200, 200, 300, 330); setVisible(true); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值