假设在求解某个方程后需要选择实数解。
这是正确和最佳的方式吗,还是有更好的方法?
restart;
mu := 3.986*10^5; T:= 8*60*60:
eq := T = 2*Pi*sqrt(a^3/mu):
sol := solve(eq,a);
select(x->type(x,'realcons'),[sol]);
我找不到real
作为类型。所以我使用了realcons
。起初我这样做了:
select(x->not(type(x,'complex')),[sol]);
哪个不起作用,因为在Maple中5
被视为complex
!所以最终没有解决方案。
type(5,'complex');
(* true *)
我也找不到isreal()
类型的功能。 (除非我错过了一个)
是否有更好的方法可以使用?
更新 要回答下面的评论,关于5不应该是复杂的枫。
restart;
type(5,complex);
true
type(5,'complex');
true
interface(version);
Standard Worksheet Interface, Maple 18.00, Windows 7, February
来自帮助
The type(x, complex) function returns true if x is an expression of the form
a + I b, where a (if present) and b (if present) are finite and of type realcons.
答案 0 :(得分:2)
您的解决方案sol
的类型均为complex(numeric)
。您只能使用type,numeric
选择真实的,即
restart;
mu := 3.986*10^5: T:= 8*60*60:
eq := T = 2*Pi*sqrt(a^3/mu):
sol := solve(eq,a);
20307.39319, -10153.69659 + 17586.71839 I, -10153.69659 - 17586.71839 I
select( type, [sol], numeric );
[20307.39319]
通过使用select
命令的多参数调用形式,我们可以避免使用自定义运算符作为第一个参数。你不会注意到你的小例子,但这样做应该更有效率。其他命令(如map
)执行类似,以避免为每个单独的测试进行额外的函数调用。
类型numeric
和complex(numeric)
涵盖实数和复数整数,有理数和浮点数。
realcons
和complex(realcons)
类型包括之前的版本,但也允许在测试期间完成evalf
的应用。因此,Int(sin(x),x=1..3)
和Pi
以及sqrt(2)
都属于realcons
类型,因为在应用evalf
后,它们会成为numeric
类型的浮点数。
以上是关于类型的。还有一些属性需要考虑。类型是属性,但不一定相反。有一个real
属性,但没有real
类型。 is
命令可以测试属性,虽然它通常用于假设下的混合数字符号测试(在符号上),但它也可以用在像你这样的测试中。
select( is, [sol], real );
[20307.39319]
在您的示例中使用is
效率较低。如果你知道你有一组(可能是非真实的)花车,那么type,numeric
应该是一个有效的测试。
而且,只是为了浑水......有一种类型nonreal
。
remove( type, [sol], nonreal );
[20307.39319]
答案 1 :(得分:0)
一种可能性是在计算发生之前限制域。
以下是关于限制域名的Maplesoft网站的解释: 4 Basic Computation
UPD:基本上,根据this和that,5
在Maple中不算复杂,因此可能存在一些错误/错误/错误(尝试检查可能出错的地方)有)。
例如,尝试将complex
放在没有引号的位置。
根据this,你的方式似乎很合乎逻辑。
UPD2:根据Maplesoft网站,所有的类型检查都是用type()函数完成的,所以没有isreal()函数。