[作业存档]数值分析作业

本文详细探讨了数值分析作业中的插值问题,对比了拉格朗日插值和Hermite插值在不同节点下的误差表现。同时,分析了切比雪夫多项式零点插值的优势。在误差计算部分,展示了各种插值方法的误差大小。此外,还介绍了复合梯形、辛普森和高斯求积公式在数值积分中的应用,通过误差比较突出了高斯求积公式的高效性。
摘要由CSDN通过智能技术生成

第一题

f ( x ) = 1 1 + x 2 f(x)=\frac{1}{1+x^2} f(x)=1+x21,对 f f f进行如下插值:

(1)令插值节点为等距节点 − 5 , − 4 , − 3 , − 2 , − 1 , 0 , 1 , 2 , 3 , 4 , 5 -5,-4,-3,-2,-1,0,1,2,3,4,5 5,4,3,2,1,0,1,2,3,4,5,在这些节点对 f f f进行Lagrange插值和Hermite插值;

(2)令插值节点为区间 [ − 5 , 5 ] [-5,5] [5,5]上的11次切比雪夫多项式的零点,在这些节点处对 f f f进行Lagrange插值;

(3)令插值节点为等距节点 − 5 , − 4 , − 3 , − 2 , − 1 , 0 , 1 , 2 , 3 , 4 , 5 -5,-4,-3,-2,-1,0,1,2,3,4,5 5,4,3,2,1,0,1,2,3,4,5,在这些节点对 f f f进行分段线性插值和分段三次Hermite插值;

(4)令插值节点为等距节点 − 5 , − 4 , − 3 , − 2 , − 1 , 0 , 1 , 2 , 3 , 4 , 5 -5,-4,-3,-2,-1,0,1,2,3,4,5 5,4,3,2,1,0,1,2,3,4,5,在这些节点对 f f f进行三次样条插值,其中边界条件为第一类边界条件,在两个端点处导数为1,即 f ′ ( − 5 ) = f ′ ( 5 ) = 1 f'(-5)=f'(5)=1 f(5)=f(5)=1.

在第一题,用数组x储存等距插值节点,用数组y储存等距插值节点在原函数上的值,用数组dy储存等距插值节点在原函数上的一阶导数值,用数组a储存需要使用插值函数进行计算的节点,用数组b储存使用插值函数计算的a对应的值。

第一问

(a)算法分析
拉格朗日插值

n次拉格朗日插值基函数为:
l k = ( x − x 0 ) . . . ( x − x k − 1 ) . . . ( x − x k + 1 ) . . . ( x − x n ) ( x k − x 0 ) . . . ( x k − x k − 1 ) . . . ( x k − x k + 1 ) . . . ( x k − x n ) l_k=\frac{(x-x_0)...(x-x_{k-1})...(x-x_{k+1})...(x-x_n)}{(x_k-x_0)...(x_k-x_{k-1})...(x_k-x_{k+1})...(x_k-x_n)} lk=(xkx0)...(xkxk1)...(xkxk+1)...(xkxn)(xx0)...(xxk1)...(xxk+1)...(xxn)
拉格朗日插值多项式为:
L n ( x ) = ∑ k = 0 n y k l k ( x ) L_n(x)=\sum_{k=0}^ny_kl_k(x) Ln(x)=k=0nyklk(x)
对于每个a[i] (i=0,1,2,…,10)
b i = l i ⃗ ⋅ y ⃗ l i ⃗ = ( l 0 ( a i ) , l 1 ( a i ) , . . . , l 10 ( a i ) ) y ⃗ = ( y 0 , y 1 , . . , y 10 ) \begin{aligned} b_i&=\vec{l_i}\cdot\vec{y}\\ \vec{l_i}&=(l_0(a_i),l_1(a_i),...,l_{10}(a_i))\\ \vec{y}&=(y_0,y_1,..,y_{10}) \end{aligned} bili y =li y =(l0(ai),l1(ai),...,l10(ai))=(y0,y1,..,y10)

计算过程:

先计算拉格朗日插值基函数 l k ( a i ) l_k(a_i) lk(ai)。对数组x取负,并在每一项上加上 a i a_i ai,记作数组p,将数组p的第k项改成1,将数组p所有元素相乘,得到基函数的分子;对数组x取负,并在每一项上加上x[k],记作数组q,将数组q的第k项改成1,将数组q所有元素相乘,得到基函数的分母。分子分母相除即得到 l k ( a i ) l_k(a_i) lk(ai)。重复计算获得 l i ⃗ \vec{l_i} li 。根据公式(3),即可获得 b i b_i bi,重复计算即可获得b。

