Matlab:积分函数中的错误

计算科学 matlab 积分方程
2021-12-02 20:21:02

我想用 Matlab 编写的以下代码计算积分。

function f = LO_scheme2a(r,kk)
% Run the Prog by :  q = integral(@(r)LO_scheme2a(r,kk), 0, inf)

%% System parameters 
lambda_m= 10^(-2);
lambda_f= kk.*lambda_m; %can be changed based on scenario
mu= 10^-4; %user density (find the proper user density or scenario based) 
Pdbm_m=43;
P_m=10.^(Pdbm_m./10);
Pdbm_f=20;
P_f=10.^(Pdbm_f./10);
gammadBm_m=0;
gamma_m=10.^(gammadBm_m./10);
gammadBm_f=0;
gamma_f=10.^(gammadBm_f./10);
alpha=4;
k=(P_f/P_m)^(1/alpha);% choose proper value
%k=.4
%% Busy Burst parameters 

Pdbm_req=0; % the optimum one should be calculated
P_req=10.^(Pdbm_req./10);
gammadBm_0=-40;
gamma_0=10.^(gammadBm_0./10);
%%
%% scheme 2
P_t=P_f;
C0=1; %By changing C_0 you can investigate the performance of system 
Theta_0=C0.* P_f;
%%
D1=(P_req./gamma_0).^(1./alpha);
D2=(Theta_0./gamma_0./P_t).^(1./alpha).*r;
D=D2;
lambda_fnew=lambda_f.*exp(-pi.*mu.*D.^2);
%%
PM_u=lambda_m./(lambda_m+k.^2.*lambda_fnew);
PF_u=lambda_fnew.*k.^2./(lambda_m+k.^2.*lambda_fnew);
%%
fm_M=2.*pi.*r.*(lambda_m+k.^2.*lambda_fnew).*exp(-pi.*r.^2.*(lambda_m+k.^2.*lambda_fnew));
ff_F=2.*pi.*r.*(lambda_m./k.^2+lambda_fnew).*exp(-pi.*r.^2.*(lambda_m./k.^2+lambda_fnew));
%%
%% Interference from MBSs to MU an FU
A_i= 1;
S_i=gamma_m .*r.^alpha;
LIm_m=exp(-pi.*lambda_m.*(A_i.*r).^2.*rho1(gamma_m,alpha));
%LIm_m=exp(-pi.*lambda_m.*(A_i.*r).^2.*rho0(S_i./(A_i.*r).^alpha,alpha));
A_i= 1./k;
S_i=gamma_f .*r.^alpha *P_m/P_f;
LIf_m=exp(-pi.*lambda_m.*(A_i.*r).^2.*rho1(gamma_f.*P_m.*k.^alpha./P_f,alpha));
%LIf_m=exp(-pi.*lambda_m.*(A_i.*r).^2.*rho0(S_i./(A_i.*r).^alpha,alpha));

%%
max_x= 10^5;
%% Expectation over h in lemmma 3 :  Interference from FAPs to MU an FU
S_i=gamma_f .*r.^alpha .*P_f./P_m;
z=(P_req/gamma_0).^(1/alpha);
%MIm_f=(exp(-h).*exp(-mu.*pi.*z^2.*h.^(2./alpha))).*((-((z.^2).*h^(2/alpha)).*(1-exp(-S_i.*z.^(-alpha))))+(S_i.*h).^(2./alpha).*real(gammainc(1-(2./alpha),S_i.*z.^(-alpha))));
for idx = 1:numel(r)
    MIm_f(idx)=  integral(@(h)exp(-h).*((exp(-mu.*pi.*z^2.*h.^(2./alpha))).*((-((z.^2).*h.^(2./alpha)).*(1-exp(-S_i.*z.^(-alpha))))+(S_i.*h).^(2./alpha).*real(gammainc(1-(2./alpha),S_i.*z.^(-alpha))))),0,max_x);
end
% % 
S_i=gamma_f .*r.^alpha ;
z=(P_req./gamma_0).^(1/alpha);

for idx = 1:numel(r)
    MIf_f(idx)=  integral(@(h)(exp(-h).*exp(-mu.*pi.*z^2.*h.^(2./alpha))).*((-((z.^2).*h.^(2./alpha)).*(1-exp(-S_i.*z.^(-alpha))))+(S_i.*h).^(2./alpha).*real(gammainc(1-(2./alpha),S_i.*z.^(-alpha)))),0,max_x);
end
%%

f=PM_u.*LIm_m.*exp(-2.*pi.*lambda_f.*MIm_f).*fm_M+PF_u.*LIf_m.*exp(-2.*pi.*lambda_f.*MIf_f).*ff_F;

在哪里

function [ f_rho ] = rho1( x,alpha)
f_rho=x.^(2./alpha).*(pi./2-atan(x.^(-2./alpha)));
end

我可以针对 kk 的各种值运行它,但是对于某些 kk,它会给我一个错误。例如,当kk=10时,我可以用命令运行这个程序

 q = integral(@(r)LO_scheme2a(r,kk), 0, inf)

但是对于 kk=100,它给了我一个错误。

(错误使用 .* 矩阵尺寸必须一致。)

你能帮我找到这个错误的根源吗?

1个回答

当您调用r 时q = integral(@(r)LO_scheme2a(r,kk), 0, inf)integral function chooses它是一个离散积分边界的向量。文档指出:

对于标量值问题,函数 y = fun(x) 必须接受向量参数 x,并返回向量结果 y。这通常意味着 fun 必须使用数组运算符而不是矩阵运算符。例如,使用 .*(次)而不是 *(哑剧)。

您的错误发生在您integral从代码中再次调用的地方。此时r是一个向量(一个可以改变大小的向量),你没有标量值问题。for你试图用你的两个循环来处理这个问题。但是,两个循环的右侧不依赖于您的索引变量idx,即r(idx).

但是,您甚至不需要for循环,因为上面的文档继续:

如果将 'ArrayValued' 选项设置为 true,则 fun 必须接受一个标量并返回一个固定大小的数组。

因此,使用该'ArrayValued'选项,您的for循环可以替换为:

...
fun = @(h,S_i,z)exp(-h).*exp(-mu*pi*z^2*h.^(2/alpha)) ...
                       .*(-z^2*h.^(2/alpha).*(1-exp(-S_i*z^-alpha)) ...
                       +(S_i.*h).^(2/alpha).*real(gammainc(1-2/alpha,S_i*z^-alpha)));
MIm_f = integral(@(h)fun(h,S_i,z),0,max_x,'ArrayValued',true);

S_i = gamma_f.*r.^alpha ;
z = (P_req./gamma_0).^(1/alpha);

MIf_f = integral(@(h)fun(h,S_i,z),0,max_x,'ArrayValued',true);
...

我还清理了您的匿名函数并添加了两个额外的参数,以便您可以重复使用它(请参见此处)。