【数学建模】day04-插值与拟合
关于插值原理,这篇文章里总结过。
插值,是在有限个数据点的情况下,模拟出更多的点来适应实际问题的需要。
拟合,是在已知数据点基础上,以已知点处最小误差为标准,模拟出近似函数。
二者有似,实则不同,matlab提供了基本完整的解决方案。
一、插值
1. 一维插值
(1)拉格朗日插值
经典的拉格朗日插值并没有现成的函数。自行编写如下:
input: 相同维度的已知点x0,y0
output:x点处的插值y
function y = lagrange(x0,y0,x)
% 函数:已知点组(x0,y0),求x出的插值y
n = length(x0);
m = length(x);
for i = :m
z=x(i);
s=0.0;
for k = :n
p = 1.0;
for j = :n
if j~=k
p = p * (z-x0(j))/(x0(k)-x0(j));
end
end
s = p*y0(k)+s;
end
y(i) = s;
end(2)MATLAB一维插值工具箱
通用: y = interp1(x0,y0,x,’method’)
param:
x0、y0:已知数据点。要求x0必须单调,x0等距时,使用快速插值。
x:要插值的点,内插。matlab外插产生不确定值。
method:规定插值方法
有: 'linear':线性插值,如需要分段线性插值
'spline': 三次样条插值
'cubic' : 三次插值,如分段三次插值,即埃尔米特插值
'nearest':最近项插值,如果插值遇到外推产生不确定值,使用这个产生值去代替那些不确定值。
针对三次样条插值(常用),用法有:
- y = interp1(x0,y0,x,’spline’);
- y = spline(x0,y0,x);
- pp = csape(x0,y0,conds);
- pp = csape(x0,y0,conds,valconds), y = fnval(pp,x);%产生值
其中,D方法最常用,说明:
pp = csape(x0,y0,conds,valconds), y = fnval(pp,x)
param:
conds:指定插值的边界条件(三次样条插值需要2个边界条件)
'not-a-knot':非扭结条件,即强迫第1、2和倒数1、2个多项式三次导数亦相等
'complete':边界为一阶导数,一阶导数的值由valconds给出
'second':边界为二阶导数,二阶导数值由valconds给出
'periodic' :周期条件
valconds:见上,具体使用help csape
return:
返回pp对象,使用pp.coefs得到每个小区间上三次插值多项式的系数
使用y = fnval(pp,x)得到x处的插值
例子:分段线性以及三次插值,插值点如下
x
0
3
5
7
9
11
12
13
14
15
y
0
1.2
1.7
2.0
2.1
2.0
1.8
1.2
1.0
1.6
x0 = [,,,,,,,,,];
y0 = [,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6];
x = :0.1:;
y1 = interp1(x0,y0,x,'linear');%分段线性插值
y2 = interp1(x0,y0,x,'spline');%三次插值
pp1 = csape(x0,y0);
y3 = fnval(pp1,x);
pp2 = csape(x0,y0,'second');
y4 = fnval(pp2,x);
subplot(,,);
% subplot(,,)是指
%一个2行3列的图中从左到右从上到下的第一个位置
plot(x0,y0,'+',x,y1);
title('线性插值');
subplot(,,);
plot(x0,y0,'+',x,y2);
title('三次插值1');
subplot(,,);
plot(x0,y0,'+',x,y3);
title('三次插值2');
例:三次样条插值,并求出插值函数
样本点:
t 0.15 0.16 0.17 0.18 v 3.50 1.50 2.50 2.80 求解:
x0 = 0.15:0.01:0.18;
y0 = [3.5,1.5,2.5,2.8];
pp = csape(x0,y0);%默认条件是拉格朗日边界条件
format long g
xishu = pp.coefsxishu =
-616666.666666667 33500 -473.333333333334 3.5
-616666.666666667 15000 11.6666666666671 1.5
-616666.666666668 -3499.99999999999 126.666666666667 2.52. 二维插值
尤其是等高线绘制上,尤为重要。
二维插值特别注意维度问题。
matlab函数:
1、通用:z = interp2(x0,y0,z0,x,y,’method’)
param:
x0、y0:m维向量和n维向量,代表有m*n组数据点
z0:矩阵,n*m维,注意n是y0的维度
x、y:需要插值的点,注意x和y必须方向不同,表示有a*b组数据点
‘method’:同一维
return:
z矩阵,行数是y的维数,列数是x的维数,表示对应点处的插值
2、三次样条插值:pp = csape({x0,y0},z0,conds,valconds);
z = fnval(pp,{x,y});
param:
{x0,y0}:x0是m维,y0是n维
z0:m*n矩阵,注意这里m是x0的维度
其他同一维
return:
fnval的参数{x,y}是m*n,返回z是插值,是m*n维矩阵。
3、函数:插值节点为散乱点 ZI = griddata(x,y,z,XI,YI)
例:二次插值
已知高程部分点为:
每隔10m求插值点,并做曲面,求最高点
clear,clc
x = ::;
y = ::;
z=[ ];
pp = csape({x,y},z');
xi = ::;
yi = ::;
cz = fnval(pp,{xi,yi});
[i,j] = find(cz == max(max(cz)));%最大点的位置坐标,注意用法
x = xi(i); %用位置坐标求对应的x值
y = yi(j);
zmax = cz(i,j);
[X,Y] = meshgrid(yi,xi);
surf(X,Y,cz);hold on;求得最高点是:(170,180)处,z = 720.6252;
二、曲线拟合
1. 曲线拟合的最小二乘法以及matlab求解
最常用。用f(x)拟合数据点(x,y)。使得平方误差[f(x)-y]^2之和最小。求偏导以求系数。问题规范为:
min ||RA-Y||22
R是线性无关函数组成的矩阵,A是系数,Y是x点处的y值向量。
那么,matlab的求解命令为:
A = R\Y.
理解:求这类问题就是,构造R矩阵,一般为r1(x)=1,r2(x)=x,r3(x)=x^2;代入拟合已知点x1,x2…xn求得这个矩阵,至于Y,就是拟合已知点处的y值。求得A就是需要的系数。
MATLAB对于m次多项式拟合的命令为:
a = polyfit(x0,y0,m);y = polyval(a,x);%求x处的值
理解:利用(x0,y0)数值对,拟合m次多项式,规则为最小二乘规则。
matlab拟合工具箱:cftool命令打开。
注意:poly与plot区分。
例子:拟合形如y = a + b*x^2的经验公式,数据如下:
x = [,,,,]';
y = [19.0,32.3,49.0,73.3,97.8]';
%构造r矩阵
r = [ones(,),x.^];
ab = r\y;
x0 = :0.1:;
y0 = ab() + ab()*x0.^;
plot(x,y,'o',x0,y0,'r');
例子:利用matlab命令,拟合并画图。
分析:画散点图,分许趋势,选定多项式次数,求之。
x0 = ::;
%x = x';
y0 = [,,,,,,];
plot(x0,y0,'*');
%直线拟合
a = polyfit(x0,y0,);
y97 = polyval(a,)
y98 = polyval(a,)
y97 =
233.4286
y98 =
253.9286
2. 最小二乘优化
这类问题是无约束优化中,目标函数由若干个函数的平方构成。针对不同形式,有若干解决函数,比如:lsqlin、lsqcurvefit、lsqnonlin、lsqnonneg等。例子如下,用到查阅,不用记忆。
解决上面的例子:
拟合形如y = a + b*x^2的经验公式,数据如下:
3. 函数逼近的问题
这类问题是给定函数复杂, 但需对其分析,则可以用一个多项式(一般来说是这样)去逼近原函数。如何求这样的多项式函数。
问题规范为:
其中,y是被逼近函数的值,注意R矩阵的构造,(r1,r1)表示r1*r1。求系数向量a。
例:多项式函数H=span{1,x^2,x^4}逼近y =cos(x),x∈[-pi/2,pi/2];
syms x
base = [,x.^,x.^];
y1 = base.'*base
y2 = cos(x)*base.'
r1 = int(y1,-pi/,pi/)
r2 = int(y2,-pi/,pi/)
a = r1\r2 %核心命令
xishu1 = double(a)
xishu2 = vpa(a,)其中注意:
【数学建模】day04-插值与拟合的更多相关文章
- 数学建模三剑客MSN
前言 不管是不是巴萨的球迷,只要你喜欢足球,就一定听说过梅西(Messi).苏亚雷斯(Suarez)和内马尔(Neymar)这个MSN组合.在众多的数学建模辅助工具中,也有一个犀利无比的MSN组合,他 ...
- Python小白的数学建模课-12.非线性规划
非线性规划是指目标函数或约束条件中包含非线性函数的规划问题,实际就是非线性最优化问题. 从线性规划到非线性规划,不仅是数学方法的差异,更是解决问题的思想方法的转变. 非线性规划问题没有统一的通用方法, ...
- 【数学建模】day07-数理统计II
方差分析和回归分析. 用数理统计分析试验结果.鉴别各因素对结果影响程度的方法称为方差分析(Analysis Of Variance),记作 ANOVA. 比如:从用不同工艺制作成的灯泡中,各自抽取了若 ...
- 数学建模:1.概述& 监督学习--回归分析模型
数学建模概述 监督学习-回归分析(线性回归) 监督学习-分类分析(KNN最邻近分类) 非监督学习-聚类(PCA主成分分析& K-means聚类) 随机算法-蒙特卡洛算法 1.回归分析 在统计学 ...
- 2018数学建模国赛总结(A题/编程选手视角)
2018数学建模已经告一段落了,先说说基本情况吧,我们队伍专业分别为:金融(A),会计(B),计算机(我),配置还算可以,他们俩会数据分析软件也会写论文,我可以写代码,画图.他们俩打过美赛(M奖),我 ...
- Matlab随笔之插值与拟合(上)
原文:Matlab随笔之插值与拟合(上) 1.拉格朗日插值 新建如下函数: function y=lagrange(x0,y0,x) %拉格朗日插值函数 %n 个节点数据以数组 x0, y0 输入(注 ...
- Matlab与数学建模
一.学习目标. (1)了解Matlab与数学建模竞赛的关系. (2)掌握Matlab数学建模的第一个小实例—评估股票价值与风险. (3)掌握Matlab数学建模的回归算法. 二.实例演练. 1.谈谈你 ...
- Python小白的数学建模课-A1.国赛赛题类型分析
分析赛题类型,才能有的放矢. 评论区留下邮箱地址,送你国奖论文分析 『Python小白的数学建模课 @ Youcans』 带你从数模小白成为国赛达人. 1. 数模竞赛国赛 A题类型分析 年份 题目 要 ...
- Python小白的数学建模课-09 微分方程模型
小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型的建模与求解,通过常微分方程.常微分方程组.高阶常微分方程 3个案例手 ...
- Python小白的数学建模课-B5. 新冠疫情 SEIR模型
传染病的数学模型是数学建模中的典型问题,常见的传染病模型有 SI.SIR.SIRS.SEIR 模型. 考虑存在易感者.暴露者.患病者和康复者四类人群,适用于具有潜伏期.治愈后获得终身免疫的传染病. 本 ...
随机推荐
- [翻译] .NET Standard 2.1 公布
[翻译] .NET Standard 2.1 公布 原文: Announcing .NET Standard 2.1 校对: Cloud 自从大约一年前发布 .NET Standard 2.0以来,我 ...
- disconf原理 “入坑”指南
之前有了解过disconf,也知道它是基于zookeeper来做的,但是对于其运行原理不太了解,趁着周末,debug下源码,也算是不枉费周末大好时光哈 :) .关于这篇文章,笔者主要是参考discon ...
- NetCore实践篇:分布式监控客户端ZipkinTracer从入门到放弃之路
前言 本文紧接上篇.Net架构篇:思考如何设计一款实用的分布式监控系统?,上篇仅仅是个思考篇,跟本文没有太大的关系.但有思考,结合现有的开源组件,实践起来更易理解起来,所以看本文之前,应该先看下上篇博 ...
- Faster R-CNN:详解目标检测的实现过程
本文详细解释了 Faster R-CNN 的网络架构和工作流,一步步带领读者理解目标检测的工作原理,作者本人也提供了 Luminoth 实现,供大家参考. Luminoth 实现:https:// ...
- python-re模块-54
import re # findall # search # match ret = re.findall('[a-z]+', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列 ...
- 小L的项链切割 (回文串)
题目描述 小T送给了小L了一串项链.为了方便,我们把项链上形态不同钻石用不同的字母表示.这样小L的项链就变成了一个字符串.小L忽然想把这串项链优美地切割一下,她想把它切割成尽量少的回文项链,啊也就是回 ...
- 每周分享之JS数组的使用
数组,一堆数字归为一组,就是一个数组,一堆对象放在一个组里,也是一个数组,概念很容易懂,说白了就是一个有限集合. JS数组的语法无法两种,插入和移除(语法自行科普).用处挺常见的,既然数组是一个集合, ...
- PAT L2-016 愿天下有情人都是失散多年的兄妹
https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 呵呵.大家都知道五服以内不得通婚,即两个人最 ...
- Azure系列2.1 —— com.microsoft.azure.storage.blob
网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习心得做下笔记,文中不正确地方请大家指正. Azure Blob ...
- 【转帖】介绍 .NET Standard
[译]介绍 .NET Standard https://zhuanlan.zhihu.com/p/24267356 跟开发争执过 自己不会写代码 的确不好. 若有任何对翻译的建议,烦请指正 有任何问题 ...


















