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(___)
fun:符号函数,例如匿名函数: @(A,B,X) A*X+B;
x0:初始解向量,需要求解的参数,使用前需要初始化.在上面的匿名函数中,x0可以看作是由A和B组成的向量,x0 = [A,B] ,为了基于X和Y数据,拟合出最适合的A,B参数;
xdata:已有的x值(可看作是输入数据);
ydata:已有的y值(可看作是样本的标签);
lb,ub:解向量的上下界限,lb <= x0 <= ub,若没有要求,就设为空lb=[ ],ub=[ ];
options:指定优化器的参数,也可只适用默认值,不设定,常见设置如下:
Option | 值 | 作用 |
---|---|---|
Display | ‘off’ ,‘iter’ , ‘final’ , ‘notify’ | ‘off’ :不显示输出; ‘iter’ :显示每次迭代的结果; ‘final’ :显示最终结果; ‘notify’ :只在函数不收敛的时候显示结果 |
MaxFunEvals | 正整数 | 函数求值运算最高次数 |
MaxIter | 正整数 | 最大迭代次数 |
TolFun | 正数 | 迭代终止误差 |
TolX | 正数 | 结束迭代的X值 |
例子:
fun = @(X0,X) X0*X
options = optimset(‘MaxFunEvals’,800,‘MaxIter’,500);
w = lsqcurvefit(fun,X0,X_data,Y_data,[],[],options);
[x,resnorm,residual,exitflag,output] = lsqcurvefit(___)
x:求出的解向量,即拟合的最优解。可以认为是x0不断迭代拟合,优化调整后,得到的最优的x0;
resnorm:残差的平方和,sum ((fun(x0,xdata)-ydata).^2);
residual:残差,fun(x0,xdata)-ydata;
exitflag:终止迭代的条件;
output:输出的优化信息。
完整示例:
xdata = [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata =[455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
fun = @(x,xdata)x(1)*exp(x(2)*xdata);
x0 = [100,-1];
options = optimset('MaxFunEvals',800,'MaxIter',500);
lb = [];
ub = [];
[x,resnorm,residual,exitflag,output] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options);
报这种错误的原因一般有两种,一是初始值设置的问题;二是拟合的数据中存在无定义的数据或者是空数据;
重新设置初始值,例如原来是0~1范围内的初始值,可以将其变换一下,使其在10以上,100以上,0~0.1,0~0.01等等,多次不同范围的尝试即可。
检查xdata和ydata矩阵,是否含有空数据(NaN)。但是如果矩阵太大,肉眼无法在变量栏中一下子直接看到,可以首先判断矩阵中所有位置上的元素是否为NaN,返回一个0,1矩阵,0:没有,1:有,进而返回NaN的位置索引。
(1)判断矩阵或向量中是否有空值
isnan()函数,判断矩阵中所有位置上的元素是否为NaN,返回一个0,1矩阵,0:没有,1:有
>> matrix=[4,NaN;3,5]
matrix =
4 NaN
3 5
>> a = isnan(matrix)
a =
2×2 logical 数组
0 1
0 0
(2)判断矩阵或向量中是否有
find()函数可以找到1的位置,也就对应了原始矩阵matrix中NaN的位置
>> [x,y] = find(a == 1)
x =
1
y =
2
>>