首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MATLAB中用无限大的极限进行数值积分?

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

Stack Overflow用户
提问于 2015-06-05 02:27:57
回答 3查看 2.6K关注 0票数 0

我想用数值方法来积分一个无穷大的积分。有人知道我该怎么做吗?

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

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

代码语言:javascript
运行
复制
%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中添加一个包含自变量的项:

代码语言:javascript
运行
复制
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)的大值中应该是接近于零的。

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

代码语言:javascript
运行
复制
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];

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-06 01:19:28

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

代码语言:javascript
运行
复制
syms x;
v = 1; % For example
int(x*exp(v*x + (1-exp(v*x))/v),x, 0, Inf)

问题是它返回自身(即int找不到解析解),可以将'IgnoreAnalyticConstraints'选项设置为true (更多细节)以获得一个解决方案:

代码语言:javascript
运行
复制
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),其中ei指数积分函数 (数值计算也请参见expint )。对于v的负值,解决方案也将是eulergamma,即欧拉-马斯切洛尼常数。当然,如果v0,积分是未知的。

使用Mathatica10.0.2的Integrate为符号v提供了一个完整的解决方案。

代码语言:javascript
运行
复制
Integrate[x Exp[v x - (Exp[v x] - 1)/v], {x, 0, Infinity}]

返回

代码语言:javascript
运行
复制
ConditionalExpression[(E^(1/v) (EulerGamma + Gamma[0, 1/v] + Log[1/v]))/v, Re[v] < 0]

应用Assumptions

代码语言:javascript
运行
复制
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]

返回

代码语言:javascript
运行
复制
(E^(1/v) Gamma[0, 1/v])/v

代码语言:javascript
运行
复制
(E^(1/v) (2 EulerGamma - 2 ExpIntegralEi[-(1/v)] + Log[1/v^2]))/(2 v)

其中Gamma上不完全伽马函数。这些结果与Matlab的结果相吻合。

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

代码语言:javascript
运行
复制
% For v > 0
v_inv = 1./v;
exp(v_inv).*expint(v_inv).*v_inv

代码语言:javascript
运行
复制
% 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
票数 -1
EN

Stack Overflow用户

发布于 2015-06-05 04:34:55

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

代码语言:javascript
运行
复制
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的限制。如果您不确定限制应该是什么,则可以执行具有停止条件的循环:

代码语言:javascript
运行
复制
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

票数 -1
EN

Stack Overflow用户

发布于 2015-06-05 04:35:22

您必须阅读以下内容:Mathwork

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30657409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档