函数矢量化包含八度音程中定积分的数值计算

时间:2017-04-25 15:20:09

标签: octave data-fitting numerical-integration

我正在尝试使用包含具有无限集成限制的定积分的数值计算的公式来拟合我的数据。为了拟合,我使用需要矢量化模型函数的八度函数leasqr。以下代码生成错误,该错误在调用数字集成时发生。

不一致的参数(op1是1x387,op2是10x2)

function  [fGsAb] = GsAbs (x, p) 
Hw = 3108.0 ;  
fGsAb = Hw ./ (2.4 .* p(1) .*p(2)) .^2 .* (exp ( - (Hw - p(1) .* x) .^2 ... 
./ (2.4 .* p(1) .*p(2)) .^2 )  - exp ( - (Hw + p(1) .* x) .^2  ...
./ (2.4 .* p(1) .*p(2)) .^2 )) ;
endfunction 
function [GsDisp] = gauss_disp(x,  p) 
[GsDisp1, err] = quadgk ( @(z)  GsAbs(z, p) ./(z-x), - inf, x - 0.000001 );
[GsDisp2, err] = quadgk ( @(z)  GsAbs(z, p) ./(z-x), x + 0.000001 , inf  );
GsDisp = GsDisp1 +GsDisp2;
endfunction     
h = [200:15:6000];
pin =[1 250];
dd   =  gauss_disp (h,  pin);

如果我正在使用循环:

for i = 1 : length (h)
dd (i) = gauss_disp (h (i),  pin) 
endfor 

我没有错误,但我无法在leasqr中使用此构造。我该如何解决这个限制?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

从此处更改gauss_disp.m文件:

function [GsDisp] = gauss_disp(x,  p) 
  [GsDisp1, err] = quadgk ( @(z)  GsAbs(z, p) ./(z-x), - inf, x - 0.000001 );
  [GsDisp2, err] = quadgk ( @(z)  GsAbs(z, p) ./(z-x), x + 0.000001 , inf  );
  GsDisp = GsDisp1 +GsDisp2;
endfunction 

到此:

function [GsDisp] = gauss_disp(x,  p)
  GsDisp  = arrayfun(@(z) gauss_disp_elementwise(z, p), x) 
endfunction 

function GsDisp = gauss_disp_elementwise(x, p)
  [GsDisp1, err] = quadgk ( @(z)  GsAbs(z, p) ./(z-x), - inf, x - 0.000001 );
  [GsDisp2, err] = quadgk ( @(z)  GsAbs(z, p) ./(z-x), x + 0.000001 , inf  );
  GsDisp = GsDisp1 +GsDisp2;
endfunction

即。将原始函数转换为仅处理标量值的辅助子函数,然后将其与arrayfun一起使用以获取x整个范围的输出。这样您就可以在leasqr函数中使用它,例如:

y = leasqr(h, dd, pin, @gauss_disp);

PS:arrayfun语法只是为了方便起见。您可以轻松地使用类似于您在问题中使用的for循环。