【问题标题】:What is the correct way to select real solutions?选择真正解决方案的正确方法是什么?
【发布时间】:2014-04-08 10:42:07
【问题描述】:

假设在求解某个方程后需要选择真正的解。

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

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.

【问题讨论】:

    标签: maple


    【解决方案1】:

    您的解决方案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)Pisqrt(2) 都是realcons 类型,因为在应用evalf 之后它们变成numeric 类型的浮点数。

    以上是关于类型的。还有一些属性需要考虑。类型是属性,但不一定反之亦然。有一个 real 属性,但没有 real 类型。 is 命令可以测试属性,虽然它通常用于在假设(在符号上)下的混合数字符号测试中,但它也可以用于像您这样的测试。

     select( is, [sol], real );
    
                                 [20307.39319]
    

    在您的示例中使用is 效率较低。如果您知道自己有一组(可能是非真实的)浮点数,那么type,numeric 应该是一个有效的测试。

    而且,只是为了搅浑水……有一个类型nonreal

    remove( type, [sol], nonreal );
    
                                 [20307.39319]
    

    【讨论】:

    • 我认为is 更好。当我尝试:r1:=Pi,-1+2*I,-1-2*I; 然后select(type,[r1],numeric); 没有选择Pi。但是select(is,[r1],real); 做到了。而且因为我基本上是在寻找一种方法来从列表或集合中挑选所有不复杂的值。所以到目前为止isreal 似乎是比使用type 更好的解决方案
    【解决方案2】:

    一种可能性是在计算发生之前限制域。

    这是 Maplesoft 网站上关于限制域的解释: 4 Basic Computation

    UPD:基本上,根据thisthat5 在 Maple 中并不被认为是复杂的,因此可能存在一些错误/错误/错误(尝试检查那里可能有什么问题)。

    例如,尝试将complex 不带引号。

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

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

    【讨论】:

    • 谢谢。但这不是我要问的。假设列表是由求解方程以外的其他东西生成的?并且仍然想选择该列表中的真实值?此外,人们可能不想限制求解器,而只是稍后过滤结果。可能也想使用其他解决方案。所以这并不能回答我的问题。不过谢谢。
    • @Nasser,考虑检查更新版本。您可能会在那里找到一些有用的信息!
    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2010-10-10
    • 1970-01-01
    • 2020-08-07
    • 2021-11-06
    • 2011-07-05
    相关资源
    最近更新 更多