参考北京师范大学的《计算物理基础》
第七章-插值与拟合
计算物理基础_中国大学MOOC(慕课)www.icourse163.org![6ca5bb52111d5b7fe1b0585eb2f2b813.png](https://i-blog.csdnimg.cn/blog_migrate/1496d5fd383d53ec21766c2f1ad6a867.png)
1.拉格朗日插值法
已知函数f(x)的某些离散值,希望用函数g来逼近f,就会需要补充一些点的值,使其形成光滑的曲线,这种方法叫做插值法。
1.1插值分类
- 按插值范围:内插、外插
- 按插值方法:多项式插值、样条插值、曲线插值、分段插值
1.2拉格朗日插值法
- 一次插值函数
![ed1d84a762a616603f6f3525b35c2d83.png](https://i-blog.csdnimg.cn/blog_migrate/68ce4ff1c3337124186146e3376ccbcd.jpeg)
- 二次插值函数
![b3123f13735b52646cb302eaa69ae536.png](https://i-blog.csdnimg.cn/blog_migrate/08f6991d541a3180e22b7fc46978c676.jpeg)
![281f07e373fcb164c24ab91c45777f49.png](https://i-blog.csdnimg.cn/blog_migrate/555cfb7e9eb36742fb1454d6dc3ef833.jpeg)
- 一般情况
给定函数
![59b058629182c1f3bbf44f93f71bdbcb.png](https://i-blog.csdnimg.cn/blog_migrate/9bc38010fe7a46351df74edd3e44b25c.jpeg)
代码实现:
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](https://i-blog.csdnimg.cn/blog_migrate/f69aafee5b87142907bb41d833e71826.jpeg)
2.插值指令的用法
2.1拉格朗日插值法与分段线性插值法的优缺点比较:
![45542fb49e3adc39c13dd43f8b302825.png](https://i-blog.csdnimg.cn/blog_migrate/8e86910eed592ee35b283c1861e6dd5f.png)
它们是插值方法的两个极端,需要改进:
2.2改进思路:
- 分段插值:将数据分成小区域插值;
- 埃尔米特插值:使分段曲线光滑连接,连接点有一阶(二阶)导数。
不同方法对导数要求不同,指令pchip(保形分段三次插值:一阶导数连续)和spline(样条插值:二阶导数连续)是两种方法。
如何实现连接分段的插值曲线光滑且具有连续导数呢?
2.3 分段三次埃尔米特插值
![4b900a194796603616b9f14040d4fb07.png](https://i-blog.csdnimg.cn/blog_migrate/894424f8af1c34f1fbae1d842b14c8d8.jpeg)
指令对端点导数值选择
![cdc57e1aa22ac158cecbfe8a53defa66.png](https://i-blog.csdnimg.cn/blog_migrate/38e71c458ae7adf6f22f788b875b40e8.jpeg)
matlab插值指令用法:x1是新插入的值
![28b1e5d54af3fc917d564fc9986c410b.png](https://i-blog.csdnimg.cn/blog_migrate/40beff818d622bd8a57bece90cf96f29.jpeg)
- 实例:以正弦函数的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](https://i-blog.csdnimg.cn/blog_migrate/9db3498430d47468609e51c8198f93b9.jpeg)
可见,样条插值的曲线最光滑。
3.曲线拟合
3.1曲线拟合
曲线拟合:也叫函数逼近,是另一种插值方法。
本节:用最小二乘法作曲线拟合。
3.2曲线拟合与拉格朗日插值比较:
- 拉格朗日插值:要求函数通过数据点、函数与数据点偏差为零;
- 曲线拟合:不要求函数通过数据点、可用存在偏差,反映逼近程度。
3.3 插值函数与数据点的三种偏差准则
那么在曲线拟合中,如何估算插值函数与数据点的偏差呢?有以下三种偏差判断准则:(第三种是使用最广泛、计算比较简单的方法)
![0d77c6d07c44ccc8187ab0ae7102225b.png](https://i-blog.csdnimg.cn/blog_migrate/e2fc54dd667735e7d736536b1abda653.jpeg)
3.4 用多项式作为拟合函数所采用的计算公式:
- 设所求插值函数是一个m次多项式
![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](https://i-blog.csdnimg.cn/blog_migrate/5a73e8b5a9f01d1e1a064319b7ad82d8.png)
- 选取多项式的系数
使得在
点有
![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](https://i-blog.csdnimg.cn/blog_migrate/a13d908815cd673fe064802840662bd8.png)
最小,由多元函数取极值的条件得:
![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](https://i-blog.csdnimg.cn/blog_migrate/6d8eaab1148835eb37c981f670d81044.png)
![7464bc17c4e2615ad46b140a5b833aef.png](https://i-blog.csdnimg.cn/blog_migrate/e22e114dd79c77243cd54bb9b14515b9.jpeg)
多项式拟合指令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](https://i-blog.csdnimg.cn/blog_migrate/49031f9f0f3a82c92e00864a00aaf73d.jpeg)
拟合曲线没有通过每一点,但是得到的的曲线很光滑。
例2:对比推导的正则方程组的解与用指令求得的解
![48f55d78d82f0186c8784c78de4dace3.png](https://i-blog.csdnimg.cn/blog_migrate/00a017977195052cf9c715dc2ddca226.jpeg)
————————方程组解————————
设拟合多项式为
![437cc2f322ea48bb38713fddc997c6a1.png](https://i-blog.csdnimg.cn/blog_migrate/999f56211b04cfa770d4170f77d81ead.jpeg)
正则方程组为
![51c5dbdd2dc30175a87387e7c49f3242.png](https://i-blog.csdnimg.cn/blog_migrate/b55f5fab5e5eb714ca8f5923e3f8d663.jpeg)
左除法求得方程的解为
![0cfffc009bc58ac7ab0f5d1f10537313.png](https://i-blog.csdnimg.cn/blog_migrate/ef5296b94c3103facf619bfd68b72f1d.jpeg)
代码:
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](https://i-blog.csdnimg.cn/blog_migrate/ea20640dc179bc2890882b7e608ce9d7.jpeg)
操作步骤:
![4728d606710c63a523d4c353eabfbbce.png](https://i-blog.csdnimg.cn/blog_migrate/c8a544850d41e0fba78f1cbdaad3c958.jpeg)
例1:
![dfab7e8311147d775513eae057733d85.png](https://i-blog.csdnimg.cn/blog_migrate/f9a4afeff2879102191531e287ceb64f.jpeg)
首先在实时脚本文件处输入数据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](https://i-blog.csdnimg.cn/blog_migrate/5488ced3c3610fc53dae5c452708f925.jpeg)
例2:
![30d677acd3a95bf6c782ed07600c1897.png](https://i-blog.csdnimg.cn/blog_migrate/15f4afdd142f668df13359f62c987427.jpeg)
首先在实时脚本文件处输入数据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](https://i-blog.csdnimg.cn/blog_migrate/c13f024a0c517da99056eeea0b3884eb.jpeg)
注:也可通过自动拟合“Auto fit”进行拟合、多次拟合。从而得到曲线和公式中的参数。
2020.12.12