与 Matlab 的 Symbolic Toolbox 的无限集成 - 复杂的解决方案

Indefinite integration with Matlab's Symbolic Toolbox - complex solution

我正在使用 Matlab 2014b。我试过:

clear all
syms x real
assumeAlso(x>=5)

这返回:

ans =

[ 5 <= x, in(x, 'real')]

然后我尝试了:

int(sqrt(x^2-25)/x,x)

但这仍然返回了一个复杂的答案:

(x^2 - 25)^(1/2) - log(((x^2 - 25)^(1/2) + 5*i)/x)*5*i

我尝试了 simplify 命令,但仍然是一个复杂的答案。现在,这可能会在最新版本的 Matlab 中得到修复。如果是这样,人们可以让我知道或提供建议以获得真正的答案吗?

手算答案是sqrt(x^2-25)-5*asec(x/5)+C

答案并不真的复杂。

看看这个:

clear all; %To clear the conditions of x as real and >=5 (simple clear doesn't clear that)
syms x;
y = int(sqrt(x^2-25)/x, x)

据我们所知,它给出了:

y =

(x^2 - 25)^(1/2) - log(((x^2 - 25)^(1/2) + 5i)/x)*5i

现在输入 x≥5 的一些实际值来检查它给出的结果:

n = 1004;             %We'll be putting 1000 values of x in y from 5 to 1004
yk = zeros(1000,1);   %Preallocation
for k=5:n           
    yk(k-4) = subs(y,x,k);    %Putting the value of x
end

现在让我们检查结果的虚部:

>> imag(yk)

ans =

   1.0e-70 *

                   0
                   0
                   0
                   0
   0.028298997121333
   0.028298997121333
   0.028298997121333

%and so on...

注意乘数 1e-70

让我们检查yk中虚部的最大值。

>> max(imag(yk))

ans =

     1.131959884853339e-71    

这意味着虚部非常小,不需要担心。理想情况下,它可能为零,并且由于计算不精确而出现。因此,可以安全地将您的结果称为真实的。

R2017b 中存在此行为,但在转换为浮点数时虚部不同。

为什么会出现这种情况? 发生这种情况是因为当您要求不定积分时,Matlab 的 int 函数 returns 是完整的通解。此解决方案适用于实数值的整个域,包括 x>=5.

的受限域

通过一些数学运算,您可以证明 x>=5 的解决方案始终是真实的(请参阅 complex logarithm). Or you can use more symbolic math via the isAlways 函数来证明这一点:

syms x real
assume(x>=5)
y = int(sqrt(x^2-25)/x, x)
isAlways(imag(y)==0)

这个returnstrue(逻辑1)。不幸的是,当包含假设时,Matlab 的简化例程似乎无法减少此表达式。您也可以将此案例作为 service request 提交给 The MathWorks,以防他们考虑改进此方程式和类似方程式的简化。

怎么会这样"fixed"? 如果你想去掉解的零值虚部,你可以使用 sym/real:

real(y)

其中 returns 5*atan2(5, (x^2-25)^(1/2)) + (x^2-25)^(1/2).

此外,正如@SardarUsama 指出的那样,当完整的解决方案转换为浮点数(或可变精度)时,从精确的符号形式转换时有时会出现数字不精确。使用上面的符号实数形式应该避免这种情况。