与MATLAB进行数值积分以实现两个不同的功能

时间:2018-10-24 02:32:23

标签: matlab integration numerical-methods

我在MATLAB中有两个数值积分函数,如下所示:

fun1 = @(x) log2(1+x).*(4*exp(2*lambda*(d*sqrt(- d^2 + (a./x).^(2/alp))-(a./x).^(2/alp).*...
    acos(((a./x).^(1/alp)./d).^(-1)))).*(a./x).^(2/alp).*lambda.*acos(((a./x).^(1/alp)./d).^(-1)))./(x.*alp);

num1=integral(@(x)fun1(x),0,a/(d^alp));

fun2 = @(x) exp(1./x).*expint(1./x).*(4*exp(2*lambda*(d*sqrt(- d^2 + (a./x).^(2/alp))-(a./x).^(2/alp).*...
    acos(((a./x).^(1/alp)./d).^(-1)))).*(a./x).^(2/alp).*lambda.*acos(((a./x).^(1/alp)./d).^(-1)))./(x.*alp);

num2=integral(@(x)fun2(x),0,a/(d^alp));

fun1中,我有log2(1+x)(其余术语对于fun1fun2都是相同的),它给出了数值答案。

fun2中,我有exp(1./x).*expint(1./x),它没有给出数值。

d=1.2; lambda=4.5; alp=2.7;f=1;a=0.5;

num1 =

0.3078

Warning: Infinite or Not-a-Number value encountered. 

num2 =

   NaN

我注意到可以用MATHEMATICA计算。但是我在MATLAB中运行仿真时需要它。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我猜想integral函数会导致上溢或下溢,因为它使用了双精度算法。您可以尝试使用变量精度算术的vpaintegral

修改后的代码:

d=1.2; lambda=4.5; alp=2.7;f=1;a=0.5;

fun1 = @(x) log2(1+x).*(4*exp(2*lambda*(d*sqrt(- d^2 + (a./x).^(2/alp))-(a./x).^(2/alp).*...
    acos(((a./x).^(1/alp)./d).^(-1)))).*(a./x).^(2/alp).*lambda.*acos(((a./x).^(1/alp)./d).^(-1)))./(x.*alp);

num1=integral(@(x)fun1(x),0,a/(d^alp))

syms x

fun2 =  exp(1./x).*expint(1./x).*(4*exp(2*lambda*(d*sqrt(- d^2 + (a./x).^(2/alp))-(a./x).^(2/alp).*...
    acos(((a./x).^(1/alp)./d).^(-1)))).*(a./x).^(2/alp).*lambda.*acos(((a./x).^(1/alp)./d).^(-1)))./(x.*alp);

num2=vpaintegral(fun2,0,a/(d^alp))

输出:

num1 =
    0.3078
num2 =
0.197608