与 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 指出的那样,当完整的解决方案转换为浮点数(或可变精度)时,从精确的符号形式转换时有时会出现数字不精确。使用上面的符号实数形式应该避免这种情况。
我正在使用 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 指出的那样,当完整的解决方案转换为浮点数(或可变精度)时,从精确的符号形式转换时有时会出现数字不精确。使用上面的符号实数形式应该避免这种情况。