代码之家  ›  专栏  ›  技术社区  ›  Mike Bailey

在数学中取正平方根

  •  6
  • Mike Bailey  · 技术社区  · 14 年前

    我目前正在做一些规范化工作,包括:

    J = Integrate[Psi[x, 0]^2, {x, 0, a}]
    sol = Solve[J == 1, A]
    A /. sol
    

    对于这种类型的归一化,负平方根是无关的。计算结果为:

    In[49]:= J = Integrate[Psi[x, 0]^2, {x, 0, a}]
    Out[49]= 2 A^2
    
    In[68]:= sol = Solve[J == 1, A]
    Out[68]= {{A -> -(1/Sqrt[2])}, {A -> 1/Sqrt[2]}}
    

    即使我尝试给它一个假设[…]或简化[…],它仍然会给出相同的结果:

    In[69]:= sol =  Assuming[A > 0, Solve[J == 1, A]]
    Out[69]= {{A -> -(1/Sqrt[2])}, {A -> 1/Sqrt[2]}}
    
    In[70]:= sol =  FullSimplify[Solve[J == 1, A], A > 0]
    Out[70]= {{A -> -(1/Sqrt[2])}, {A -> 1/Sqrt[2]}}
    

    有人能告诉我我这里做错了什么吗?

    我在Windows7 64位上运行Mathematica7。

    2 回复  |  直到 12 年前
        1
  •  4
  •   Scott Morrison    14 年前

    Solve 不是这样的。你可以试试 Reduce 相反,例如

    In[1]:= Reduce[{x^2 == 1, x > 0}, x]
    Out[1]= x == 1
    

    然后将这个输出转换为替换规则就有点困难了,至少在一般情况下是这样,因为 减少 可以使用任意多个逻辑连接。在这种情况下,我们可以黑客:

    In[2]:= Solve[Reduce[{x^2 == 1, x > 0}, x], x]
    Out[2]= {{x->1}}
    
        2
  •  5
  •   Janus    14 年前

    ToRules 按框中的说明:转换公式(如 Reduce 输出)到规则。在你的情况下:

    In[1]:= ToRules[Reduce[{x^2==1,x>0},x]]
    Out[1]= {x->1}
    
    In[2]:= {ToRules[Reduce[{x^2==1},x]]}
    Out[2]= {{x->-1},{x->1}}  
    

    对于更复杂的情况,我经常发现在插入典型参数值之后检查符号解决方案的值是很有用的。当然,这不是万无一失的,但是如果你知道有一个而且只有一个解决方案,那么这是一个简单而有效的方法:

    Solve[x^2==someparameter,x]
    Select[%,((x/.#)/.{someparameter-> 0.1})>0&]
    
    Out[3]= {{x->-Sqrt[someparameter]},{x->Sqrt[someparameter]}}
    Out[4]= {{x->Sqrt[someparameter]}}