MATLAB拟合和插值
定义
插值和拟合:
曲线拟合是指您拥有散点数据集并找到最适合数据一般形状的线(或曲线)。
插值是指您有两个数据点并想知道两者之间的值是什么。中间的一半是他们的平均值,但如果你只想知道两者之间的四分之一,你必须插值。
拟合
我们着手写一个线性方程图的拟合:
y=3x^3+2x^2+x+2
首先我们生成一组数据来分析:
x=-5:0.5:5;
e=50*rand(1,length(x))-25;%制造[-25,25]的随机数作为误差
y=3*x.^3+2*x.^2+x+2+e;%得到y值
plot(x,y,'.')
x =
Columns 1 through 6
-5.0000 -4.5000 -4.0000 -3.5000 -3.0000 -2.5000
Columns 7 through 12
-2.0000 -1.5000 -1.0000 -0.5000 0 0.5000
Columns 13 through 18
1.0000 1.5000 2.0000 2.5000 3.0000 3.5000
Columns 19 through 21
4.0000 4.5000 5.0000
y =
Columns 1 through 6
-350.0110 -248.6360 -169.3421 -89.5653 -88.2298 -57.7238
Columns 7 through 12
-32.5505 2.3308 11.5861 9.0123 -0.4538 5.7254
Columns 13 through 18
-2.1840 30.3596 20.4478 73.2138 88.1756 152.0492
Columns 19 through 21
236.2809 334.3864 411.0563
这时候x,y作为已知数据存在,要求我们拟合x,y的散点图,这时候会用到polyfit这个函数。
语法
p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)
[p,S,mu] = polyfit(x,y,n)
说明
p = polyfit(x,y,n) 返回阶数为 n 的多项式 p(x) 的系数,该阶数是 y 中数据的最佳拟合(在最小二乘方式中)。p 中的系数按降幂排列,p 的长度为 n+1
[p,S] = polyfit(x,y,n) 还返回一个结构体 S,后者可用作 polyval 的输入来获取误差估计值。
[p,S,mu] = polyfit(x,y,n) 还返回 mu,后者是一个二元素向量,包含中心化值和缩放值。mu(1) 是 mean(x),mu(2) 是 std(x)。使用这些值时,polyfit 将 x 的中心置于零值处并缩放为具有单位标准差
plot(x,y,'.')%已知数据的散点图
hold on
d=polyfit(x,y,2);%进行线性拟合,假设函数为二次函数
y1=d(1)*x.^2+d(2)*x+d(3);
plot(x,y1)//绘制猜测的函数

明显不符合,我们继续猜测
plot(x,y,'.')
hold on
d=polyfit(x,y,3);
y1=d(1)*x.^3+d(2)*x.^2+d(3)*x+d(4);
plot(x,y1)

