曲线拟和函数lsqcurvefit nlinfit

article/2025/9/9 2:22:24

转载自:http://panda0411.com/2011/08/29/curve-fit-and-function-lsqcurvefitnlinfit/


琢磨了好久matlab自带的曲线拟和工具箱, 发现这货只能解决从离散数据得到各种类型的拟和效果, 但是反之貌似没法实现, google一下有这两个函数可以用:
lsqcurvefit和nlinfit

lsqcurvefit(非线性最小二乘法)
help了一下, 发现官方的文档过于详尽, 节选部分吧.
LSQCURVEFIT solves non-linear least squares problems.

X = LSQCURVEFIT(FUN,X0,XDATA,YDATA) starts at X0 and finds coefficients X to best fit the nonlinear functions in FUN to the data YDATA (in the least-squares sense).

FUN accepts inputs X and XDATA and returns a vector (or matrix) of function values F, where F is the same size as YDATA, evaluated at X and XDATA.

NOTE: FUN should return FUN(X,XDATA) and not the sum-of-squares sum((FUN(X,XDATA)-YDATA).^2).

((FUN(X,XDATA)-YDATA) is squared and summed implicitly in the algorithm.)

这里面对函数的各个参数的意义和用法都做了解释.
[x,resnorm]=lsqcurvefit(fun,x0,xdata,ydata,...)
fun 是我们需要拟合的函数,这是重点
x0 是我们对函数中各参数的预测值,这也是重点
xdata 则是横轴坐标的值
ydata 是纵轴的值
需要注意的是lsqcurvefit里面的fun是我们需要拟和的函数, 需要另外编写.

下面用以前某年的CUMCM真题修改作为示例.

--------------------------------------------------------------------------------------------
tj/s                      | 100  | 200  | 300  | 400  | 500  | 600  | 700  | 800  | 900  | 1000 |
--------------------------------------------------------------------------------------------
Cj/(mg*cm-3) | 4.54  | 4.99 | 5.35  | 5.65  | 5.90 | 6.10  | 6.26  | 6.39 | 6.50  |  6.59 |
--------------------------------------------------------------------------------------------
在已知部分参数的情况下, 求函数

E(K,aA,aB)=j=110[a+be0.02KtjCj]

求函数的最下值的点(K,a,b)

1. 编写M文件(curvefun.m)

function f = curvefun(x,tdata)
f = x(1)+x(2)*exp(-0.02*x(3)*tdata);
end

2. 编写程序(test1.m)

tdata = linspace(100,1000,10);
cdata = 1e-05.*[454 499 535 565 590 610 626 639 650 659];
x0 = [0.2 0.05 0.05];
x = lsqcurvefit(@curvefun, x0, tdata, cdata);
f = curvefun(x, tdata)
plot(tdata, cdata, '*', tdata, f, 'r-')

3. 输出结果
x= 0.0069 -0.0029 0.0809
即表示k=0.2542, a=0.0063, b=-0.0034

nlinfit

从matlab给出的帮助文档来看, nlinfit与lsqcurvefit同属与非线性最小二乘拟和, 一般来说都是能得到比较接近的结果.
但是由于nlinfit使用的是牛顿方法, 在使用是需要给出你和参数的假设初值, 有些问题对初值比较敏感, 不同的初值会导致差异比较大.
下面示例nlinfit的用法:

混凝土的抗压强度随着养护时间的延长而增加, 现将一批混凝土作成12个试块, 记录了养护日期x(日)以及抗压强度y(kg/cm2)的数据

-------------------------------------------------------------------------------------------------------
养护时间x |    2     |    3     |     4   |     5   |     7    |     9    |   12    |    14   |    17   |    21   |   28   |  56    |
-------------------------------------------------------------------------------------------------------
抗压强度y | 35+r | 42+r | 47+r | 53+r | 59+r | 65+r | 68+r | 73+r | 76+r | 82+r | 86+r | 99+r |
--------------------------------------------------------------------------------------------------------
建立非线性回归模型, 对得到的模型和系数进行检验.
注明:此题中的+r代表加上一个[-0.5,0.5]之间的随机数

y=a+k1emx+k2emx

1. 编写m文件(myfunc.m)

function f = myfunc(beta, x)
f = beta(1)+beta(2)*exp(beta(4)*x)+beta(3)*exp(-beta(4)*x);
end

2. 编写程序

