Python,sympy:一组简单的涉及重复幂的方程给出了(对我来说)荒谬的答案

2024-05-19 11:30:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python和Symphy模块都是新手,所以我的一些代码可能有点“原始”。这也是我第一次使用Stackoverflow,所以请原谅任何使用错误。我包含了一个完整的测试函数,可以使用test()调用它[这是我实际工作的简化版本,但显示了我遇到的问题]。基本上我有三个方程:
(1) lamb=h/sqrt(k*T)
(2) 兰姆=d
(3) d**3=k*T/P
我希望将它们合并,并为T求解。不用Symphy软件包,用手很容易做到这一点,但是,正如我所说,我正在努力学习它。当我运行代码时,我得到的不是答案T=h**(6/5)P**(2/5)/k,而是一系列复数。如果我解的不是T,而是h,我没有问题。此外,如果我把方程(3)改为,比如说^{,我得到的结果是正确的。这个问题似乎源于这样一个事实:在试图求解这个方程时,k和T(在方程中)的幂是相同的。事实上,如果我用单个变量kT替换k*T,我会得到一个合理的解决方案

有人能解释一下我做错了什么以及我应该做什么吗

更多信息:事实上,正确的解决方案是存在的!这是第[4]个答案。但为什么我会得到其他(复数)答案(以及如何选择实数答案)

更多想法(16/-6/20 18:15):大概是因为k和T可以独立地有5个根(因为6/5幂)。那么,有没有一种方式可以说只应该考虑真正的根呢

保利

        def TEST():
            import sympy
            from sympy import symbols,Symbol,root,integrate,diff,Derivative,N,I,var,latex
            from sympy import sympify,Function,Eq,solve
            from sympy import pi,exp
    
            print("")
            print("TEST")

            #Declare other variables (avoid C,O,S,I,N,E, and Q)
            var('d h k T P lamb kT',positive=True)

            Eq1=Eq(lamb,h/(root(T,2,0)*root(k,2,0)))
            print("Eq1=",Eq1)
            Eq2=Eq(lamb,d)
            print("Eq2=",Eq2)
            Eq3=Eq(d**3,k*T/P)
            print("Eq3=",Eq3)

            res_d=solve(Eq3,d)[0]
            print("res_d=",res_d)
            Eq4=Eq2.subs(d,res_d)
            print("Eq4=",Eq4)
            res_lamb=solve(Eq4,lamb)[0]
            print("res_lamb=",res_lamb)

            Eq5=Eq1.subs(lamb,res_lamb)
            print("Eq5=",Eq5)
            res_P=solve(Eq5,P)[0]
            print("res_P=",res_P)
            Eq6=Eq(res_P,P)
            print("Eq6=",Eq6)
            print("Try solving for (this works) h=",solve(Eq6,h)[0])
            print("Try solving for (this fails miserably) T=",solve(Eq6,T)[0])
            print("and in fact, the full miserable solution is...")
            res_T=solve(Eq6,T)[0]
            print("res_T=",solve(Eq6,T))
            print("")
            print("The problem seems to be that the powers of T and k in Eq6 are the same.")
            print("If I change the Eq3 so that it's d**4 = k*T/P I get a sensible solution")
    
            print("")
            print("Now try with k*T replaced by kT throughout")
            Eq1a=Eq(lamb,h/(root(kT,2,0)))
            print("Eq1a=",Eq1a)
            Eq2a=Eq(lamb,d)
            print("Eq2a=",Eq2a)
            Eq3a=Eq(d**3,kT/P)
            print("Eq3a=",Eq3a)

            resa_d=solve(Eq3a,d)[0]
            print("resa_d=",resa_d)
            Eq4a=Eq2.subs(d,resa_d)
            print("Eq4a=",Eq4a)
            resa_lamb=solve(Eq4a,lamb)[0]
            print("res_lamb=",resa_lamb)

            Eq5a=Eq1a.subs(lamb,resa_lamb)
            print("Eq5a=",Eq5a)
            resa_P=solve(Eq5a,P)[0]
            print("res_P=",resa_P)
            Eq6a=Eq(resa_P,P)
            print("Eq6a=",Eq6a)
            print("Try solving for (this works) h=",solve(Eq6a,h)[0])
            print("Try solving for (this work!) kT=",solve(Eq6a,kT)[0])

    
            return


Tags: 答案importreseq方程printsympysolve

热门问题