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

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

第一题

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

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

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

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

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

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

第一问

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

n次拉格朗日插值基函数为:
lk=(x−x0)...(x−xk−1)...(x−xk+1)...(x−xn)(xk−x0)...(xk−xk−1)...(xk−xk+1)...(xk−xn) 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)
拉格朗日插值多项式为:
Ln(x)=∑k=0nyklk(x) L_n(x)=\sum_{k=0}^ny_kl_k(x) Ln(x)=k=0nyklk(x)
对于每个a[i] (i=0,1,2,…,10)
bi=li⃗⋅y⃗li⃗=(l0(ai),l1(ai),...,l10(ai))y⃗=(y0,y1,..,y10) \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)

计算过程:

先计算拉格朗日插值基函数lk(ai)l_k(a_i)lk(ai)。对数组x取负,并在每一项上加上aia_iai,记作数组p,将数组p的第k项改成1,将数组p所有元素相乘,得到基函数的分子;对数组x取负,并在每一项上加上x[k],记作数组q,将数组q的第k项改成1,将数组q所有元素相乘,得到基函数的分母。分子分母相除即得到lk(ai)l_k(a_i)lk(ai)。重复计算获得li⃗\vec{l_i}li 。根据公式(3),即可获得bib_ibi,重复计算即可获得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(xk)f(x_k)f(xk)的值为yky_kyk,一阶导数值为mkm_kmk,即
{ H(xk)=ykH′(xk)=mk,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)y0+β0(x)m0+α1(x)y1+β1(x)m1+...+α0(x)yn+β0(x)mn=∑k=0n(αk(x)yk+βk(x)mk) \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(xi)={ 0,i≠k1,i=kαk′(xi)=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′(xi)={ 0,i≠k1,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
基于拉格朗日基函数li(x)l_i(x)li(x)解得
βk(x)=(x−xk)lk2(x)αk(x)=[1−2(x−xk)∑i=0,i≠1n1xk−xi]lk2(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)
计算过程:

调用上一部分中计算拉格朗日基函数的函数计算得到lk(ai)l_k(a_i)lk(ai)。重复计算得到向量l2(ai)⃗=(l02(ai),l12(ai),...,l102(ai))\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)),每项乘以系数(ai−x0,ai−x1,...,ai−x10)(a_i-x_0,a_i-x_1,...,a_i-x_{10})(aix0,aix1,...,aix10),得到β(ai)⃗=(β0(ai),β1(ai),...,β10(ai))\vec{\beta(a_i)}=(\beta_0(a_i),\beta_1(a_i),...,\beta_{10}(a_i))β(ai) =(β0(ai),β1(a

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值