clc;clear;
x=[2 3 4 5 7 9 12 14 17 21 28 56];
r=rand(1,12)-0.5; %rand产生的是0,1之间的随机数, 这里表示产生12个[-0.5 0.5]之间的随机数
y1=[35 42 47 53 59 65 68 73 76 82 86 99];
y=y1+r
beta=nlinfit(x,y,@myfunc,[0.5 0.5 0.5 0.5]); %nlinfit的语法与lsqcurvefit基本类似, 只是参数的顺序上有些差异, 这里不再赘述
a=beta(1),k1=beta(2),k2=beta(3),m=beta(4)
%test the model
xx=min(x):max(x);
yy=a+k1*exp(m*xx)+k2*exp(-m*xx);
plot(x,y,'o',xx,yy,'r')

当然, 这里如果不想另外编写m函数, 可以使用上一篇笔记中的内联函数inline来实现. 只需要将程序里面的beta=.....替换成下面两行即可, 注意替换后的nlinfit不需要使用@符号了.

myfunc=inline('beta(1)+beta(2)*exp(beta(4)*x)+beta(3)*exp(-beta(4)*x)','beta','x');
beta=nlinfit(x,y,myfunc,[0.5 0.5 0.5 0.5]);

3. 输出结果

a = 88.0591, k1 = 0.0318, k2 = -62.7924, m = 0.1044


http://chatgpt.dhexx.cn/article/DbWlt3cZ.shtml

相关文章

Matlab学习手记——非线性数据拟合:nlinfit和lsqcurvefit

目的:通过一个实例了解Matlab的数据拟合函数nlinfit和lsqcurvefit的使用。 结果图 具体数值 p 0.3000 50.0000 0.4000 200.0000 0.3000 800.0000 p1 0.3267 48.3589 0.4030 226.6525 0.2838 809.6680 p2 0.3267 48.3646 0.4031 226.735…

MATLAB多元非线性回归nlinfit拟合圆拟合球拟合函数

先上实验效果,你觉得有帮助可以继续阅读。代码解析在B站有上传视频(用户昵称同名),代码也有详细备注。 拟合圆和球面: 拟合多元非线性函数:y p1*x1p2*x1^2p3*x2p4*x2^2exp(-p5*x3)的拟合结果:…

MATLAB 非线性隐函数拟合采坑记录(使用 fsolve solve nlinfit lsqcurvefit函数)

MATLAB 非线性隐函数拟合采坑记录(使用 fsolve solve nlinfit lsqcurvefit函数) 问题描述解决思路错误示范1代码思路原因解释模型更正更正模型1更正模型2 错误示范2代码思路原因解释模型更正更正模型1更正模型2 总结 问题描述 MATLAB的 nlinfit 和 lsqc…

Matlab多元非线性函数拟合

看了多篇文章,觉得没有一篇比较全,且可以参照的多元非线性函数拟合,看了多篇文章后总结以下内容,主要以示例给出,希望能帮助到大家快速上手。 1.需要用到的函数语法 beta nlinfit(X, Y, modelfun, beta0) X为你的自…

MATLAB中用nlinfit做多元非线性拟合(回归)

MATLAB中有一个多元非线性拟合的功能是nlinfit 基本语法是: beta nlinfit(X,Y,modelfun,beta0) 式子左边的beta可以是一个向量,向量的元素就是要回归的模型中的参数。 式子右边,modelfun是要回归的函数形式。X是函数的自变量数据&#xff1b…

使用nlinfit函数进行拟合时出现Error using nlinfit>checkFunVals (line 611)

在使用nlinfit函数进行拟合时出错,内容如下: The function you provided as the MODELFUN input has returned Inf or NaN values.从第一行可以看出,由于赋予的初始值导致了函数生成了NaN(无解),所以整个回…

【数学建模】多元非线性回归nlinfit(Matlab代码实现)

目录 1 基本语法 2 算例及Matlab代码实现 2.1 算例 2.2 数据 2.3 Matlab代码实现 1 基本语法 2 算例及Matlab代码实现 2.1 算例 熔喷非织造材料是口罩生产的重要原材料,具有很好的过滤性能,其生产工艺简单、成本低、质量轻等特点,受到国…

Matlab 使用nlinfit 函数进行多元非线性回归,并且绘制曲线拟合的误差区间

