Matlab 用积分或四次积分计算数值积分

Matlab 用积分或四次积分计算数值积分,matlab,integral,Matlab,Integral,我正在使用MATLAB计算包含自然指数的复函数的数值积分 我得到一个警告: 遇到无限或非数字值 如果我使用函数integral,同时引发另一个错误: 函数的输出必须与输入的大小相同 如果我使用函数quadgk 我认为原因可能是当变量ep接近零时,被积函数是无限的 代码如下所示。希望你们能帮我弄清楚 close all clear clc %% N = 10^5; edot = 10^8; yita = N/edot; kB = 8.6173324*10^(-5); T = 300; gamain

我正在使用MATLAB计算包含自然指数的复函数的数值积分

我得到一个警告:

遇到无限或非数字值

如果我使用函数
integral
,同时引发另一个错误:

函数的输出必须与输入的大小相同

如果我使用函数
quadgk

我认为原因可能是当变量
ep
接近零时,被积函数是无限的

代码如下所示。希望你们能帮我弄清楚

close all
clear
clc
%%
N = 10^5;
edot = 10^8;
yita = N/edot;
kB = 8.6173324*10^(-5);
T = 300;
gamainf = 0.115;
dTol = 3;
K0 = 180;
K = K0/160.21766208;
nu = 3*10^12;
i = 1;
data = [];
%% lambda = ec/ef < 1
for ef = 0.01:0.01:0.1
    for lambda = 0.01:0.01:0.08
        ec = lambda*ef;
        f = @(ep) exp(-((32/3)*pi*gamainf^3*(0.5+0.5*sqrt(1+2*dTol*K*(ep-ec)/gamainf)-dTol*K*(ep-ec)/gamainf).^3/(K*(ep-ec)).^2-16*pi*gamainf^3*(0.5+0.5*sqrt(1+2*dTol*K*(ep-ec)/gamainf)-dTol*K*(ep-ec)/gamainf).^2/((1+dTol*K*(ep-ec)/(gamainf*(0.5+0.5*sqrt(1+2*dTol*K*(ep-ec)/gamainf)-dTol*K*(ep-ec)/gamainf)))*(K*(ep-ec)).^2))/(kB*T));
        q = integral(f,0,ef,'ArrayValued',true);
        % q = quadgk(f,0,ef);
        prob = 1-exp(-yita*nu*q);
        data(i,1) = ef;
        data(i,2) = lambda;
        data(i,3) = q;
        i = i+1;
    end
end
全部关闭
清楚的
clc
%%
N=10^5;
edot=10^8;
yita=N/edot;
kB=8.6173324*10^(-5);
T=300;
gamainf=0.115;
dTol=3;
K0=180;
K=K0/160.21766208;
nu=3*10^12;
i=1;
数据=[];
%%λ=ec/ef<1
对于ef=0.01:0.01:0.1
对于λ=0.01:0.01:0.08
ec=λ*ef;
(3.5+0.5+0.5*sqrt(1+2+2*dTol*K*(ep ec)/gamainf(gamainf)1+2*dTol*dTol*K*K*K*(ep ec ep)/gamainf(ep ec)/gamainf-dTol*K*(ep ec)/gamainf-dTol*K*K*K*(ep ep(ep ec)/gamainf)/gamainf-dTol*K*(ep ec)K*(ep ec)和(ep ec)/gamainf-dTol*K*(ep/gamainf)dTol*K*(ep(ep ec)K*(ep/GAMAAIF)K*(ep/gamainf)dTol*K*(ep*(ep*(ep/gamainf)K*(ep/GAAMAIF)和/GAAMAIF)和(ep/GAAMAIF)和(EPA)和/GANAF)的)gamainf))*(K*(ep-ec)).^2/(kB*T));
q=积分(f,0,ef,'ArrayValue',真);
%q=quadgk(f,0,ef);
prob=1-exp(-yita*nu*q);
数据(i,1)=ef;
数据(i,2)=λ;
数据(i,3)=q;
i=i+1;
结束
结束

我已经重写了你的方程式,以便人类能够真正理解它:

function integration

    N       = 1e5;
    edot    = 1e8;
    yita    = N/edot;
    kB      = 8.6173324e-5;
    T       = 300;
    gamainf = 0.115;
    dTol    = 3;
    K0      = 180;
    K       = K0/160.21766208;
    nu      = 3e12;
    i       = 1;
    data    = [];

    %% lambda = ec/ef < 1
    for ef = 0.01:0.01:0.1
        for lambda = 0.01:0.01:0.08
            ec = lambda*ef;

            q = integral(@f,0,ef,'ArrayValued',true);
            % q = quadgk(f,0,ef);

            prob = 1 - exp(-yita*nu*q);
            data(i,:) = [ef lambda q];

            i = i+1;
        end
    end


    function y = f(ep)

        G = K*(ep - ec);
        r = dTol*G/gamainf;
        S = sqrt(1 + 2*r);
        x = (1 + S)/2 - r;
        Z = 16*pi*gamainf^3;

        y =  exp( -Z*x.^2.*( 2*x/(3*G.^2) - 1/(G.^2*(1 + r/x))) ) /...
                                     (kB*T));

    end

