如何在MATLAB中进行无限极限的数值积分?

如何在MATLAB中进行无限极限的数值积分?,matlab,integration,infinite,numerical,Matlab,Integration,Infinite,Numerical,我想数值积分一个具有无穷极限的积分。有人知道我该怎么做吗 intx*exp v*x+1-expv*x/v、x、o、inf不工作 注意,我将有v的值 绘图与文章中的真实数据不匹配!特别针对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(:

我想数值积分一个具有无穷极限的积分。有人知道我该怎么做吗

intx*exp v*x+1-expv*x/v、x、o、inf不工作

注意,我将有v的值

绘图与文章中的真实数据不匹配!特别针对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>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];

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

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

x = 0:dx:10;
I = sum(x.* exp (v*x + (1-exp(v*x))/v))*dx;
显然,对于x=inf,你不能这样做,但我相信你的函数会很快衰减。因此,对于足够大的x,可以假设x*exp v*x+1-expv*x/v=0。否则积分是发散的。所以你要做的就是设定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
现在,您只需设置所需的dx和err,您必须阅读以下内容:


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

假设问题与完整代码有关:

syms x;
v = 1; % For example
int(x*exp(v*x + (1-exp(v*x))/v),x, 0, Inf)
问题是它会返回自身,也就是说,int没有找到解析解,可以将选项设置为true来得到一个解:

syms x;
v = 1; % For example
int(x*exp(v*x + (1-exp(v*x))/v),x, 0, Inf, 'IgnoreAnalyticConstraints', true)
返回-ei-1*exp1,其中为数值计算的参考值。对于负值v,解决方案也将是,的形式。当然,如果v是0,积分是未定义的

使用Mathematica 10.0.2得出符号v的完整解

返回

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

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

火车在哪里。这些结果似乎与Matlab的结果相符

要在Matlab中对这些参数进行数值计算,请执行以下操作:

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


不工作是没有帮助的。如果有错误,请完整提供。如果输出与您期望的不匹配,请说明它是什么,以及为什么您认为它是错误的。编辑你的问题。还提供完全可运行的代码,包括所有变量声明。此外,您的积分下限真的应该是一个名为o字母的变量,而不是数字0?v的值的范围是什么?它们是真实的还是复杂的?嗨,谢谢你的帮助!1.我所说的“不工作”是指它出错了!我不记得是什么错误,但现在我已经更改了代码,它现在正在成功运行,但结果与我预期的结果有所不同。我将在下一个注释2中提供代码。。低集成ix 0和它是一个打字错误,当我在这里键入它!3.v的值是0到25之间的实整数。虽然这确实有效,但不使用Matlab内置函数往往会非常缓慢。更不用说使用这种集成是非常不精确的。有些方法具有更好的精度,而不需要更多的计算成本。以前,我使用相同的近似方法,但问题是结果与我预期的结果不同!我不知道是什么问题。我怎样才能在这里发送一张照片,以便向您展示我所说的不同结果的含义。
(E^(1/v) (2 EulerGamma - 2 ExpIntegralEi[-(1/v)] + Log[1/v^2]))/(2 v)
% 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