1 回答
TA贡献1831条经验 获得超9个赞
SymPy 打算成为一个符号包,而不是数字,所以结果应该是预期的。但是,有一个函数nsolve可以用来找到数值解。在 SymPy/mpmath 中,没有专门的方法(我知道)可以计算多项式的所有根——在这种情况下,是一对二次方。您将必须一一找到根:
>>> list(nsolve((eq1, eq2), (k,b), (1, 1)))
[1.07269682322063, -27.3048937553762]
但是可以使用现有工具为此类方程构建求解器。以下是一个示例(在极端情况下可能会出现大量数值问题):
def n2solve(eq1, eq2, x, y, n):
"""Return numerical solutions for 2 equations in
x and y where each is polynomial of order 2 or less
as would be true for equations describing geometrical
objects.
Examples
========
>>> n2solve(x**2 + y, y**2 - 3*x*y + 4, x, y, 3)
(-2.82, -7.96)
(-1.34, -1.80)
"""
from sympy.core.containers import Tuple
from sympy.solvers.solvers import unrad, solve
eqs = Tuple(eq1, eq2)
sym = set([x, y])
assert all(i.free_symbols == sym for i in eqs)
anx = solve(eq1, x)[0]
yeq = eq2.subs(x, anx)
z = unrad(yeq)
z = z[0] if z else yeq
yy = real_roots(z)
def norm(x,y):
return abs((x**2+y**2).n(2))
got=[]
for yi in yy:
yi = yi.n(n)
ty = eqs.subs(y, yi)
for xi in real_roots(ty[0]):
xi = xi.n(n)
got.append((norm(*ty.subs(x, xi)), xi, yi))
return sorted([(x,y) for e,x,y in sorted(got)[:len(got)//2]])
这为问题中提出的方程提供了以下解决方案:
[(1.07, -27.3),
(1.79, -76.9),
(2.34, -19.2),
(5.21, -106.)]
添加回答
举报