end
并在一些示例节点上打印其值,如下所示:

for ef = 0.01 : 0.01 : 0.1
    for lambda = 0.01 : 0.01 : 0.08

        ec = lambda*ef;

        zzz(i,:) = [f(0) f(ef/4) f(ef)];

        i = i+1;
     end
end

zzz
我明白了:

%    f(0)                      f(ef/4)                   f(ef)
zzz =
     7.878426438111721e+07     1.093627454284284e+05     3.091140080273912e+03
     1.986962280947140e+07     1.201698288371587e+05     3.187767404903769e+03
     8.908646053687230e+06     1.325435523124976e+05     3.288027743119838e+03
     5.055141696747510e+06     1.467952125661714e+05     3.392088351112798e+03
     ...
     3.601790797707676e+04     2.897200140791236e+02     2.577170427480841e+01
     2.869829209254144e+04     3.673888685004256e+02     2.404148067956737e+01
     2.381082059148755e+04     4.671147785149462e+02     2.238181495716831e+01
因此,
integral()
必须处理
exp(10^7)
之类的事情。如果论点能够足够快地消失,这本身可能不是一个问题,但如上所示,事实并非如此

所以基本上你要求的是一个函数的积分,它的值在
exp(~10^7)
exp(~10^3)
之间。不用说,顺序为
0.01
d(ef)
不会补偿这一点,而且它在浮点运算中是非有限的

我怀疑你有缩放问题。从变量的名称和方程来看,我认为这与热力学有关;普朗克定律的改写形式?在这种情况下,我会检查你是否在纳米范围内工作;
10^(-9)
的一些因子将悄悄进入,将被积函数重新缩放到可计算的范围

在任何情况下,检查你所有的单位都是明智的,因为这样会弄乱数字


注意:您可以计算的最大值大约是
exp(709.7827128933840)

我已经重写了您的方程式,以便人类能够真正理解它:

function integration

    N       = 1e5;
    edot    = 1e8;
    yita    = N/edot;
    kB      = 8.6173324e-5;
    T       = 300;
    gamainf = 0.115;
    dTol    = 3;
    K0      = 180;
    K       = K0/160.21766208;
    nu      = 3e12;
    i       = 1;
    data    = [];

    %% lambda = ec/ef < 1
    for ef = 0.01:0.01:0.1
        for lambda = 0.01:0.01:0.08
            ec = lambda*ef;

            q = integral(@f,0,ef,'ArrayValued',true);
            % q = quadgk(f,0,ef);

            prob = 1 - exp(-yita*nu*q);
            data(i,:) = [ef lambda q];

            i = i+1;
        end
    end


    function y = f(ep)

        G = K*(ep - ec);
        r = dTol*G/gamainf;
        S = sqrt(1 + 2*r);
        x = (1 + S)/2 - r;
        Z = 16*pi*gamainf^3;

        y =  exp( -Z*x.^2.*( 2*x/(3*G.^2) - 1/(G.^2*(1 + r/x))) ) /...
                                     (kB*T));

    end

end
并在一些示例节点上打印其值,如下所示:

for ef = 0.01 : 0.01 : 0.1
    for lambda = 0.01 : 0.01 : 0.08

        ec = lambda*ef;

        zzz(i,:) = [f(0) f(ef/4) f(ef)];

        i = i+1;
     end
end

zzz
我明白了:

%    f(0)                      f(ef/4)                   f(ef)
zzz =
     7.878426438111721e+07     1.093627454284284e+05     3.091140080273912e+03
     1.986962280947140e+07     1.201698288371587e+05     3.187767404903769e+03
     8.908646053687230e+06     1.325435523124976e+05     3.288027743119838e+03
     5.055141696747510e+06     1.467952125661714e+05     3.392088351112798e+03
     ...
     3.601790797707676e+04     2.897200140791236e+02     2.577170427480841e+01
     2.869829209254144e+04     3.673888685004256e+02     2.404148067956737e+01
     2.381082059148755e+04     4.671147785149462e+02     2.238181495716831e+01
因此,
integral()
必须处理
exp(10^7)
之类的事情。如果论点能够足够快地消失,这本身可能不是一个问题,但如上所示,事实并非如此

所以基本上你要求的是一个函数的积分,它的值在
exp(~10^7)
exp(~10^3)
之间。不用说,顺序为
0.01
d(ef)
不会补偿这一点,而且它在浮点运算中是非有限的

我怀疑你有缩放问题。从变量的名称和方程来看,我认为这与热力学有关;普朗克定律的改写形式?在这种情况下,我会检查你是否在纳米范围内工作;
10^(-9)
的一些因子将悄悄进入,将被积函数重新缩放到可计算的范围

在任何情况下,检查你所有的单位都是明智的,因为这样会弄乱数字


注意:您可以计算的最大值大约是
exp(709.7827128933840)

作为旁注,我想指出,“”作为旁注,我想指出,“”您是完全正确的。我正在处理一些热力学问题。谢谢你的回答。在推导公式时一定存在一些错误。你说得很对。我正在处理一些热力学问题。谢谢你的回答。推导公式时一定存在一些错误。