选择真实解决方案的正确方法是什么?

时间:2014-03-06 02:21:38

标签: maple

假设在求解某个方程后需要选择实数解。

这是正确和最佳的方式吗,还是有更好的方法?

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.

2 个答案:

答案 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)执行类似,以避免为每个单独的测试进行额外的函数调用。

类型numericcomplex(numeric)涵盖实数和复数整数,有理数和浮点数。

realconscomplex(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:基本上,根据thisthat5在Maple中不算复杂,因此可能存在一些错误/错误/错误(尝试检查可能出错的地方)有)。

例如,尝试将complex放在没有引号的位置。

根据this,你的方式似乎很合乎逻辑。

UPD2:根据Maplesoft网站,所有的类型检查都是用type()函数完成的,所以没有isreal()函数。