在MATLAB中关于函数拟合的函数主要分为两类。一类是线性拟合,另一类则是非线性拟合。非线性拟合相对来说,难度会比线性拟合更大一些。本篇文章主要是关于如何使用lsqcurvefit函数进行非线性拟合的,从而得到函数中的多个未知量。

1、首先,我们通过MATLAB命令行窗口输入help lsqcurvefit,对lsqcurvefit函数的使用作一个大致的了解。

Nonlinear least-squares solver——基于最小二乘法的非线性拟合

以下是使用lsqcurvefit的格式

x = lsqcurvefit(fun,x0,xdata,ydata)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
x = lsqcurvefit(problem)
[x,resnorm] = lsqcurvefit(___)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(___)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(___)

参数说明:
x0为初始解向量;xdata,ydata为满足关系ydata=F(x, xdata)的数据;
lb、ub为解向量的下界和上界lb≤x≤ub,若没有指定界,则lb=[ ],ub=[ ];
options为指定的优化参数;
fun为待拟合函数,计算x处拟合函数值,其定义为 function F = myfun(x,xdata)
resnorm=sum ((fun(x,xdata)-ydata).^2),即在x处残差的平方和;
residual=fun(x,xdata)-ydata,即在x处的残差;
exitflag为终止迭代的条件;
output为输出的优化信息;
lambda为解x处的Lagrange乘子;
jacobian为解x处拟合函数fun的jacobian矩阵。
一般来说,拟合复杂的函数并不是一开始就能成功的,resnorm是一个衡量拟合质量好坏的参数,所以不建议采用前四中格式。本次采用的为:[x,resnorm] = lsqcurvefit(___)

2、编写待拟合的函数
在拟合的.m文件末尾编写待拟合的函数,以下为我需要拟合的函数,其中含有6个未知参数。在拟合前,一定一定要多次检验待拟合函数的正确性。待拟合函数中出现错误,会是致命的错误。以下,是本人需要拟合的函数。

 function neff=nef_r(a,f)epxlb=a(1);    f0e=a(2);     miub=a(3);    fpm=a(4);     f0m=a(5);     gammam=a(6); epxl0=1/(36*pi*10^9);miu0=4*pi*10^-7;h=0.0003;d=0.003;k=2*pi*f*sqrt(epxl0*miu0);epxl=epxlb*(1-(f0e*10^9)^2./f.^2);miu=miub-(fpm*10^9)^2./(f.^2-(f0m*10^9)^2+1i*(gammam*10^9)*f);epxl_av=epxl*h/d;miu_av=miu*h/d;n_r=real(1./(k*d).*acos((4-(k*d).^2.*epxl_av.*miu_av)./(4+(k*d).^2.*epxl_av.*miu_av).*cos(k*d)-(2*(epxl_av+miu_av).*k*d)./(4+(k*d).^2.*epxl_av.*miu_av).*sin(k*d)));n_i=imag(1./(k*d).*acos((4-(k*d).^2.*epxl_av.*miu_av)./(4+(k*d).^2.*epxl_av.*miu_av).*cos(k*d)-(2*(epxl_av+miu_av).*k*d)./(4+(k*d).^2.*epxl_av.*miu_av).*sin(k*d)));for m=1:length(f)if n_i(m)<0n_r(m)=-n_r(m);n_i(m)=-n_i(m); endendneff=n_r;end

3、设置拟合的上、下限以及初始值。
这应该是多个未知参数拟合最难的部分,也是最容易卡壳的地方。在设置拟合的上、下限和初始值时,稍有偏差,就会使拟合效果不佳,即resnorm值偏大。这一部分我们留到最后再说明如何调试出较佳的拟合效果。

    a0=[1;      35;     10;      26;      10;        0.02];%初始值lb=[0;      30;      1;      24;      8;      0];%下限ub=[2;        50;     14;     30;     20;    0.5];%上限

4、绘图
应该是最简单,但却又是很重要的部分。绘图是最直观的观测拟合效果的方法。我们将原始数据real(n)用红色实线绘图,待拟合函数用红色虚线绘图。

 plot(f/(10^9),real(n),'r');hold on;plot(f/(10^9),n_r,'r--');hold on;

5、拟合选项设置

options = optimset('Display','iter','Tolx',1e-15,'TolFun',1e-15);

其中,‘Display’为显示级别,本次显示级别为‘iter’,在每次迭代时显示输出。
‘Tolx’为关于当前点 x 的终止容差,在当前点与先前点相差小于 TolX 时(相对于 x 的大小),迭代结束。本次当前点 x 终止容差为1e-15。
TolFun’为函数值的终止容差,在当前函数值与先前值相差小于 TolFun 时(相对于初始函数值),迭代结束。本次函数值的终止容差为1e-15。

6、进行拟合

