数学建模学习笔记——插值与拟合

2023-11-15


本文章为《数学建模算法与应用(司守奎)》书籍的学习笔记,文章内代码大部分为该书籍的搬运,主要目的为简化阅读的过程,以便直接实现代码的运用,我也会对书中的习题给出自己的解。

一、基础知识储备

1.插值

1.1.拉格朗日插值

function y=lagrange(x0,y0,x); %拉格朗日函数,新建一个.m文件。
%x0,y0为已知数据点的向量,x为待求点的向量
n=length(x0);m=length(x); 
for i=1:m 
	z=x(i); 
	s=0.0; 
	for k=1:n 
		p=1.0; 
		for j=1: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

1.2.牛顿插值

牛顿插值与拉格朗日插值的区别是牛顿插值的高阶插值方程可以由低阶方程递推而来。

%已知数据点
X = [1 2 3 4 5 6];
Y = [-3,0,15,48,105,192];
n = length(X);
D = zeros(n,n);
D(:,1) = Y';
for j = 2:n
	for k = j:n
	D(k,j) = (D(k,j-1)-D(k-1,j-1))/(X(k)-X(k-j+1));
	end
end
%D为差商表,产生的D的对角线上的元素即为牛顿插值方程从前往后的每一项的系数
C = D(n,n)
for k = (n-1):-1:1
	C = conv(C,poly(X(k)));
	m = length(C);
	C(m) = C(m)+D(k,k);
end
%最终C的第i个元素为多项式中次数(n-i)的项的系数

1.3.分段线性插值

%常用,x0,y0为已知数据向量,y0可为矩阵,当为矩阵时,该函数对x0和y0的每一列进行拟合,
%返回和y0同样维数的矩阵,x为待求向量,method为可选函数方法,具体内容请查阅官方文档。
%该函数也可以对复数和日期与时间进行插值。
y = interp1(x0,y0,x,'method') 
pp = interp1(x,v,method,'pp')
%使用method算法返回分段多项式形式的v(x)。用y = ppval(pp,x)计算函数值。

1.4.Hermite插值

function y=hermite(x0,y0,y1,x); %Hermite插值函数,新建一个.m文件。
%设n个节点的数据以数组x0(已知点的横坐标),y0(函数值),y1(导数值)
%输入,m个插值点以数组x输入,输出数组y为m个插值。
n=length(x0);m=length(x); 
for k=1:m 
	yy=0.0; 
	for i=1:n 
		h=1.0; 
		a=0.0; 
		for j=1:n 
			if j~=i 
			h=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2; 
			a=1/(x0(i)-x0(j))+a; 
		end 
	end 
	yy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i)); 
	end 
	y(k)=yy; 
end

1.5.三次样条插值

%spline
y=interp1(x0,y0,x,'spline');
y=spline(x0,y0,x);
pp=csape(x0,y0,conds),y=ppval(pp,x)
%conds为边界条件,可以使用官方自带的参数,也可以自己定义边界条件,自己定义边界条件时,
%pp = csape(x0,y0_ext,conds),此时conds为1*2的元素为12的矩阵,1,2代表边界条件为
%几阶导数,yo_ext= [左边界值 y0 有边界值]

1.6.B样条函数插值

搞不懂啊,实现插值还可以用griddedInterpolant(网格点)或scatteredInterpolant(散点)函数实现,包括内部插值和外部插值。

1.7.二维插值

