Численная интеграция с MATLAB для двух разных функций - PullRequest
0 голосов
/ 24 октября 2018

У меня есть две функции числового интегрирования в 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) (остальные термины одинаковы для fun1 и fun2) иэто дает числовой ответ.

В 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 голосов
/ 24 октября 2018

Я полагаю, что функция 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
...