数学建模——曲线拟合

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 数学建模——曲线拟合

一、曲线拟合简介

1、曲线拟合问题的提法

已知一组数据(二维),即平面上n个点       (xi,yi)(i=1,2,…,n), xi互不相同。寻求一个函数y=f(x),使得f(x)在某种准则下与所有的数据点最为接近,即拟合得最好。

2、线性最小二乘法

线性最小二乘法是解决曲线拟合最常用的方法,基本思路是,令

                     

其中,r1(x),…,rm(x)是一组预先选定得一组线性无关的函数,a1,a2,…,am是待定系数.

涉及到的问题有二,一是系数确定;二是函数选取

2.1 系数确定

拟合准则:使得yi与f(xi)距离(称为残差)平方和最小,称为最小二乘法。,即

即求a1,…,am,转化为求J函数的最小值。

2.2 拟合函数的选取

拟合的前提是:

(1)通过机理分析,得到y和x的函数关系,这是r1(x),…, rm(x)也就好选取;

(2)若无法判断y和x的机理关系,绘制(xi,yi)的散点图,直观判断用什么曲线取拟合。

常用的曲线有

(1)线性

(2)多项式(一般m=2,3)

(3)双曲函数(一支)

(4)指数曲线

一般需要几种曲线分别拟合,选最好的那个!


二、曲线拟合Matlab工具箱

1、多项式拟合(polyfit)

调用格式:a=polyfit(x0,y0,m)

x0,y0是数据向量,m表示多项式的阶数,返回的是多项式的降幂系数a=[a1,a2,…,am,am+1]。

polyfit 函数会根据给定的数据点 (x0, y0)使用最小二乘方法进行拟合,得到一个多项式模型,并返回其中的系数 a。拟合多项式的阶数由参数 m 指定,表示拟合多项式的次数。

返回的系数 a 是一个向量,其中的元素表示多项式中各项的系数,从高次项到低次项排列。例如,如果拟合多项式的阶数为 3,则 a 向量对应的是多项式 a(1)*x^3 + a(2)*x^2 + a(3)*x + a(4) 的系数。

需要注意的是,polyfit 函数会对数据进行拟合,尽可能地找到一个最佳的多项式模型来逼近数据点。选择适当的多项式阶数是重要的,过高的阶数可能导致过拟合,而过低的阶数可能导致欠拟合。因此,在选择阶数时需要进行合理的权衡

要计算x处对应的多项式取值,需调用y=polyval(a,x)

例如:

x0=1990:1:1996;
x1=x0-1989;
y0=[70,122,144,152,174,196,202];
a=polyfit(x1,y0,3)
0.7778  -11.7381   71.6270   12.5714

2、最小二乘曲线拟合

在 MATLAB 中,lsqcurvefit 函数用于非线性最小二乘曲线拟合,可以通过拟合函数 fun 对给定的数据 (xdata, ydata) 进行拟合,并返回拟合后的参数 x

调用格式:x=lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)

参数介绍:

  • fun:拟合函数,可以是自定义函数或 MATLAB 内置函数。该函数应接受待拟合参数 x 和自变量 xdata 作为输入,并返回拟合函数对应的因变量值。
  • x0:拟合参数的初始猜测值。这应该是一个向量。
  • xdata:自变量数据,表示用于拟合的输入数据。这可以是一个向量、矩阵或多维数组。
  • ydata:因变量数据,表示用于拟合的输出数据。这应该与 xdata 大小相同。
  • lb:参数 x 的下界(可选)。这应该是一个向量。
  • ub:参数 x 的上界(可选)。这应该是一个向量。
  • options:优化选项(可选),用于控制拟合过程的参数和行为。

lsqcurvefit 函数基于最小二乘法,寻求使拟合函数的输出与实际数据之间的残差平方和最小化的最优参数 x。它通过反复调整参数 x 的值,以改善拟合函数与数据之间的拟合效果。

在使用 lsqcurvefit 函数时,应提供适当的初始猜测参数 x0,并根据需要设置参数的下界 lb 和上界 ub。还可以通过 options 参数进一步控制拟合过程的行为,例如迭代次数、显示输出等。

举例理解lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options):

