Matlab数值计算差商与插值

19 篇文章 8 订阅

均差定义 若已知函数 f(x) 在点 x0,x1,...xn 处的值 f(x0),f(x1),...f(xn). 如果 ij,
一阶均差 f[xj,xj+1]=f(xj+1)f(xj)xj+1xj(j=0,1,...n1)
二阶均差 f[xj,xj+1,xj+2]=f[xj+1,xj+2]f[xj,xj+1]xj+2xj(j=0,1,...n2)
n阶均差 f[x0,x1,...,xn]=f[x1,...,xn]f[x0,...,xn1]xnx0
例 由函数表求各阶均差

x-2-1013
y-56-16-2-24

解:按公式计算一阶差商、二阶差商、三阶差商如下

xf(x)一阶差商二阶差商三阶差商
-2-56   
-1-1640  
0-214-13 
1-20-72
34312

Matlab代码

clear
clc
x=[-2 -1 0 1 3]
y=[-56 -16 -2 -2 4]
deltx=diff(x);
delty=diff(y);
firstorder=delty./deltx %一阶
for i=1:length(x)-2
    delt2x(i)=x(i+2)-x(i);
end
delt2y=diff(firstorder);
secondorder=delt2y./delt2x %二阶
for i=1:length(x)-3
    delt3x(i)=x(i+3)-x(i);
end
delt3y=diff(secondorder);
thirdorder=delt3y./delt3x %三阶
for i=1:length(x)-4
    delt4x(i)=x(i+4)-x(i);
end
delt4y=diff(thirdorder);
fourorder=delt4y./delt4x %四阶

结果

x =

    -2    -1     0     1     3


y =

   -56   -16    -2    -2     4


firstorder =

    40    14     0     3


secondorder =

   -13    -7     1


thirdorder =

     2     2


fourorder =

     0

这里用到了diff,就再次介绍一下差分函数
补充:差分函数diff
diff(X) X为向量时(行列均可),计算相邻两数的差[X(2)-X(1) X(3)-X(2) … X(n)-X(n-1)]
diff(X) X为矩阵时,计算矩阵的2~n行与1~n-1行的差,[X(2:n,:) - X(1:n-1,:)]
diff(X,N) 对上面函数diff(X)的扩充,这里的N指定N阶差分,二阶差分是对一阶差分的结果再做差分运算
DIFF(X,N,DIM) 对上面函数diff(X,N)的扩充,DIM取1或2,取1时按行差分,与上面结果一样,取2时按列差分

把上面的命令用字符串改造了一下,不过太难看懂了,no zuo no die
eval()函数的功能就是将括号内的字符串视为语句并运行,简单记为字符串转语句
num2str()函数的功能就是将括号内的数字转换为字符串,简单记为数字转字符串

clear
clc
x=[-2 -1 0 1 3]
y=[-56 -16 -2 -2 4]
deltx=diff(x);
delty=diff(y);
order1=delty./deltx %一阶
for j=2:4
  str=['for i=1:length(x)-',num2str(j),char(10)];
  str=[str,'delt',num2str(j),'x(i)=x(i+',num2str(j),')-x(i);',char(10)];
  str=[str,'end',char(10)];
  str=[str,'delt',num2str(j),'y=diff(order',num2str(j-1),');',char(10)];
  str=[str,'order',num2str(j),'=delt',num2str(j),'y./delt',num2str(j),'x',char(10)];
  eval(str)
end

结果

x =

    -2    -1     0     1     3


y =

   -56   -16    -2    -2     4


order1 =

    40    14     0     3


order2 =

   -13    -7     1


order3 =

     2     2


order4 =

     0

牛顿插值
牛顿插值公式及其余项
n=1 时:
差商 N1(x)=f(x0)+f[x0,x1](xx0)
余项 R1(x)=f[x,x0,x1](xx0)(xx1)
n=2 时:
差商 N2(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)
余项 R2(x)=f[x,x0,x1,x2](xx0)(xx1)(xx2)
n 阶:
差商Nn(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)
+f[x0,x1,...,xn](xx0)(xx1)...(xxn1)
余项 Rn(x)=f[x,x0,x1,...,xn](xx0)(xx1)...(xxn)
例 已知 x=1,4,9 的平方根为 1,2,3, 利用牛顿基本差商公式 7 的值

解:

xi xi f[xi,xi+1] f[xi,xi+1,xi+2]
11  
42 2141=0.33333  
93 3294=0.2 0.20.3333391=0.016

从而得二阶牛顿基本差商公式为
P2(x)=1+0.33333(x1)0.01667(x1)(x4)
因此计算得 7 的近似值为 P2(7)=2.69992

clear
clc
x=[1 4 9]
y=[1 2 3]
deltx=diff(x);
delty=diff(y);
order1=delty./deltx %一阶
for i=1:length(x)-2
    delt2x(i)=x(i+2)-x(i);
end
delt2y=diff(order1);
order2=delt2y./delt2x %二阶
%%牛顿插值需要的值是y(1)、order1(1)、order2(1)、x(1)、x(2)
y(1),order1(1),order2(1),x(1),x(2)
%%构造多项式
P=[0 0 y(1)]+[0 order1(1)*poly(x(1))]+order2(1)*poly(x([1:2]))
%%求值
polyval(P,7)

结果

x =

     1     4     9


y =

     1     2     3


order1 =

    0.3333    0.2000


order2 =

   -0.0167


ans =

     1


ans =

    0.3333


ans =

   -0.0167


ans =

     1


ans =

     4


P =

   -0.0167    0.4167    0.6000


ans =

    2.7000

等距节点、差分与差商的关系
向前差分
一阶: Δf(k)=f(k+1)f(k) ,如 Δf(0)=f(1)f(0) Δf(1)=f(2)f(1)
二阶: Δ2f(k)=Δf(k+1)Δf(k) ,如 Δ2f(0)=Δf(1)Δf(0) Δ2f(1)=Δf(2)Δf(1)
三阶: Δ3f(k)=Δ2f(k+1)Δ2f(k) ,如 Δ3f(0)=Δ2f(1)Δ2f(0) Δ3f(1)=Δ2f(2)Δ2f(1)
一般定义: Δmf(k)=Δm1f(k+1)Δm1f(k) m=2,3...
此外还有向后差分、中心差分,这里暂时不做介绍
对于等距节点,差分与差商的关系
f[xk,xk+1,...xk+m=]=Δmf(k)m!hm
所以原来的牛顿插值公式在等距节点下,写成向前差分的形式就是
差商 Nn(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)
+f[x0,x1,...,xn](xx0)(xx1)...(xxn1)
=f(x0)+Δf(0)h(xx0)+Δ2f(0)2!h2(xx0)(xx0)(xx1)
+Δnf(0)n!hn(xx0)(xx1)...(xxn1)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值