Matlab 用积分或四次积分计算数值积分
我正在使用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
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)
作为旁注,我想指出,“”作为旁注,我想指出,“”您是完全正确的。我正在处理一些热力学问题。谢谢你的回答。在推导公式时一定存在一些错误。你说得很对。我正在处理一些热力学问题。谢谢你的回答。推导公式时一定存在一些错误。