自定义ERFC功能MATLAB

时间:2015-12-23 16:47:03

标签: matlab

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.

我不明白这个错误来自哪里。有任何想法吗 ?

1 个答案:

答案 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