假设你有一组实验数据,表示物体从起始位置到时间的运动距离。你想要拟合一个非线性函数来描述物体的运动,具体为 y = a * exp(-b * x) + c * sin(d * x),其中 a、b、c、d是需要拟合的参数。

1. 拟合函数的定义:

function yfit = myFunction(x, p)
    a = p(1);
    b = p(2);
    c = p(3);
    d = p(4);
    yfit = a * exp(-b * x) + c * sin(d * x);
end

2. 定义初始猜测参数和参数范围:

x0 = [1, 0.1, 0.5, 2];       % 初始猜测参数
lb = [0, 0, 0, 0];           % 参数下界
ub = [Inf, Inf, Inf, Inf];   % 参数上界

3. 加载实验数据:

load 'data.mat';    % 加载实验数据文件,假设包含 xdata 和 ydata

4. 定义优化选项(可选):

options = optimoptions('lsqcurvefit', 'Display', 'iter');

此处设置了优化选项,其中 `'Display', 'iter'` 表示在每次迭代中显示优化过程的详细信息。

5. 进行参数拟合:

x = lsqcurvefit(@myFunction, x0, xdata, ydata, lb, ub, options);

这里使用 `lsqcurvefit` 函数进行参数拟合,传入参数拟合函数 `@myFunction`、初始猜测参数 `x0`、自变量数据 `xdata`、因变量数据 `ydata`,以及参数下界 `lb` 和上界 `ub`。`x` 将包含拟合后的参数值。

在这个例子中,你可以根据实际情况修改函数的形式、初始猜测参数、参数范围等,以适应你的数据和拟合需求。你也可以根据具体情况进一步控制优化选项,例如设置不同的显示模式、设置最大迭代次数等。

3、区别

`lsqcurvefit` 函数与之前提到的 `polyfit` 和 `polyval` 函数有以下几个主要区别:

1. 功能不同:`polyfit` 和 `polyval` 主要用于多项式拟合和求值,适用于已知数据点遵循多项式模型的情况。而 `lsqcurvefit` 用于非线性最小二乘曲线拟合,适用于更一般的非线性函数拟合问题。

2. 参数个数:`polyfit` 和 `polyval` 方法中只涉及到多项式的阶数和系数,而 `lsqcurvefit` 方法需要提供更多的参数,包括拟合函数、初始猜测参数、数据点、参数界限等。

3. 拟合函数的选择:`polyfit` 和 `polyval` 只能用于多项式模型的拟合,而 `lsqcurvefit` 可以适应更广泛的非线性模型。你可以自定义拟合函数 `fun`,只要它能够接受待拟合参数和自变量作为输入,并返回拟合函数对应的因变量值。

4. 非线性优化:`lsqcurvefit` 使用非线性优化算法来拟合数据,它基于最小二乘法和迭代的思想,通过调整参数的值来改善拟合效果。相比之下,`polyfit` 使用最小二乘法来拟合多项式模型,但不涉及非线性优化过程。

总之,`lsqcurvefit` 提供了更灵活、更通用的拟合功能,适用于更广泛的曲线拟合问题,尤其在遇到非线性模型时更有优势。而对于已知数据点遵循多项式模型的情况,使用 `polyfit` 和 `polyval` 更为简便。

4、选择

选择使用 `polyfit`、`polyval` 还是 `lsqcurvefit` 取决于你的具体需求和数据特征。下面是一些建议来帮助你做出选择:

1. 数据特征:观察你的数据是否符合多项式模型。如果你的数据显示出明显的多项式关系,即使你不知道多项式的阶数,`polyfit` 和 `polyval` 可能是较好的选择,因为它们是最专门用于多项式拟合和求值的函数。

2. 拟合模型:确定你需要拟合的函数是否是一个多项式以外的非线性函数。如果你的函数不属于多项式模型,或者你需要对不同类型的非线性函数进行拟合,那么 `lsqcurvefit` 是更通用和灵活的选择,因为它允许你自定义拟合函数。

3. 参数估计:如果你已经确定你的函数是一个多项式模型,并且你希望直接估计多项式的系数,在不考虑其他模型的情况下,`polyfit` 可以提供简单且高效的多项式拟合。

