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