问题:有些时候我们需要拟合一些非线性的表达式。
比如:我们知道一个表达式的式子是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