埃尔米特插值c语言_计算物理基础:第七章-插值与拟合

本文详细介绍了计算物理中的插值与拟合,主要讨论了拉格朗日插值法、分段三次埃尔米特插值以及曲线拟合。通过比较不同插值方法,强调了埃尔米特插值法在保持曲线光滑连接上的优势,并提供了MATLAB指令的用法示例。
摘要由CSDN通过智能技术生成

参考北京师范大学的《计算物理基础》

第七章-插值与拟合

计算物理基础_中国大学MOOC(慕课)​www.icourse163.org
6ca5bb52111d5b7fe1b0585eb2f2b813.png

1.拉格朗日插值法

已知函数f(x)的某些离散值,希望用函数g来逼近f,就会需要补充一些点的值,使其形成光滑的曲线,这种方法叫做插值法。

1.1插值分类

  • 按插值范围:内插、外插
  • 按插值方法:多项式插值、样条插值、曲线插值、分段插值

1.2拉格朗日插值法

  • 一次插值函数

ed1d84a762a616603f6f3525b35c2d83.png
  • 二次插值函数

b3123f13735b52646cb302eaa69ae536.png

281f07e373fcb164c24ab91c45777f49.png
  • 一般情况

给定函数

equation?tex=y%3Df%28x%29
equation?tex=n%2B1 个节点的函数值,要求出一个不超过n次的插值多项式。

59b058629182c1f3bbf44f93f71bdbcb.png

代码实现:

function test
x=1:6;
y=[16,18,21,17,15,12];
u=0.75:0.05:6.25;
v=polyinterp(x,y,u)
plot(x,y,'*:',u,v,'o')  %*:原数据点,o:新插入点,o:插值曲线,虚线:分段线性插值

function v=polyinterp(x,y,u) %x、y0是原有数据点,u是新插入的点
n=length(x); 
v=zeros(size(u));
for k=1:n 
    w=ones(size(u));
    for j=[1:k-1 k+1:n]
        w=(u-x(j))./(x(k)-x(j)).*w;
    end
v=v+w*y(k);
end

4e44faa11907f27ecb97d81a527bd294.png

2.插值指令的用法

2.1拉格朗日插值法与分段线性插值法的优缺点比较:

45542fb49e3adc39c13dd43f8b302825.png

它们是插值方法的两个极端,需要改进:

2.2改进思路:

  • 分段插值:将数据分成小区域插值;
  • 埃尔米特插值:使分段曲线光滑连接,连接点有一阶(二阶)导数。

不同方法对导数要求不同,指令pchip(保形分段三次插值:一阶导数连续)和spline(样条插值:二阶导数连续)是两种方法。

如何实现连接分段的插值曲线光滑且具有连续导数呢?

2.3 分段三次埃尔米特插值

4b900a194796603616b9f14040d4fb07.png

指令对端点导数值选择

cdc57e1aa22ac158cecbfe8a53defa66.png

matlab插值指令用法:x1是新插入的值

28b1e5d54af3fc917d564fc9986c410b.png
  • 实例:以正弦函数的10个值作为原始数据(红点),用4种方法(最近邻插值、线性插值、分段三次样条插值、保形分段三次插值)算41个插值点并画线。
x=0:10;
y=sin(x);
xi=0:.15:10;%插值点
yi1=interp1(x,y,xi,'nearest');
yi2=interp1(x,y,xi,'linear');
yi3=interp1(x,y,xi,'spline');
yi4=interp1(x,y,xi,'pchip');

subplot(2,2,1)
plot(x,y,'r*',xi,yi1)
subplot(2,2,2)
plot(x,y,'r*',xi,yi2)
subplot(2,2,3)
plot(x,y,'r*',xi,yi3)
subplot(2,2,4)
plot(x,y,'r*',xi,yi4)

6a7b441f5d42832c90e218dc2118f56c.png

可见,样条插值的曲线最光滑。

3.曲线拟合

3.1曲线拟合

曲线拟合:也叫函数逼近,是另一种插值方法。

本节:用最小二乘法作曲线拟合。

3.2曲线拟合与拉格朗日插值比较:

  • 拉格朗日插值:要求函数通过数据点、函数与数据点偏差为零;
  • 曲线拟合:不要求函数通过数据点、可用存在偏差,反映逼近程度。

3.3 插值函数与数据点的三种偏差准则

那么在曲线拟合中,如何估算插值函数与数据点的偏差呢?有以下三种偏差判断准则:(第三种是使用最广泛、计算比较简单的方法)

0d77c6d07c44ccc8187ab0ae7102225b.png

3.4 用多项式作为拟合函数所采用的计算公式:

  • 设所求插值函数是一个m次多项式
    equation?tex=p_%7Bm%7D%28x%29%28m%3Cn%29

equation?tex=p_%7Bm%7D%28x%29%3Da_%7B0%7D%2Ba_%7B1%7Dx%2B...a_%7Bm%7Dx%5E%7Bm%7D%3D%5Csum_%7Bj%3D0%7D%5E%7Bm%7Da_%7Bj%7Dx%5Ej
  • 选取多项式的系数
    equation?tex=a_%7Bj%7D 使得在
    equation?tex=x_%7Bi%7D%2Cy_%7Bi%7D 点有

