erfc Matlab函数是互补误差函数,它的定义如下:
erfc(x) = 2/sqrt(pi) * integral from x to inf of exp(-t^2) dt
我想将此功能更改为:
erfc_change(a+b*R) = 1/2*sqrt(pi) * integral from (a+b*vec_x) to inf of exp(-t^2/2) dt %note here exp(-t^2/2) and vec_x is a vector of values that represent the values of x in the erfc function
在最小平方误差曲线拟合中使用它(常数' a'' b'应近似)。
所以我做了一个变量变化,我得到了这个结果:
erfc_change(a+b*vec_x) = (sqrt(2*pi)/2)*erfc(a+b*vec_x/sqrt(2))
我不确定变量变化的可靠性。
在此之后,我执行这样的最小二乘拟合==>这个我可以运行的代码:
vec_x=
[0;0.4636;0.6616;0.8225;0.1095;0.1706;0.2302;0.1603;
0.2392;0.3245;0.3741;0.5376;0.6675;0.1308;0.1881;
0.2296;0.03740;0.002600;0.04530;0.02660;0.02990;0.0297];
vec_y=[3.3010;5.5840;7.2970;8.8660;4.1200;5.4140;7.1710;
4.5820;6.5400;6.8220;5.6220;8.0110;8.6600;
3.4010;3.7460;4.7180;2.9260;3.4290;4.2780;2.2480;3.8900;4.359];
options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
f = @(x,vec_x)(1/sqrt(2))*erfc(x(1)+(x(2)*vec_x/sqrt(2)));
lsqcurvefit(f,-2,vec_x,vec_y); % the approximation will starts from -2
这里我遇到错误(执行上面的代码后):
Index exceeds matrix dimensions.
Error in @(x,fmpd_dinosaur)(1/sqrt(2))*erfc(x(1)+
(x(2)*fmpd_dinosaur/sqrt(2)))
Error in lsqcurvefit (line 199)
initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:});
Caused by:
Failure in initial user-supplied objective function evaluation.
LSQCURVEFIT cannot continue.
我不明白这个错误来自哪里。有任何想法吗 ?
答案 0 :(得分:0)
这实际上与erfc
函数无关。
Index exceeds matrix dimensions
正在评估您提供的功能时出现lsqcurvefit
错误。
这是因为您的函数f
需要一个2元素参数向量x
,但您提供的lsqcurvefit
初始猜测只包含一个元素。因此,当它试图访问第二个元素x(2)
时会遇到问题。
因此,在您的情况下,解决方案只是提供适当维度的初始猜测:
>> lsqcurvefit(f,[-2,-2],vec_x,vec_y)
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the function tolerance.
<stopping criteria details>
ans =
-11.9673 -2.8082