怎样用Python求出一个一元五次方程的数值解?

方程x^5+2x^4+3x^3-x^2-3x=1
怎样求出其五个数值解?

阅读 12.6k
2 个回答

使用sympy库进行方程计算

In [1]: from sympy import *

In [2]: x = symbols('x')

In [3]: solve(Eq(x**5+2*x**4+3*x**3-x**2-3*x-1,0),x)
Out[3]:
[CRootOf(x**5 + 2*x**4 + 3*x**3 - x**2 - 3*x - 1, 0),
 CRootOf(x**5 + 2*x**4 + 3*x**3 - x**2 - 3*x - 1, 1),
 CRootOf(x**5 + 2*x**4 + 3*x**3 - x**2 - 3*x - 1, 2),
 CRootOf(x**5 + 2*x**4 + 3*x**3 - x**2 - 3*x - 1, 3),
 CRootOf(x**5 + 2*x**4 + 3*x**3 - x**2 - 3*x - 1, 4)]

In [5]: R = solve(Eq(x**5+2*x**4+3*x**3-x**2-3*x-1,0),x)

In [6]: [N(solution) for solution in R]
Out[6]:
[0.933791433341506,
 -0.557328385553605 - 0.0683867345066456*I,
 -0.557328385553605 + 0.0683867345066456*I,
 -0.909567331117148 - 1.60288306941394*I,
 -0.909567331117148 + 1.60288306941394*I]

非线性方程数值解适合使用 scipy.optimize 的 fslove 和 root,速递比 sympy 的符号推导快很多
这道题代码可以这样写

from scipy.optimize import fsolve

def func(v):
    x, = v.tolist()
    return [
        x**5 + 2*(x**4) + 3*(x**3) - x**2 - 3*x - 1
    ]

r = fsolve(func, [1])
print(r[0])
r = fsolve(func, [-1])
print(r[0])

采用最小二乘法拟合,需要你给出试算初值。这道题来说,1 和 -1 两个初值向两个方向拟合,所以会得到两个不同的近似解,一个是 0.93379143,一个是-0.5563642。
试算初值的选定倚赖推导和经验,可以借助sympy。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