优秀的编程知识分享平台

网站首页 > 技术文章 正文

MATLAB的nlinfit函数拟合非线性式子中的未知参数

nanyue 2024-08-31 23:56:13 技术文章 9 ℃

问题:有些时候我们需要拟合一些非线性的表达式。

比如:我们知道一个表达式的式子是y=A*sin(x).*exp(x)-B./log(x),现在我们手里面有x与y对应的一大把数据。我们如何根据x,y的值找出最佳的A、B值。则我们现在借助Matlab的函数lsqcurvefit、nlinfit,当然也可以使用lsqnonlin。


nlinfit函数基本语法

beta=nlinfit(X,Y,modelfun,beta0)
beta=nlinfit(X,Y,modelfun,beta0,options)
beta=nlinfit(___,Name,Value)
[beta,R,J,CovB,MSE,ErrorModelInfo]=nlinfit(___)
说明
beta=nlinfit(X,Y,modelfun,beta0) 使用 modelfun 指定的模型,返回一个向量,其中包含 Y 中的响应
对 X 中的预测变量的非线性回归的估计系数。它使用迭代最小二乘估计来估计系数,初始值由 beta0 
指定。
beta=nlinfit(X,Y,modelfun,beta0,options) 使用结构体 options 中的算法控制参数来拟合非线性回归。
beta=nlinfit(___,Name,Value) 使用由一个或多个名称-值对组参数指定的附加选项。例如,可以指定
观测值权重或非常量误差模型。
[beta,R,J,CovB,MSE,ErrorModelInfo] = nlinfit(___) 还返回残差 R、modelfun 的 Jacobian 矩阵 J、
估计系数的估计方差-协方差矩阵 CovB、
误差项的方差估计 MSE 以及包含误差模型细节的结构体 ErrorModelInfo。
[beta,r,j]=nlinfit(x,y,'model’,beta0)
 其中,输人数据x,y分别为n×m矩阵和n维列向量,对一元非线性回归,x为n维列向量model是事先
 用 m-文件定义的非线性函数,beta0是回归系数的初值, beta是估计出的回归系数,
  r是残差,j是Jacobian矩阵,它们是估计预测误差需要的数据。

实例


clc;
clear all;
close all;
x=2:0.01:10;
n = length(x);
y=8*sin(x).*exp(x)-12./log(x);
y1=8*sin(x).*exp(x)-12./log(x)+10000*rand(1,n);%假设这是实验测得的数据
a=[1 2];
f=@(a,x)a(1)*sin(x).*exp(x)-a(2)./log(x);
beta = nlinfit(x,y1,f,a)
[beta1,r,j] = nlinfit(x,y,@test,a)
f1 = test(beta,x);
f2 = test(beta1,x);
figure;
plot(x,y,'r');
xlabel('x');
ylabel('y');
hold on;
plot(x,f1,'b');
hold on
plot(x,f2,'g');
legend('原始数据','有扰动的数据拟合的结果数据','无扰动的数据拟合的结果数据');
figure;
plot(x,r,'r-+');
xlabel('x');
ylabel('残差');
function f=test(a,x)
f=a(1)*sin(x).*exp(x)-a(2)./log(x);
end

运行结果


beta =

   1.0e+03 *

    0.0081   -6.8317


beta1 =

    8.0000   12.0000
最近发表
标签列表