【问题标题】:python solve Cubic equation without using sympypython在不使用sympy的情况下求解三次方程
【发布时间】:2021-12-01 17:39:19
【问题描述】:

不使用 sympy 可以解三次方程吗?

例子:

import sympy as sp
xp = 30
num = xp + 4.44
sp.var('x, a, b, c, d')
Sol3 = sp.solve(0.0509 * x ** 3 + 0.0192 * x ** 2 + 3.68 * x - num, x)

结果是:

[6.07118098358257, -3.2241955998463 - 10.0524891203436*I, -3.2241955998463 + 10.0524891203436*I]

但我想找到一种方法来使用 numpy 或根本不使用 3 部分库

我用 numpy 试过了:

import numpy as np
coeff = [0.0509, 0.0192, 3.68, --4.44]
print(np.roots(coeff))

但结果是:

[ 0.40668245+8.54994773j  0.40668245-8.54994773j -1.19057511+0.j]

【问题讨论】:

  • 你有一个错字:np.roots([0.0509, 0.0192, 3.68, -34.44]) 的结果与sympy 的结果相同

标签: python numpy math sympy


【解决方案1】:

在您的 numpy 方法中,您在最终系数方面犯了两个小错误。

SymPy 示例中,您的最后一个系数是- num,根据您的代码,这是:-num = - (xp + 4.44) = -(30 + 4.44) = -34.44

在您的NumPy 示例中,最后一个系数是--4.44,它是4.44,不等于-34.33

如果您编辑NumPy 代码,您将获得:

import numpy as np
coeff = [0.0509, 0.0192, 3.68, -34.44]
print(np.roots(coeff))
[-3.2241956 +10.05248912j -3.2241956 -10.05248912j
  6.07118098 +0.j        ]

因此答案是相同的(注意NumPy 使用j 表示复数。SymPy 使用I

【讨论】:

  • tnx,但 numpy 的结果没有像这样拆分:[6.07118098358257, -3.2241955998463 - 10.0524891203436*I, -3.2241955998463 + 10.0524891203436*I]
  • 有没有办法拆分它或只显示不带 j 的常规数字?
  • @rambler 您可以获取每个根的实部和虚部(我不知道这些函数在 numpy 中的名称是什么),然后以更有意义的方式打印它们你的目的。
  • 嗨漫步者,是的,你可以做到这一点。您可以通过以下方式提取复数的实部和虚部:numpy.org/doc/stable/reference/generated/numpy.imag.htmlnumpy.org/doc/stable/reference/generated/numpy.real.html
  • 谢谢!!!!!!!
【解决方案2】:

你可以实现cubic formula

这个来自mathologer 的 Youtube 视频可以帮助理解它。

基于此,ax^3 + bx^2 + cx + d = 0 的三次函数可以写成这样:

def cubic(a,b,c,d):
    n = -b**3/27/a**3 + b*c/6/a**2 - d/2/a
    s = (n**2 + (c/3/a - b**2/9/a**2)**3)**0.5
    r0 = (n-s)**(1/3)+(n+s)**(1/3) - b/3/a
    r1 = (n+s)**(1/3)+(n+s)**(1/3) - b/3/a
    r2 = (n-s)**(1/3)+(n-s)**(1/3) - b/3/a
    return (r0,r1,r2)

公式的简化版只需要获取c和d作为参数(又名p和q),可以这样实现:

def cubic(p,q):
    n = -q/2
    s = (q*q/4+p**3/27)**0.5
    r0 = (n-s)**(1/3)+(n+s)**(1/3)
    r1 = (n+s)**(1/3)+(n+s)**(1/3)
    r2 = (n-s)**(1/3)+(n-s)**(1/3)
    return (r0,r1,r2)

print(cubic(-15,-126))
(5.999999999999999, 9.999999999999998, 2.0)

我会让你混合复数运算以正确获得所有 3 个根

【讨论】:

  • 我认为这些平方根所包含的任何保证都是非负的。
  • @mathfux 为什么他们需要非负数?这两个三次根是共轭的,无论如何,公式都会给出一个(真实的)根。也就是说,我认为这不能回答 OP 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多