equation?tex=%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Cdelta_%7Bi%7D%5E2%3D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5By_%7Bi%7D-P_%7Bm%7D%28x_%7Bi%7D%29%5D%5E2%3D%3DF%28a_%7B0%7D%2Ca_%7B1%7D%2C...%2Ca_%7Bm%7D%29

最小,由多元函数取极值的条件得:

equation?tex=%5Cfrac%7B%5Calpha+F%7D%7B%5Calpha+a_%7Bj%7D%7D%3D-2%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5By_%7Bi%7D-%5Csum_%7Bk%3D0%7D%5E%7Bm%7Da_%7Bk%7Dx_%7Bi%7D%5Ek%5Dx_%7Bi%7D%5Ej%3D0 ,将其整理,得

7464bc17c4e2615ad46b140a5b833aef.png

多项式拟合指令polyfit:matlab将多项式拟合开发成专用的指令,在指令的程序中使用了还能先进的算法来求解正则方程:

ployfit(X,Y,N):最小二乘法多项式拟合
polyval(P,X):计算多项式的值
X、Y:数据点及其函数值
N:拟合多项式的最高幂次
P:被求值的多项式系数,按降幂排列

例1

t=0:0.5:5;
s=1*t+0.2.*t.*t;%给定二次曲线数据点
s1=[0.5 -0.18 -0.01 0.13 0.1...%随机数列
0.31 -0.22 -0.31 0.2 0.4 -0.14];
ss=s+s1;%设定误差值
P=polyfit(t,ss,2) %二次曲线拟合
y=polyval(P,t);%计算拟合函数的值
plot(t,y,t,ss,'r*')

%输出结果
P =

    0.2261    0.8433    0.2345

3099a2d04d555bf4488f23c4b3b7d849.png

拟合曲线没有通过每一点,但是得到的的曲线很光滑。

例2:对比推导的正则方程组的解与用指令求得的解

48f55d78d82f0186c8784c78de4dace3.png

————————方程组解————————

设拟合多项式为

437cc2f322ea48bb38713fddc997c6a1.png

正则方程组为

51c5dbdd2dc30175a87387e7c49f3242.png

左除法求得方程的解为

0cfffc009bc58ac7ab0f5d1f10537313.png

代码:

A=[9,0,3.75;0,3.75,0;3.75,0,2.7656]; 
b=[18.1732;8.4842;7.6173];
X=Ab

%输出结果
X =

    2.0036
    2.2625
    0.0375

————————指令求解————————

用指令求解:

x=[-1 -0.75 -0.5 -0.25 0 0.25 0.5 0.75 1];
y=[-0.2209 0.3295 0.8826 1.4392 2.0003 2.5645 3.1334 3.7601 4.2836]; 
yi=polyfit(x,y,2)


%输出结果
yi =

    0.0379    2.2624    2.0034

可见,用指令得到的系数与用方程组解求得的系数相近。

4.曲线拟合工具箱

matlab中对曲线拟合采用的是工具箱方法来展现各种指令、进行拟合。

功能简介:

815b0747fcce4343c31f2ad966e06576.png

操作步骤:

4728d606710c63a523d4c353eabfbbce.png

例1

dfab7e8311147d775513eae057733d85.png

首先在实时脚本文件处输入数据t和I

>> t=0.2:0.1:0.8

t =

    0.2000    0.3000    0.4000    0.5000    0.6000    0.7000    0.8000

>> I=[3.16,2.38,1.75,1.34,1.00,0.74,0.56]

I =

    3.1600    2.3800    1.7500    1.3400    1.0000    0.7400    0.5600

输入cftool指令,启动曲线拟合工具箱,其页面布局有:数据输入、函数选择、拟合结果的偏差和公式,输出图形,将x data置为t、y data置为I,函数选择“Exponential”(指数函数),即可输出函数方程、图像、a和b的值,如下图所示

7e649a305d277018a38996a1e5cba6ec.png

例2

30d677acd3a95bf6c782ed07600c1897.png

首先在实时脚本文件处输入数据x和y

>> x=[40:10:400]/180*pi;%弧度表示
>> y=[0.02 0.04 0.1 0.21 0.39 0.46 0.63 0.72 0.81 0.91 0.96 0.92 0.84 0.72 0.5 0.33 0.18 0.08...
0.03 0.03 0.09 0.22 0.39 0.57 0.72 0.88 0.99 1.06 0.98 0.83 0.67 0.53 0.41 0.28 0.17 0.06 0.03];

将x data置为x、y data置为y,函数选择“Custom Equation”(自定义函数),在填框中输入函数形式“a*(cos(b*x+c))^2”,即可输出函数方程自变量a、b、c的值及拟合曲线,如下图所示

9aa706854015e73fa992a9008a122508.png

注:也可通过自动拟合“Auto fit”进行拟合、多次拟合。从而得到曲线和公式中的参数。

2020.12.12

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值