拟合成功。
插值
一维插值
以上面的数据为例子
x=-5:0.5:5;
e=50*rand(1,length(x))-25;%制造[-25,25]的随机数作为误差
y=3*x.^3+2*x.^2+x+2+e;%得到y值
%插值
x2=-5:0.1:5;
y2=interp1(x,y,'x2,'spline');
plot(x2,y2,'r+')

二维插值
语法
[X,Y] = meshgrid(x,y)
[X,Y] = meshgrid(x)
[X,Y,Z] = meshgrid(x,y,z)
[X,Y,Z] = meshgrid(x)
说明
[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。X 是一个矩阵,每一行是 x 的一个副本;Y 也是一个矩阵,每一列是 y 的一个副本。坐标 X 和 Y 表示的网格有 length(y) 个行和 length(x) 个列。
[X,Y] = meshgrid(x) 与 [X,Y] = meshgrid(x,x) 相同,并返回网格大小为 length(x)×length(x) 的方形网格坐标。
[X,Y,Z] = meshgrid(x,y,z) 返回由向量 x、y 和 z 定义的三维网格坐标。X、Y 和 Z 表示的网格的大小为 length(y)×length(x)×length(z)。
[X,Y,Z] = meshgrid(x) 与 [X,Y,Z] = meshgrid(x,x,x) 相同,并返回网格大小为 length(x)×length(x)×length(x) 的三维网格坐标。
我们先绘制一个三维的图像
[x,y]=meshgrid(-5:1:5,-10:2:10);
z=12-x.^3-y.^3;
surf(x,y,z)

给人的感觉是很“粗糙”的,这时候我们使用插值,增加数据。
[x0,y0]=meshgrid(-5:0.2:5,-10:0.4:10);
z0=interp2(x,y,z,x0,y0,'spline');
surf(x0,y0,z0)

例题
例1
1、已知以下实验测量数据,
|
\* MERGEFORMAT |
1 |
1.5 |
2.5 |
3 |
4.5 |
|
\* MERGEFORMAT |
-0.86 |
13.66 |
90.25 |
152.57 |
473.70 |
(1)请画出以上数据的散点图;
(2)请用合适的多项式拟合上述数据;
(3)请用三次样条一次插值以上数据.
2、已知网格化数据如下:
|
\* MERGEFORMAT
\* MERGEFORMAT |
-1 |
-0.5 |
0 |
0.5 |
1 |
|
-2 |
1.77 |
1.12 |
0.32 |
0.44 |
-2.35 |
|
-1 |
1.62 |
1.29 |
0.94 |
-1.49 |
-0.78 |
|
0 |
0.23 |
-1.01 |
-0.74 |
1.08 |
-0.13 |
|
1 |
-0.61 |
-0.41 |
-0.63 |
-0.05 |
1.44 |
|
2 |
-2.94 |
-0.22 |
0.56 |
0.17 |
1.73 |
请用三次样条二次插值法插出更光滑精细的曲面.
答案
%1-(1)
clc,clear
x=[1 1.5 2.5 3 4.5];
y=[-0.86 13.66 90.25 152.57 473.70];
plot(x,y,'.'); %1-(2)
d=polyfit(x,y,1);
y1=d(1)*x+d(2);
plot(x,y,'.');
plot(x,y1);%对比线性图与散点图,发现不匹配
d=polyfit(x,y,2);
y1=d(2)*x.^2+d(2)*x+d(3);
plot(x,y,'.');
plot(x,y1);%对比线性图与散点图,发现匹配成功,拟合完成 %1-(3)
x=[1 1.5 2.5 3 4.5];
y=[-0.86 13.66 90.25 152.57 473.70];
x1=[1:0.1:4.5];
y1=interp1(x,y,x1,'spline');
plot(x,y,x1,y1); %2
[x1,y1]=meshgrid(-2:1:2,-1:0.5:1);
z1=[1.77 1.21 0.32 0.44 -2.35;1.62 1.29 0.94 -1.49 -0.78;0.23 -1.01 -0.74 1.08 -0.13;...
-0.61 -0.41 -0.63 -0.05 1.44;-2.94 -0.22 0.56 0.17 1.73];
surf(x1,y1,z1)
[x,y]=meshgrid(-1:0.1:1, -2:0.2:2);
z=interp2(x1,y1,z1,x,y,'spline');
surf(x,y,z)
例2

数据:点击下载
实际任务就是sheet2中中的元素,只给了单周的元素数据,没有给偶数周,这就需要我们插值出来
答案
clc,clear
%% 读取数据
ydatas = xlsread('data1.xls',2,'C5:J17');
% 清除无效数据
ydatas(9:10,:)=[]; %% 绘图准备
% y坐标轴名称
yname = ["周数","轮虫(10^6/L)","溶氧(mg/l)","COD(mg/l)","水温(℃)","PH值","盐度","透明度(cm)","总碱度","氯离子","透明度","生物量"];
% yname = {'轮虫(10^6/L)','溶氧(mg/l)','COD(mg/l)','水温(℃)','PH值','盐度','透明度(cm)','总碱度','氯离子','透明度','生物量'};
% x坐标
xdatas = 1:2:15;
xval = 1:15; %% 线性插值
figure(1)
yval1 = [];
for index=1:11
tmp = interp1(xdatas,ydatas(index,:),xval,'linear');
yval1 = [yval1;tmp];
subplot(3,4,index)
plot(xdatas,ydatas(index,:),'*',xval,tmp,'--r')
xlabel('时间/周');
ylabel(yname(index+1))
legend('原始数据','线性插值数据')
end %% 三次样条插值
figure(2)
yval2 = [];
for index=1:11
tmp = interp1(xdatas,ydatas(index,:),xval,'spline');
yval2 = [yval2;tmp];
subplot(3,4,index)
plot(xdatas,ydatas(index,:),'*',xval,tmp,'--r')
xlabel('时间/周');
ylabel(yname(index+1))
legend('原始数据','三次样条插值数据')
end %% 三次多项式插值
figure(3)
yval3 = [];
for index=1:11
tmp = interp1(xdatas,ydatas(index,:),xval,'pchip');
yval3 = [yval3;tmp];
subplot(3,4,index)
plot(xdatas,ydatas(index,:),'*',xval,tmp,'--r')
xlabel('时间/周');
ylabel(yname(index+1))
legend('原始数据','三次多项式插值数据')
end
%% 数据存储
new_data1 = [xval;yval1];
new_data1 = [yname',new_data1];
xlswrite('output.xls',new_data1,'Sheet1');
new_data2 = [xval;yval2];
new_data2 = [yname',new_data2];
xlswrite('output.xls',new_data2,'Sheet2');
new_data3 = [xval;yval3];
new_data3 = [yname',new_data3];
xlswrite('output.xls',new_data3,'Sheet3');



输出结果数据:https://www.lanzous.com/iau54la
例3

数据下载:点击下载
答案
clc,clear
%%
xdatas = xlsread('data2.xlsx','A2:A11');
ydatas = xlsread('data2.xlsx','B2:B11');
a=polyfit(xdatas,ydatas,1);
y1=a(1)*xdatas+a(2);
subplot(3,2,1)
plot(xdatas,y1,'r-',xdatas,ydatas,'*')
title('一次拟合');
xlabel('年份');
ylabel('人口/万');
y1_datas = a(1)*xdatas+a(2);
ssr1 = sum((y1_datas-mean(ydatas)).^2);
sst1 = sum((ydatas-mean(ydatas)).^2);
r1_sq = ssr1/sst1;
txt = ['R^2=' num2str(r1_sq)];
text(2010,138000,txt) %%
b=polyfit(xdatas,ydatas,2);
y2=b(1)*xdatas.^2+b(2)*xdatas+b(3);
subplot(3,2,2)
plot(xdatas,y2,'r-',xdatas,ydatas,'*')
title('二次拟合');
xlabel('年份');
ylabel('人口/万');
y2_datas = b(1)*xdatas.^2+b(2)*xdatas+b(3);
ssr2 = sum((y2_datas-mean(ydatas)).^2);
sst2 = sum((ydatas-mean(ydatas)).^2);
r2_sq = ssr2/sst2;
txt = ['R^2=' num2str(r2_sq)];
text(2010,138000,txt) %%
c=polyfit(xdatas,ydatas,3);
y3=c(1)*xdatas.^3+c(2)*xdatas.^2+c(3)*xdatas+c(4);
subplot(3,2,3)
plot(xdatas,y3,'r-',xdatas,ydatas,'*')
title('三次拟合');
xlabel('年份');
ylabel('人口/万');
y3_datas = c(1)*xdatas.^3+c(2)*xdatas.^2+c(3)*xdatas+c(4);
ssr3 = sum((y3_datas-mean(ydatas)).^2);
sst3 = sum((ydatas-mean(ydatas)).^2);
r3_sq = ssr3/sst3;
txt = ['R^2=' num2str(r3_sq)];
text(2010,138000,txt) %%
d=polyfit(xdatas,ydatas,4);
y4=d(1)*xdatas.^4+d(2)*xdatas.^3+d(3)*xdatas.^2+d(4)*xdatas+d(5);
subplot(3,2,4)
plot(xdatas,y4,'r-',xdatas,ydatas,'*')
title('四次拟合');
xlabel('年份');
ylabel('人口/万');
y4_datas = d(1)*xdatas.^4+d(2)*xdatas.^3+d(3)*xdatas.^2+d(4)*xdatas+d(5);
ssr4 = sum((y4_datas-mean(ydatas)).^2);
sst4 = sum((ydatas-mean(ydatas)).^2);
r4_sq = ssr4/sst4;
txt = ['R^2=' num2str(r4_sq)];
text(2010,138000,txt) %%
e=polyfit(xdatas,ydatas,5);
y5=e(1)*xdatas.^5+e(2)*xdatas.^4+e(3)*xdatas.^3+e(4)*xdatas.^2+e(5)*xdatas+e(6);
subplot(3,2,5)
plot(xdatas,y5,'r-',xdatas,ydatas,'*')
title('五次拟合');
xlabel('年份');
ylabel('人口/万');
y5_datas = e(1)*xdatas.^5+e(2)*xdatas.^4+e(3)*xdatas.^3+e(4)*xdatas.^2+e(5)*xdatas+e(6);
ssr5 = sum((y5_datas-mean(ydatas)).^2);
sst5 = sum((ydatas-mean(ydatas)).^2);
r5_sq = ssr5/sst5;
txt = ['R^2:' num2str(r5_sq)];
text(2010,138000,txt)

通过对数据拟合,对比确定系数,反应拟合效果,确定出最佳拟合函数为四次拟合函数:y = 0.26*x^4-2.06*x^3+6.21*x^2-8.32*x+4.19
MATLAB拟合和插值的更多相关文章
- Matlab随笔之插值与拟合(上)
原文:Matlab随笔之插值与拟合(上) 1.拉格朗日插值 新建如下函数: function y=lagrange(x0,y0,x) %拉格朗日插值函数 %n 个节点数据以数组 x0, y0 输入(注 ...
- Matlab随笔之插值与拟合(下)
原文:Matlab随笔之插值与拟合(下) 1.二维插值之插值节点为网格节点 已知m x n个节点:(xi,yj,zij)(i=1…m,j=1…n),且xi,yi递增.求(x,y)处的插值z. Matl ...
- Matlab曲面拟合和插值
插值和拟合都是数据优化的一种方法,当实验数据不够多时常常须要用到这样的方法来绘图. 在matlab中都有特定的函数来完毕这些功能. 这两种方法的确别在于: 当測量值是准确的,没有误差时,一般用插值: ...
- 转Python SciPy库——拟合与插值
1.最小二乘拟合 实例1 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq p ...
- matlab学习——05插值和拟合(黄河小浪底调水调沙问题)
05插值和拟合 黄河小浪底调水调沙问题 data3.txt 1800 1900 2100 2200 2300 2400 2500 2600 2650 2700 2720 2650 32 60 75 8 ...
- matlab学习——05插值和拟合(一维二维插值,拟合)
05插值和拟合 1.一维插值 (1) 机床加工零件,试用分段线性和三次样条两种插值方法计算.并求x=0处的曲线斜率和13<=x<=15范围内y的最小值. x0=[0 3 5 7 9 11 ...
- MATLAB学习(七)求解优化问题:线性规划 非线性规划 拟合与插值 多目标规划
Minf(x)=-5x1 -4x2 -6x3 x1 -x2 +x3 <=20 3x1 +2x2 +4x3 <=42 ...
- matlab二维插值--interp2与griddata
二者均是常用的二维插值方法,两者的区别是, interp2的插值数据必须是矩形域(X,Y必须分别是单调向量),即已知数据点(x,y)组成规则的矩阵,或称之为栅格,可使用meshgid生成. gridd ...
- matlab拟合函数的三种方法
方法一:多项式拟合polyfit 1 x=[1 2 3 4 5 6 7 8 9]; 2 3 y=[9 7 6 3 -1 2 5 7 20]; 4 P= polyfit(x, y, 3) %三阶多项式拟 ...
随机推荐
- CSS 形状绘制
最后一个 先放代码 <style type="text/css"> #heart { positio ...
- C# Timer 用法
System.Timers.Timer,通过.NET Thread Pool实现的,轻量,计时精确,对应用程序.消息没有特别的要求. using Timer = System.Timers.Tim ...
- Visual Studio Error
Visual Studio Error 注意:文中所有“系统”用词,均指Windows Console操作系统IO Debug Error 错误类型 #0表示调用约定错误 可以考虑在指针前面加上_st ...
- BlangenOA项目展示(附源码)
1. 登录界面 1.1表单校验 1.2信息有误 1.3正在登录 2.桌面 3.用户管理 3.1添加 3.2删除 3.3编辑 3.4设置用户角色 3.5设置用户权限 4.角色管理 5.权限管理(菜单 ...
- 4.Python的版本
Python2: 英文支持没问题,中文报错,默认编码:ascii码 显示中午需要添加代码在首行:# -*- encoding:utf -8 -*- 用户交互 raw_input python2 里还 ...
- todolist作业涉及知识点
window.event对象详细介绍 1.event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定 ...
- linux上 查看mysql的binglog日志
查看mysqlbinglog日志 mysqlbinlog --no-defaults --database=数据库名称 --start-datetime= > /mysql.txt 备注: -- ...
- centos6.3 配置 smb 服务
1.安装 samba 以及相关依赖包:yum install samba samba-client samba-swat 2.添加 smb 服务用户:smbpasswd -a user_name(之后 ...
- [Swift实际操作]八、实用进阶-(6)通过属性进行对象间的消息传递
本文将演示,如何通过一个对象作为另一个对象的属性,从而通过设置属性的值,来实现对象之间的消息传递.首先打开自定义视图的代码文件(CustomView.swift) import UIKit //使当前 ...
- 队列优化dijsktra(SPFA)的玄学优化
转载:大佬博客 最近想到了许多优化spfa的方法,这里想写个日报与大家探讨下 前置知识:spfa(不带任何优化) 由于使用较多 STLSTL ,本文中所有代码的评测均开启 O_2O2 优化 对一些数 ...