Matlab 使用nlinfit 函数进行多元非线性回归,并且绘制曲线拟合的误差区间 一、前言二、nlinfit函数使用1、函数语法2、拟合示例: 三、误差阴影绘制四、整体源码五、思考参考博客 一、前言 这个也是最近我接到的一个小项目里的内容: 有一组数…

利用nlinfit函数实现数据非线性拟合

所谓“拟合”,指的是在已有一组实验数据的前提下,研究这组数据有怎样的函数关系——最终结果是从这一组看似漫无规律的数据点中“找出”能用数学表达式表示的规律。 用数学语言描述的拟合定义如下: 一个典型的数据拟合过程包括以下几个步骤&…

Matlab非线性拟合函数——nlinfit

我们平时最常用的非线性拟合函数还是多项式拟合,有一天学弟突然问了我nlinfit 这个函数,然后直接查询matlab官方文档,原来非线性函数还可以用这个函数,下面来看看matlab官方文档的说明: 英文?没关系,下面看一下中文用法: beta = nlinfit(X, Y, modelfun, beta0) beta:…

[MATLAB]非线性回归--自配函数(nlinfit)

当谈到非线性回归模型的时候,同学们应该紧密的将线性回归紧密结合在一起,因为非线性回归很容易过拟合。那我们从一个案例谈一下非线性 拿到题目看到一个变量x一个y,非线性问题步骤应该是这样子的: 画出散点图根据散点图确定须配…

dozer使用: list对象mapping 配置

记录dozer的使用,复杂类型配置。 文档:https://dozermapper.github.io/user-guide.pdf 参考地址:https://github.com/klvnnsrikanth/DozerMappingExample.git Demo 的目录结构: 不是集合的普通映射方式 Source 类: Destinatio…

java dozer map转对象_对象转换利器之Dozer

在Java的世界中,经常会涉及到需要在2个对象中进行转换,比如说: 调用SOAP Web服务,需要把自己的Domain对象转换为Soap服务的Jaxb对象请求, 在分层级SOA架构中,2个层级之间Domain对象的转换, 在分…

SpringBoot2.x 集成 Dozer

Dozer是Java Bean到Java Bean的映射器,它以递归的方式将数据从一个对象复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。它支持简单属性映射,复杂类型映射,双向映射,隐式显式映射,以及递归映射…

java dozer 官网,Dozer数据对象转换神器

首先,为什么要进行数据转换? 在一个分层的体系结构中,经常会使用DTO、PO、VO等封装数据,封装数据到特定的数据对象中,然而在很多情况下,某层内部的数据是不允许传递到其它层,不允许对外暴露的&a…

SpringBoot 整合 Dozer 映射框架

SpringBoot 整合 Dozer 映射框架 1. Dozer 介绍2. 为什么要使用映射框架 Dozer3. Dozer 映射框架的使用 1. Dozer 介绍 Dozer 是一个 Java Bean 到 Java Bean 的映射器,它递归地将数据从一个对象复制到另一个对象。Dozer 是用来对两个对象之间属性转换的工具&#…

Dozer的学习

Dozer的学习 此教程基于黑马程序员Java品达通用权限项目,哔哩哔哩链接:https://www.bilibili.com/video/BV1tw411f79E?p44 1.dozer介绍 Dozer是Java Bean到Java Bean映射器,它以递归方式将数据从一个对象复制到另一个对象。 dozer是用来对…

SpringBoot Dozer

文章目录 Dozerspringboot 配置 Dozer演示Dozer工具接口和实现类全面测试项目实战演示 Dozer Dozer是什么? Dozer是一个JavaBean映射工具库。 它支持简单的属性映射,复杂类型映射,双向映射,隐式显式的映射,以及递归映射。 它支…

Dozer的使用(整合springboot)

dozer是实体类与实体类之间转换的工具&#xff0c;下面是简单操作配置 引入依赖&#xff1a; <!--dozer 实体类转换工具--><dependency><groupId>net.sf.dozer</groupId><artifactId>dozer-spring</artifactId><version>5.5.1<…

【JAVA】Dozer 介绍及快速入门教程

文章目录 概述使用安装入门XML 映射注解映射SpringBoot 集成 结语 概述 Dozer 是什么? Dozer 是 Java Bean 到 Java Bean 的映射器&#xff0c;他以递归的方式将数据从一个对象复制到另一个对象。 它支持简单的属性映射&#xff0c;复杂类型映射&#xff0c;双向映射&#…