[x,renorm]=lsqcurvefit(@nef_r,a0,f',real(n),lb,ub,options)

当然,多未知参数非线性函数的拟合并不是一蹴而就的。需要不断的调试拟合的初始值、上限和下限。这会是一个漫长的过程。

接下来需要啃的硬骨头就是调试过程了:
1、首先,我们需要知道未知参数的大致量级,可以根据函数内未知参数的实际意义出发得到大概量级。
2、粗调:因为每次拟合得到的未知参数都是无法精准控制的。所以可以另写一个.m文件,提前给予未知参数一个确定的值(当然这个值是在已知每个未知参数的量级的前提下去大胆尝试)代入到待拟合函数中,对比绘画出的红色实线图形与红色虚线图形形状。如果形状大致一样,就可以进行下一步的细调;若形状不一样,继续修改猜测值,直到图形大致一致为止。

  a0=[1.87  34.14  10.12  26.35  10.09  0.0224];

3、细调:细调的工作,我们就交给lsqcurvefit函数。将初始值设置为猜测值。将上下限稍微调大一些,当然初值得在上下限之间。再逐一缩小上限限,适当修改初始值,使resnorm值越小越好。注意:唯一的目的是使resnorm值越小。当拟合函数没问题以及resnorm值足够小时,实线与虚线应该是大致重合的。

我的大致代码以及拟合效果,未知参数和resnorm值如下图:

程序设计流程图如下:

MATLAB有关lsqcurvefit函数对多个未知参数函数拟合的相关问题相关推荐

  1. 已知 方程 用 matlab 求表达式,已知自变量,因变量和函数表达式,可以用matlab求出函数表达式中的未知参数吗...

    答:这不是解方程,这是曲线拟合.如果你的已知的dr,R只有一个点,那么你的未知数是有无数个解的. cftool,拟合函数有一个选项是自定义函数. 答:用polyfit函数,即多项式拟合函数 设x=X- ...

  2. matlab微分方程未知参数求解拟合,使用matlab最小二乘法拟合求解常微分方程组未知参数...

    function k1k2k32 format long clear all clc tspan = [0 6 24 44 68 72 74 92 104 116]';%%这是时间 yexp= [3. ...

  3. c语言中函数名可变,C语言中可变参数函数

    转帖两封: 首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理. 一.printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的.C/C++ ...

  4. C/C++可变参数函数

    一.C可变参数函数 一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的实际参数.但在某些情况下我们希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数. ...

  5. python可变参数函数二阶导数公式_python中函数的可变参数

    简介 INTRODUCTION一.[其实已经用过]可变参数 二.可变参数+普通参数 结合用法1 三.知识要点总结强调 知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 一. ...

  6. php 查询数据表第2条,PHP 连接 MySQL 数据库的连接函数 mysql_connect 的第二个参数是( )。...

    问题:PHP 连接 MySQL 数据库的连接函数 mysql_connect 的第二个参数是( ). 更多相关问题 下图中ACB为晨昏线,C地点位于格陵兰岛上.回答(1)--(3)题.(1)飞机从A点 ...

  7. C语言可变参数函数_初探

    一.什么是可变参数函数 C语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function).这种函数需要固定数量的强制参数,后面是数量可变的可选参数. 其中,强制参数必须至少一 ...

  8. C基础 函数的形式参数和实际参数

    本人是刚开始学写博文,很多东西都是第一次接触嘛,哪里有写的不好的希望大家指出来,然后一起学习.一起进步,我也会坚持更新的! 如何用函数实现模块化设计? 问题一:为什么要用函数呢? 答:因为有时候程序需 ...

  9. C语言可变参数函数(printf/scanf)

    C 语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function).这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(opti ...

最新文章

  1. 华为云发布全新DevOps实践,大幅提升交付效率
  2. oracle 10g rac 修改sga_target不生效,关于请教rac的sga 设置及修改问题
  3. 《音乐达人秀:Adobe Audition实战200例》——实例7 定时录制网络音乐节目
  4. HTML 5 的自定义 data-* 属性和jquery的data()方法的使用
  5. k8s核心技术-Pod(镜像的拉取_重启策略_资源限制)_---K8S_Google工作笔记0022
  6. 解析XML格式的数据-XStream
  7. 2013第41周三余生最年青的时候
  8. mysql 全连接_mysql 实现全连接
  9. 速达服务器远程登录设置,ERP速达软件online远程客户端登录常见问题(三)
  10. 逻辑回归卡方拟合优度检验 r语言
  11. 中南大学计算机学院考研好考吗,中南大学or湖南大学:我考研选学校的心路历程...
  12. excel检验是否是正态分布-T分布
  13. ROS:TF,机器人坐标管理神器
  14. CyanogenMod源码下载和编译 CM7
  15. 前端要失业了么,sketch-code让草图秒变HTML
  16. 交换机SVI配置的作用 思科/华为 网络工程
  17. element-ui中tree组件双击事件的实现
  18. 农业节水自动灌溉 ic射频卡机井灌溉控制器智能取水
  19. 手机视频网页点播服务器,手机视频点播系统搭建完整方案
  20. KT6368A蓝牙芯片的MTU的说明以及如何加快BLE传输速率

热门文章

  1. VSCode怎么换主题(有图 超详细)
  2. 【自动驾驶】动力学横向控制误差模型
  3. 【Go学习】实现一个用其他终端远程控制电脑鼠标的小程序
  4. 回归分析结果表格怎么填_回归分析表怎么看懂?
  5. Windows下Linux子系统的安装与使用 wsl
  6. chatGPT实现秒杀程序过程,真是让人感到不可思议
  7. 【高大上の连载】TA神犇的日常[弃坑,停更]
  8. 阻止的计算机代码是什么意思,“阻止Windows准确地检查此计算机的许可证。错误代码:0x.....”是怎么回事?...
  9. 消息自动发送(python信息处理)
  10. NLB无线定位服务器报警,一次异常艰难的Exchange NLB排错经历详细记录