%插值节点为网格点——
z=interp2(x0,y0,z0,x,y,'method') 
%其中x0,y0分别为m维和n维向量,表示节点,z0为n×m维矩阵,用法同一维。
pp=csape({x0,y0},z0,conds,valconds),z=fnval(pp,{x,y}) 
%其中x0,y0分别为m维和n维向量,z0为m×n维矩阵,z为矩阵,用法同一维。
%插值节点为散乱点——
zi=griddata(x,y,z,xi,yi','cubic')

2.曲线拟合的线性最小二乘法

2.1.线性最小二乘法

基本思想为找到一个曲线,使该曲线上对应点与已知点的差的平方和最小,要进行较好的拟合,我们首先可以打印所有的数据点,观察数据点满足何种曲线,然后用该曲线去拟合数据点,常用曲线有直线,多项式,双曲线,指数曲线。

%用最小二乘法拟合x,y到曲线y=a+bX^2
x=[19 25 31 38 44]'; 
y=[19.0 32.3 49.0 73.3 97.8]'; 
r=[ones(5,1),x.^2]; 
ab=r\y%最小二乘法的解方程组法,直接左除。
x0=19:0.1:44; 
y0=ab(1)+ab(2)*x0.^2; 
plot(x,y,'o',x0,y0,'r')

2.2.多项式拟合方法

a=polyfit(x0,y0,m) 
%其中输入参数x0,y0为要拟合的数据m为拟合多项式的次数,输出参数a为拟合多项式
%y=amx^m++a1x+a0系数a=[am,,a1,a0]
%计算指定点函数值使用函数y=polyval(a,x)

3.最小二乘优化

目标函数由若干个函数的平方和组成。

3.1.最小二乘优化函数

%最小二乘优化的四个函数
%lsqlin、lsqcurvefit、lsqnonlin、lsqnonneg
%具体使用方法查阅官方文档

3.2.cftool工具箱用法

4.曲线拟合与函数逼近

前面讲的曲线拟合是已知一组离散数据{(xi , yi),i =1,L,n},选择一个较简单的函数f(x),如多项式,在一定准则如最小二乘准则下,最接近这些数据。如果已知一个较为复杂的连续函数 y(x), x ∈[a,b],要求选择一个较简单的函数f (x),在一定准则下最接近 f (x),就是所谓函数逼近。
最小函数逼近满足最小平方逼近,即简单函数与复杂函数的差的平方的积分最小。具体如何实现请查询书籍。

二、章节习题解答

Q1

%新建.m文件
function y = f3(x)
y = x.^3-6*x.^2+5*x-3;
end

x = linspace(0,10,100);
y = f3(x);
y2 = y+rand(1,100);
y3 = y+randn(1,100);
subplot(2,2,1);plot(x,y);
subplot(2,2,2);plot(x,y2);
subplot(2,2,3);plot(x,y3);
a22 = polyfit(x,y2,2);%a22即表示对y2作二次拟合的参数
a23 = polyfit(x,y2,3);
a24 = polyfit(x,y2,4);
a34 = polyfit(x,y3,4);
a33 = polyfit(x,y3,3);
a32 = polyfit(x,y3,2);

Q2

y0 = 0:400:4800;y0 = y0';x0 = 0:400:5600;
z0 = [1350 1370 1390 1400 1410 960 940 880 800 690 570 430 290 210 150 
1370 1390 1410 1430 1440 1140 1110 1050 950 820 690 540 380 300 210 
1380 1410 1430 1450 1470 1320 1280 1200 1080 940 780 620 460 370 350 
1420 1430 1450 1480 1500 1550 1510 1430 1300 1200 980 850 750 550 500 
1430 1450 1460 1500 1550 1600 1550 1600 1600 1600 1550 1500 1500 1550 1550 
950 1190 1370 1500 1200 1100 1550 1600 1550 1380 1070 900 1050 1150 1200 
910 1090 1270 1500 1200 1100 1350 1450 1200 1150 1010 880 1000 1050 1100 
880 1060 1230 1390 1500 1500 1400 900 1100 1060 950 870 900 936 950 
830 980 1180 1320 1450 1420 400 1300 700 900 850 810 380 780 750 
740 880 1080 1130 1250 1280 1230 1040 900 500 700 780 750 650 550 
650 760 880 970 1020 1050 1020 830 800 700 300 500 550 480 350 
510 620 730 800 850 870 850 780 720 650 500 200 300 350 320 
370 470 550 600 670 690 670 620 580 450 400 300 100 150 250];
y = 0:50:4800;y = y';x = 0:50:5600;
z=interp2(x0,y0,z0,x,y,'spline');
hold on
mesh(x,y,z);
[C,h] = contour(x,y,z,[500:500:2000]);
clabel(C,[500:500:2000]);
hold off

Q3

X = [1:8];
Y = [15.3,20.5,27.4,36.6,49.1,65.6,87.87,117.6];
n = length(X);
A = [ones(n,1),X'];
Y = log(Y); 
Y = Y';
a = A\Y;
ans = exp(a);%ans(1)即为第一个参数值,a(2)即为第二个参数值
x = linspace(1,8,100);
y = ans(1)*exp(a(2)*x);
Y = exp(Y);%复原Y
plot(x,y,'r',X,Y,'o');

Q4

%本题代码参考网络且解法比较粗糙
C = [0 3175 44636 3350 
3316 3110 49953 3260 
6635 3054 53936 3167 
10619 2994 57254 3087 
13937 2947 60574 3012 
17921 2892 64554 2927 
21240 2850 68535 2842 
25223 2795 71854 2767 
28543 2752 75021 2697 
32284 2697 85968 3475 
39435 3550 89953 3397 
43318 3445 93270 3340];
t = C(:,[1,3]);t = t(:);T = t/3600;%时间转化为小时
h = C(:,[2,4]);h = h(:);H = h/100*30.24*pi*57*30.24*57*30.24/4/1000/3.785;
%水位转化为G
n = length(T);
Tl = T(1:n-1);Tr = T(2:n);tmedi = (Tl+Tr)/2;%tmedi为相邻时间间隔的中间的时间点
Hl = H(1:n-1);Hr = H(2:n);Vw = (Hl-Hr)./(Tr-Tl);%Vw为tmedi时刻的所在时间段的平均流速
index = find(Vw<0);tmedi(index)=[];Vw(index)=[];%去除流速小于0的数据点
a = polyfit(tmedi,Vw,4);
va = polyval(a,1:0.1:30);
hold on
plot(tmedi,Vw,'*');
plot(1:0.1:30,va);
hold off;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数学建模学习笔记——插值与拟合 的相关文章

  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • 傅里叶变换定理 matlab

    我目前正在尝试理解二维傅里叶位移定理 根据我到目前为止所了解到的情况 图像空间中的平移会导致相位差异 但不会导致频率空间中的幅度差异 我试图用一个小例子来演示这一点 但它只适用于行的移位 而不适用于列的移位 这是一个小演示 我只在这里显示幅
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 在 MATLAB 中定义其他中缀运算符

    有没有办法在 MATLAB 中定义额外的中缀运算符 具体来说 我想定义两个中缀运算符 gt and lt gt 这些符号是理想的 但如果需要 它可以是单个字符 它调用函数implies and iff以同样的方式 calls and and
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 作为动画的八度情节点

    我有以下八度脚本 TOTAL POINTS 100 figure 1 for i 1 TOTAL POINTS randX rand 1 randY rand 1 scatter randX randY hold on endfor 当我运
  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 为什么 MATLAB 在打印大量 (.png) 图形时速度会变慢?

    我正在将大量数字打印为 png 文件 每个图都是数据矩阵中的一列图 我获取 png 文件并将它们串在一起形成动画 我的问题是 前几百张图像打印得很快 但创建每个新图形的时间却迅速增加 从前几百个 png 文件的约 0 2 秒到第 800 个
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http
  • Matlab 一个图上有多个图例 2014b

    我想在一个地块上有多个传说 该解决方案在 2014b 版本之前完美运行 我试图弄清楚如何使用手柄优雅地制作它 但到目前为止还没有成功 欢迎任何想法 2013b 的示例 x 1 50 y1 sin x 2 y2 cos x 2 f figur
  • 如何使用Matlab将数据保存到Excel表格中?

    我想将数据以表格形式保存在 Excel 工作表中 它应该看起来像 Name Age R no Gpa Adnan 24 18 3 55 Ahmad 22 12 3 44 Usman 23 22 3 00 每次当我执行我的文件时类数据 m 下
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • Matlab:条形图中缺少标签

    使用 Matlab 2012 和 2013 我发现设置XTickLabel on a bar图表最多只能使用 15 个柱 如果条形较多 则标签会丢失 如下所示 绘制 15 个条形图 N 15 x 1 N labels num2str x d
  • 禁止 MATLAB 自动获取焦点[重复]

    这个问题在这里已经有答案了 我有以下问题 在我的 MATLAB 代码中 我使用如下语句 figure 1 更改某些数据的目标数字 问题是 在此 MATLAB 之后 系统将焦点集中在具有该图形的窗口上 当我在后台运行一个大脚本并尝试在计算机上
  • 将向量(或弧)绘制到玫瑰图上。 MATLAB

    我有两个数据集 其中详细列出了angles 我正在绘制玫瑰图 angles 0 8481065519 0 0367932161 2 6273740453 n 另一个 从这组角度详细说明方向统计 angle error 0 848106563

随机推荐

  • 上升子序列用C语言编写,最长上升子序列(C语言 动态规划)

    描述 一个数的序列bi 当b1 lt b2 lt lt bS的时候 我们称这个序列是上升的 对于给定的一个序列 a1 a2 aN 我们可以得到一些上升的子序列 ai1 ai2 aiK 这里1 i1 lt i2 lt lt iK N 比如 对
  • 在html中写的css没效果,css样式不起作用是什么原因?

    在写页面时 有时会发现自己写的css样式无法生效 我们该如何排查css样式无法生效 常见的css样式不起作用的原因有哪些呢 下面我们就来看一下css样式不起作用的原因 排查css样式不起作用的方法步骤 首先 先试一下清除缓存 重启浏览器等手
  • 用 Python 制作一个艺术签名小工具,给自己设计一个优雅的签名

    生活中有很多场景都需要我们签字 签名 如果是一些不重要的场景 我们的签名好坏基本无所谓了 但如果是一些比较重要的场景 如果我们的签名比较差的话 就有可能给别人留下不太好的印象了 俗话说字如其人嘛 本文我们使用 Python 来制作一个艺术签
  • 逐行扫描型Memory LCD显存管理与emWin移植

    因为Memory LCD 的特性 不能设置像素坐标 只能用缓存整体刷新 所以对于Memory LCD来说 emWin移植仅与打点函数有关 这里用Sharp Memory LCD ls013b7dh03 作为实例 LCD的显存 逐行扫描 存放
  • 缓存记录

    1 我们在项目中使用缓存通常都是先检查缓存中是否存在 如果存在直接返回缓存内容 如果不存在就直接查询数据库然后再缓存查询结果返回 这个时候如果我们查询的某一个数据在缓存中一直不存在 就会造成每一次请求都查询DB 这样缓存就失去了意义 在流量
  • 简述锂离子电池的分类及结构

    锂离子电池按所用电解质材料的不同 可分为液态锂离子电池 LIB 和聚合物锂离子电池 PLB 两类 锂电池按工作环境分 高温锂离子电池 低温锂离子电池 常温锂离子电池 按电解质状态分 液态锂离子电池 凝胶锂离子电池固态锂离子电池 按形状分 方
  • uniapp实现横向滚动

  • 【软考】【系统架构设计师】决策论知识点

    1 概念 决策 一词来源于英语Decision Analysis 直译为 做出决定 所谓决策 就是为了实现预定的目标在若干可供选择的方案中 选出一个最佳行动方案的过程 它是一门帮助人们科学地决策的理论 也是管理者识别并解决问题及利用机会的过
  • SQLMAP脚本-sql-labs-Less-26-27a

    testtest sqli labs less 26 and less 26a 观察后端代码 发现空格 or and以及注释符 和 都没了 or and用双写 注释使用 00 空格用 09 0A 0B 0D 20 编写sqlmap脚本命名为
  • PHP运行模式

    PHP运行模式有4钟 1 cgi 通用网关接口 Common Gateway Interface 2 fast cgi 常驻 long live 型的 CGI 3 cli 命令行运行 Command Line Interface 4 web
  • centOS7 安装docker

    centOS7 安装docker centOS7 先更新yum 更新yum sudo yum update 下载必须 yum utils device mapper persistent data lvm2 sudo yum install
  • 本地Docker镜像发布到阿里云的Docker Hub

    1 配置镜像加速器 参考https my oschina net u 182501 blog 1549194 2 命名空间管理 进入https cr console aliyun com namespace index 3 创建镜像仓库 h
  • Java源文件注释

    关于java源程序当中的注释 什么是注释 注释的作用是什么 出现在java的源程序当中 对java源代码的解释说明 注释不会被编译到 class字节码文件当中 一个好的开发习惯应该是多编写注释 这样程序的可读性比较强 java中的注释怎么写
  • C++ 多态 超详细讲解

    文章目录 多态概念引入 1 C 中多态的实现 1 1 多态的构成条件 1 2 虚函数 1 3虚函数的重写 1 4 C 11 override final 1 5 重载 覆盖 重写 重定义 隐藏 2 抽象类 2 1 抽象类的概念 2 2 接口
  • MySQL第四讲 MySql Undo日志 - 对聚簇索引进行CUD操作

    事务需要保证原子性 如果在事务执行过程中出现以下情况 就需要用到undo log 1 事务执行中遇到各种错误 比如服务器本身的错误 操作系统错误甚至是断电导致的错误 2 事务在执行过程手动rollback结束当前事务 每当对一条记录进行改动
  • STM32 定时器中断

    通用定时器工作过程 时钟选择 计数器时钟可以由下列时钟源提供 内部时钟 CK INT 外部时钟模式1 外部输入脚 TIx 外部时钟模式2 外部触发输入 ETR 内部触发输入 ITRx 使用一个定时器作为另一个定时器的预分频器 如可以配置一个
  • 环形队列原理,全网最通俗易懂

    队列是什么 队列是一种很常见的数据结构 满足先进先出的方式 如果我们设定队列的最大长度 那就意味着进队列和出队列的元素的数量实则满足一种动态平衡 如果我们把首次添加入队列的元素作为一个一维坐标的原点 那么随着队列中元素的添加 坐标原点到队尾
  • 六一儿童节 全网最全的微服务+Outh2套餐,你确定不来试一试?(入门到精通,附源码)满足你的味蕾需要(二)

    咱们废话不多说 直接开干 目录 一 项目目录 二 Token 三 授权服务器oauth 1 pom 2 application 3 OauthApp启动类 4 DiyUserDetails 5 MyUserDetailService 6 K
  • 爬虫项目二十:用Python对58租房信息进行爬取

    文章目录 前言 一 分析url 二 制造url 三 详情url 四 解析页面 总结 前言 用Python爬下58同城租房详情信息 仅供学习使用 已发现弊端 封IP严重 提示 以下是本篇文章正文内容 下面案例可供参考 一 分析url 第一页
  • 数学建模学习笔记——插值与拟合

    数学建模学习笔记 插值与拟合 一 基础知识储备 1 插值 1 1 拉格朗日插值 1 2 牛顿插值 1 3 分段线性插值 1 4 Hermite插值 1 5 三次样条插值 1 6 B样条函数插值 1 7 二维插值 2 曲线拟合的线性最小二乘法