【问题标题】:How to numerically integrate with infinite limit in MATLAB?如何在MATLAB中与无限极限进行数值积分?
【发布时间】:2015-08-19 20:46:34
【问题描述】:

我想对具有无限限制的积分进行数值积分。有谁知道我该怎么做?

int(x* exp (v*x + (1-exp(v*x))/v),x, o , inf) 不起作用。

请注意,我将拥有 v 的值。

%n=10;
kappa=.5;
delta0=.5;
Vmax=500;
Vdep=2.2;
l=2.2;
kbT=4.1;
%xb=.4;
fb=10;
k=1;
V0=5;

e1=(fb*l/kbT)*(kappa/delta0);
e2=Vmax/V0;
e3=Vdep/V0;

w=zeros(1,25);

for v=1:25
    w(:,v)=integral(@(x) x.*exp(v*x+((1-exp(v*x))/v)),0,inf);
end

e12=e2*exp(-e1*(1:25).*w.^2)-e3;
plot(e12);
ylim([0 25]);
hold on;
plot(0:25,0:25);
xlim([0 25]);
%hold off;

图与文中真实数据不符!(专门针对e12曲线) 我需要计算两条曲线的交点(根据论文约为 13.8),然后在第二部分中,我必须在 e12 中添加一个包含自变量的项:

v=13.8;
w= integral(@(x) x.*exp(v*x+((1-exp(v*x))/v)),0,inf)
e4 = zeros (1,180);
fl = 1:180;
e4(:,fl)= (fl*l/kbT)*(kappa/n);
e12=e2*exp(-e1*v*w^2-e4)-e3

但问题又是,运行此代码时,我将以 e12 的负值结束,在 fl (fl>160) 的大值中应该接近零

要显示此代码与预期曲线有何不同,您可以将这些数据绘制在同一图上:

fl = [0, 1, 4, 9, 15, 20, 25, 40, 60, 80, 100, 120, 140, 160, 180];
e12 = [66, 60, 50, 40, 30, 25.5, 20, 15.5, 10.5, 8.3, 6.6, 5, 2.25, 1.1, 0.5];

这显然与代码生成的曲线不符。

【问题讨论】:

  • “不起作用”没有帮助。如果有错误,请完整提供。如果输出与您的期望不符,请说明它是什么,为什么您认为它是错误的。编辑您的问题。还提供完全可运行的代码,包括所有变量声明。
  • 另外,你的积分下界真的应该是一个名为o(字母)而不是数字0(数字)的变量吗?
  • v的取值范围是多少?它们是真实的还是复杂的?
  • 您好,感谢您的帮助! 1.不工作我的意思是它会出错!我不记得错误是什么,但现在我已经更改了代码,它现在可以成功运行,但结果与我预期的有所不同。 (我将在下一条评论中提供代码) 2.. 较低的集成 ix 0 ,当我在这里输入时这是一个错字! 3. v的值是0到25之间的实整数。

标签: matlab integration infinite numerical


【解决方案1】:

假设问题是关于这个完整的代码:

syms x;
v = 1; % For example
int(x*exp(v*x + (1-exp(v*x))/v),x, 0, Inf)

问题在于它会返回自身(即int 找不到解析解),可以将'IgnoreAnalyticConstraints' 选项设置为true (more details) 以获得解决方案:

syms x;
v = 1; % For example
int(x*exp(v*x + (1-exp(v*x))/v),x, 0, Inf, 'IgnoreAnalyticConstraints', true)

返回-ei(-1)*exp(1),其中eiexponential integral function(有关数值计算,另请参见expint)。对于v 的负值,解决方案也将是eulergammaEuler-Mascheroni constant。当然,如果v0,则积分是未定义的。


使用 Mathematica 10.0.2 的 Integrate 产生符号 v 的完整解决方案。

Integrate[x Exp[v x - (Exp[v x] - 1)/v], {x, 0, Infinity}]

返回

ConditionalExpression[(E^(1/v) (EulerGamma + Gamma[0, 1/v] + Log[1/v]))/v, Re[v] < 0]

申请Assumptions:

Integrate[x Exp[v x - (Exp[v x] - 1)/v], {x, 0, Infinity}, Assumptions -> v > 0]
Integrate[x Exp[v x - (Exp[v x] - 1)/v], {x, 0, Infinity}, Assumptions -> v < 0]

返回

(E^(1/v) Gamma[0, 1/v])/v

(E^(1/v) (2 EulerGamma - 2 ExpIntegralEi[-(1/v)] + Log[1/v^2]))/(2 v)

其中Gammaupper incomplete gamma function。这些似乎与 Matlab 的结果相匹配。

在 Matlab 中对这些数值进行评估:

% For v > 0
v_inv = 1./v;
exp(v_inv).*expint(v_inv).*v_inv

% For v < 0
v_inv = 1./v;
exp(v_inv).*(2*double(eulergamma)+2*(expint(v_inv)+pi*1i)+log(v_inv.^2)).*v_inv/2

【讨论】:

    【解决方案2】:

    数值积分是通过对距离dx 的离散点处的函数求和来执行的。您选择的dx 越小,获得的近似值就越好。例如,从x=0x=10 的集成由以下方式完成:

    x = 0:dx:10;
    I = sum(x.* exp (v*x + (1-exp(v*x))/v))*dx;
    

    显然,x=inf 不能这样做。但我相信你的功能会迅速衰减。因此,您可以假设x* exp (v*x + (1-exp(v*x))/v) = 0 足够大x。否则积分是发散的。因此,您所要做的就是设置x 的限制。如果您不确定应该是什么限制,您可以执行带有停止条件的循环:

    I = 0;
    prevI = -1;
    x = 0;
    while abs(I-prevI)>err
      prevI = I;
      I = I + x.* exp (v*x + (1-exp(v*x))/v)*dx;
      x = x + dx;
    end
    

    现在,您只需设置所需的dxerr

    【讨论】:

    • 虽然这确实有效,但不使用 Matlab 内置函数往往会非常缓慢。更不用说使用这种集成是非常不精确的。有些方法的精度要高得多,而无需更多的计算成本。
    • 以前,我使用相同的方法进行近似,但问题是结果与我预期的不同!我不知道问题出在哪里。我怎样才能在此处发送照片,以便我可以向您展示不同结果的含义。
    【解决方案3】:

    你必须阅读这个:Mathwork Link

    也许您在使用的函数中犯了错误。另请注意,MATLAB 语法区分大小写..

    【讨论】:

      猜你喜欢
      • 2015-03-30
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2012-11-27
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多