我正在尝试使用包含具有无限集成限制的定积分的数值计算的公式来拟合我的数据。为了拟合,我使用需要矢量化模型函数的八度函数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
中使用此构造。我该如何解决这个限制?
提前谢谢!
答案 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循环。