5

我在 python 中做了这个小测试程序,看看它是如何solve工作nsolve的。

from sympy import *

theta = Symbol('theta')
phi = Symbol('phi')

def F(theta,phi):
    return sin(theta)*cos(phi)+cos(phi)**2
def G(phi):
    return ((1 + sqrt(3))*sin(phi) - 4*pi*sin(2*phi)*cos(2*phi))
solution1 = solve(F(pi/2,phi),phi)
solution2 = solve(G(phi),phi)
solution3 = nsolve(G(phi),0)
solution4 = nsolve(G(phi),1)
solution5 = nsolve(G(phi),2)
solution6 = nsolve(G(phi),3)
print solution1, solution2, solution3, solution4, solution5, solution6

我得到这个输出:

[pi/2, pi] [] 0.0 -0.713274788952698 2.27148961717279 3.14159265358979

第一次调用solve给了我对应函数的两​​个解。但不是第二个。我想知道为什么?nsolve似乎可以使用初始测试值,但根据该值,它会给出不同的数值解。nsolve有没有办法在一行中获取所有带有或带有另一个函数的数值解的列表?

4

1 回答 1

6

第一次调用solve给了我对应函数的两​​个解。但不是第二个。我想知道为什么?

通常,您无法以符号方式求解方程,并且显然solve可以这样做。换句话说:如果solve能解出你的方程,就认为自己很幸运,典型的技术应用没有解析解,即无法符号解。

因此,后备选项是从初始点开始以数值方式求解方程。nsolve在一般情况下,即使存在解决方案,也不能保证会找到解决方案。

有没有办法在一行中使用 nsolve 或其他函数获取所有数值解的列表?

一般来说,没有。不过,您可以nsolve从一些初始猜测开始,并跟踪找到的解决方案。您可能希望在感兴趣的区间内均匀分布您的初始猜测。这称为多启动方法

于 2012-11-12T14:31:28.810 回答