matlab 最小二乘法拟合

我做了一段曲线,想用最小二乘拟合考察一下曲线满足的方程,以下是曲线图片

我估计曲线方程满足极坐标下的衰减方程,就写了这么一段代码(曲线上的点由直角坐标给出)
% curve fit
[theta, rho] = cart2pol(x(:,1),x(:,2)); % transform into polar coord
f = inline('R * exp(-a * x)','[R a]','x');
[BestPara,resnorm,residul] = lsqcurvefit(f, [1.5 1], theta, rho);

结果给出了以下的错误信息:
>> CurveTest %CurveTest 是我编的M文件的名称
Insufficient number of outputs from right hand side of equal
sign to satisfy assignment.
(等号右边的输出参数个数不够,不满足赋值条件)
Error in inlineeval (line 11)
eval(INLINE_INPUTEXPR_);

Error in inline/feval (line 34)
INLINE_OUT_ = inlineeval(INLINE_INPUTS_,
INLINE_OBJ_.inputExpr, INLINE_OBJ_.expr);

Error in lsqcurvefit (line 195)
initVals.F =
feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});

Error in CurveTest (line 17)
[BestPara,resnorm,residul] = lsqcurvefit(f, [1.5 1], theta,
rho);
Caused by:
Failure in initial user-supplied objective function
evaluation. LSQCURVEFIT cannot continue.
(程序在用户预先提供的目标函数中运行失败,最小二乘法拟合无法继续)

是我的函数原型不够好吗?我知道这个方程可能会很粗略,但应该怎样改才能正确运行?我是matlab新手,希望各位大神多多指教,谢谢!

主要的问题是inline函数写法不对,matlab不能识别下面的写法:

f = inline('R * exp(-a * x)','[R a]','x');

像这种有多个待辨识参数的情况,应该写成一个向量,如

f = inline('c(1) * exp(-c(2) * x)','c','x');

 

 

参考代码:

% 生成测试数据
t=linspace(0,2*pi,50);
x=1.5*cos(t);
y=1.5*sin(t);
plot(x,y)
hold on
t=linspace(0,pi,30);
r=1.5 * exp(-1 * t) + 0.02 * randn(size(t));  % 数据中加入噪声
x=r.*cos(t);
y=r.*sin(t);
plot(x,y,'r')
axis equal
 
% curve fit
[theta, rho] = cart2pol(x, y);  % transform into polar coord
idx = (x<=eps) & (y<=eps);
theta(idx) = [];
rho(idx) = [];
f = inline('c(1) * exp(-c(2) * x)','c','x');
[BestPara,resnorm,residul] = lsqcurvefit(f, [1.5 1], theta, rho);
R = f(BestPara, theta);
X=R.*cos(theta);
Y=R.*sin(theta);
plot(X,Y,':g')
legend('圆', '原始数据', '拟合数据');

结果如图:

温馨提示:答案为网友推荐,仅供参考
相似回答