4. 参数范围和约束:如果你对估计的参数有范围或约束条件,或者你面临的问题需要一种更灵活的非线性拟合方法,那么 `lsqcurvefit` 可能更适合你。它提供了对参数范围的设置,以及更高级的非线性优化算法,使得拟合过程更加灵活和精确。

综上所述,如果你的数据适用于多项式模型并且你想估计多项式的系数,可以选择 `polyfit` 和 `polyval`。如果你面临更一般的非线性函数拟合问题,或者需要参数范围和约束,那么 `lsqcurvefit` 是更适合的选择。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
传感器 存储 算法
Python OpenCV 蓝图:1~5
Python OpenCV 蓝图:1~5
476 0
|
C# C++
创建目标类型对象在C#7.3中不可用,请使用9.0或更高的语言版本
创建目标类型对象在C#7.3中不可用,请使用9.0或更高的语言版本
2616 0
创建目标类型对象在C#7.3中不可用,请使用9.0或更高的语言版本
|
6月前
|
机器学习/深度学习 自然语言处理 测试技术
Qwen3技术报告首次全公开!“混合推理模型”是这样炼成的
近日,通义千问Qwen3系列模型已开源,其技术报告也正式发布。Qwen3系列包含密集模型和混合专家(MoE)模型,参数规模从0.6B到235B不等。该模型引入了“思考模式”与“非思考模式”的动态切换机制,并采用思考预算机制优化推理性能。Qwen3支持119种语言及方言,较前代显著提升多语言能力,在多个基准测试中表现领先。此外,通过强到弱蒸馏技术,轻量级模型性能优异,且计算资源需求更低。所有Qwen3模型均采用Apache 2.0协议开源,便于社区开发与应用。
4636 30
|
机器学习/深度学习 分布式计算 并行计算
【MATLAB】史上最全的13种数据拟合算法全家桶
【MATLAB】史上最全的13种数据拟合算法全家桶
2263 1
|
12月前
|
存储 API 开发工具
【实践】基于生命周期管理的存储成本优化
本实验介绍如何在阿里云创建和管理对象存储服务(OSS)。主要内容包括:1. 创建Bucket,选择存储类型及冗余方式;2. 上传文件,推荐使用API或SDK而非控制台直接操作;3. 设置生命周期规则,管理文件的存储层级转换与自动删除。实验重点在于合理配置存储策略以降低成本,并确保数据安全。通过控制台操作,用户可以轻松管理存储资源,但需注意防止不必要的公网访问以避免费用风险。
267 1
|
XML 机器学习/深度学习 数据格式
YOLOv8训练自己的数据集+常用传参说明
YOLOv8训练自己的数据集+常用传参说明
21365 3
|
安全 物联网 编译器
Zig 教程
Zig 教程
598 1
|
存储 前端开发 JavaScript
State 状态管理最佳实践
【10月更文挑战第1天】本文深入浅出地介绍了前端开发中的状态管理概念,强调其在构建复杂单页应用(SPA)中的重要性。文章详细阐述了状态管理的核心原则,如单一源真理、状态不可直接修改及状态变更透明,并对比分析了如Redux、Vuex和MobX等常用状态管理库。通过具体代码示例,指出了状态分散和非原子操作等常见问题及其解决方案,为开发者提供了实用指导。
532 2
|
机器学习/深度学习 算法 C语言
【深度学习】优化算法:从梯度下降到Adam
【深度学习】优化算法:从梯度下降到Adam
487 1
|
监控 算法 iOS开发
Xcode调试内存最新理解
【8月更文挑战第12天】在Xcode中进行内存调试对确保iOS应用的稳定性和性能至关重要。主要利用Instruments套件内的工具如Leaks检测内存泄漏,Allocations追踪内存分配详情,及Memory Graph Debugger提供直观的内存结构视图。Xcode还支持内存图视图以了解对象布局与引用,动态内存分析实现实时监控,及符号化调试信息帮助定位问题源代码。最佳实践包括遵循内存管理原则、定期调试、优化代码逻辑,以及学习优秀代码案例。通过这些技术和策略,开发者能有效管理和优化应用的内存使用。
649 0

热门文章

最新文章