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

时间:2017-12-29 05:10:33

标签: matlab symbolic-math integral

我正在使用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

2 个答案:

答案 0 :(得分:2)

答案不是真的复杂。

看看这个:

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    

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

答案 1 :(得分:2)

这种行为存在于R2017b中,但是当转换为浮点时,虚构的组件是不同的。

为什么会这样? 发生这种情况是因为当您要求无限积分时,Matlab的int函数会返回完整的通用解。此解决方案适用于整个实际值域,包括您的受限域x>=5

通过一些数学运算,您可以证明x>=5的解决方案始终是真实的(请参阅complex logarithm)。或者您可以通过isAlways函数使用更多符号数学来显示:

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

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

如何“修复”? 如果你想摆脱解决方案的零值虚部,你可以使用sym/real

real(y)

返回5*atan2(5, (x^2-25)^(1/2)) + (x^2-25)^(1/2)

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