2016-04-05 395 views
0

我需要在MATLAB代碼中使用Meijer的G函數。由於在MATLAB中不存在此函數的實現,因此我試圖根據http://functions.wolfram.com/HypergeometricFunctions/MeijerG/07/01/中給出的積分表達式對函數進行編碼。Meijer在MATLAB中的G函數實現

我的代碼靈感來自http://arxiv.org/pdf/1602.05445v1.pdf中給出的代碼。

function out = Meijer_G(an, ap, bm, bq, z) 
%***** Integrand definition ***** 
F = @(s)(GammaProd(bm,s).*GammaProd(1-an,-s).*(z.^(-s)))./(GammaProd(ap,s).*GammaProd(1-bq,-s)); 

%***** Contour definition ***** 
Sups = min(bm); 
Infs = -max(1-an); % cs 
cs = (Sups + Infs)/2;% s between Sups and Infs 
W = 50; % W 
%***** Bivariate Meijer G ***** 
out = real((1/(2*pi*1i))*quadv(@(s) F(s),cs-1i*W,cs+1i*W)); 

function output = GammaProd(p,z) 
[pp, zz] = meshgrid(p,z); 
if (isempty(p)) 
    output = ones(size(z)); 
else 
    output = reshape(prod(gammac(pp+zz),2),size(z)); 
end 
end 
end; 

這裏的gammac功能是複雜的伽馬,在 %www.mathworks.com/matlabcentral/fileexchange/3572-gamma可用。

問題是,當我使用數值將我的代碼與Mathematica中給出的Meijer G函數進行比較時,在某些情況下會有所不同。我想知道你是否可以幫助修復代碼。

謝謝。

+1

你沒有Matlab的符號工具箱嗎?如果你這樣做,那麼你可以使用MuPAD的['meijerG'](http://www.mathworks.com/help/symbolic/mupad_ref/meijerg.html)。 MuPAD函數可以通過[在此描述的方法]從Matlab調用(http://www.mathworks.com/help/symbolic/calling-mupad-functions-from-matlab.html)。或者試試這個[這個文件交換提交](http://www.mathworks.com/matlabcentral/fileexchange/31490-meijerg)。 – horchler

+0

我確實嘗試調用MuPAD的'meijerG'函數,但是對於某些參數,我沒有得到相同的值。 – kagami

+0

您應該包含精確的差異示例。麻煩可能更多的是數學性質(例如隱藏簡化,關於分支點和集成輪廓的約定)。 – ogerard

回答