def lag(a,x,y):#a 待插值点 x y已知点
    b=np.zeros(len(a))
    n=len(x)
    for j in range(len(a)):
        l=np.array([lk(i,a[j],x) for i in range(n)])
        b[j]=np.dot(y,l)
    
    return b

def lk(k,a,x):#计算拉格朗日插值多项式的值 插值基函数
    p=a-x
    p[k]=1
    fz=np.cumprod(p)[-1]
    q=x[k]-x
    q[k]=1
    fm=np.cumprod(q)[-1]
    return fz/fm
Hermite插值

Hermite插值要求插值节点的值相等,插值节点的一阶导数值相等,记Hermite插值多项式为 H ( x ) H(x) H(x) f ( x k ) f(x_k) f(xk)的值为 y k y_k yk,一阶导数值为 m k m_k mk,即
{ H ( x k ) = y k H ′ ( x k ) = m k , i = 0 , 1 , . . , n \begin{cases} H(x_k)=y_k\\ H'(x_k)=m_k,i=0,1,..,n \end{cases} { H(xk)=ykH(xk)=mk,i=0,1,..,n
因此,共有2(n+1)个条件,可以确定一个次数不超过2n+1次的多项式。仿照朗格朗日插值多项式,设
H ( x ) = α 0 ( x ) y 0 + β 0 ( x ) m 0 + α 1 ( x ) y 1 + β 1 ( x ) m 1 + . . . + α 0 ( x ) y n + β 0 ( x ) m n = ∑ k = 0 n ( α k ( x ) y k + β k ( x ) m k ) \begin{aligned} H(x)&=\alpha_0(x)y_0+\beta_0(x)m_0+\alpha_1(x)y_1+\beta_1(x)m_1+...+\alpha_0(x)y_n+\beta_0(x)m_n\\ &=\sum_{k=0}^n(\alpha_k(x)y_k+\beta_k(x)m_k) \end{aligned} H(x)=α0(x)y0+β0(x)m0+α1(x)y1+β1(x)m1+...+α0(x)yn+β0(x)mn=k=0n(αk(x)yk+βk(x)mk)
α k ( x ) \alpha_k(x) αk(x), β k ( x ) \beta_k(x) βk(x)需满足
{ α k ( x i ) = { 0 , i ≠ k 1 , i = k α k ′ ( x i ) = 0 \begin{cases} \alpha_k(x_i)= \begin{cases} 0,i\neq k\\ 1,i=k \end{cases}\\ \alpha'_k(x_i)=0 \end{cases} αk(xi)={ 0,i=k1,i=kαk(xi)=0

{ β k ( x ) = 0 β k ′ ( x i ) = { 0 , i ≠ k 1 , i = k \begin{cases} \beta_k(x)=0\\ \beta'_k(x_i)= \begin{cases} 0,i\neq k\\ 1,i=k \end{cases} \end{cases} βk(x)=0βk(xi)={ 0,i=k1,i=k
基于拉格朗日基函数 l i ( x ) l_i(x) li(x)解得
β k ( x ) = ( x − x k ) l k 2 ( x ) α k ( x ) = [ 1 − 2 ( x − x k ) ∑ i = 0 , i ≠ 1 n 1 x k − x i ] l k 2 ( x ) \beta_k(x)=(x-x_k)l_k^2(x)\\ \alpha_k(x)=\left[1-2(x-x_k)\sum_{i=0,i\neq1}^n\frac{1}{x_k-x_i}\right]l_k^2(x) βk(x)=(xxk)lk2(x)αk(x)=12(xxk)i=0,i=1nxkxi1lk2(x)
计算过程:

调用上一部分中计算拉格朗日基函数的函数计算得到 l k ( a i ) l_k(a_i) lk(ai)。重复计算得到向量 l 2 ( a i ) ⃗ = ( l 0 2 ( a i ) , l 1 2 ( a i ) , . . . , l 10 2 ( a i ) ) \vec{l^2(a_i)}=(l_0^2(a_i),l_1^2(a_i),...,l_{10}^2(a_i)) l2(ai) =(l02(ai),l12(ai),...,l102(ai)),每项乘以系数 ( a i − x 0 , a i − x 1 , . . . , a i − x 10 ) (a_i-x_0,a_i-x_1,...,a_i-x_{10}) (aix0,aix1,...,aix10),得到 β ( a i ) ⃗ = ( β 0 ( a i ) , β 1 ( a i ) , . . . , β 10 ( a i ) ) \vec{\beta(a_i)}=(\beta_0(a_i),\beta_1(a_i),...,\beta_{10}(a_i)) β(ai) =(β0

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值