【问题标题】:Indefinite integration with Matlab's Symbolic Toolbox - complex solution与 Matlab 的 Symbolic Toolbox 的无限集成 - 复杂的解决方案
【发布时间】:2017-12-29 05:10:33
【问题描述】:

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

【问题讨论】:

    标签: matlab symbolic-math integral


    【解决方案1】:

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

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

    通过一些数学运算,您可以证明x&gt;=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 指出的那样,当完整的解决方案转换为浮点(或可变精度)时,从精确符号形式转换时有时会出现数字不精确。使用上面的符号实数形式应该可以避免这种情况。

    【讨论】:

    • 这正是我的学生所需要的。反应真好。谢谢。
    • 试试这个:syms x real,然后尝试假设(x>=5),然后尝试假设(x)。你会看到真正的假设并不存在。现在试试这个:syms x real,然后是假设(x>=5),然后是假设(x)。你会看到这两个假设仍然存在。如果你尝试 y = int(sqrt(x^2-25)/x, x),你能告诉我你在 2017b 上得到了什么吗? atan2 符号是否仍然存在?同样,我使用的是 2014b,但我学校的学生将使用 2016b。我发现了 rewrite 命令,也许可以将 atan 表达式重写为 asec 表达式。
    • R2017b 中的结果相同。此外,根据int 的文档,在case of indefinite integrals 中,它假定集成变量是真实的。我不认为rewrite 支持重写为asecatan2 甚至完整的解决方案有什么问题?
    • @horchler 原因是我想将其转换为我的手工计算的解决方案,sqrt(x^2-25)-5*asec(x/5)+C。但感谢您提供有关 R2017b 的信息。
    【解决方案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    
    

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

    【讨论】:

    • 这是一个写得很好的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多