在求解三次方程时,如何将三次多项式除以线性多项式 (Python 3)?

While solving a cubic equation, how do I divide a cubic polynomial by a linear one (Python 3)?

我正在求解 Python 中的三次方程,其中包括多项式的除法。

from sympy import symbols
# Coefficients
a = int(input("1st coef: "))
b = int(input("2nd coef: "))
c = int(input("3rd coef: "))
d = int(input("Const: "))
# Polynomial of x
def P(x):
    return a*x**3 + b*x**2 + c*x + d
x = symbols('x')
# Find 1 root by Cardano
R = (3*a*c - b**2) / (9*a**2)
Q = (3*b**3 - 9*a*b*c + 27*a**2*d) / (54*a**3)
Delta = R**3 + Q**2
y = (-Q + sqrt(Delta))**(1/3) + (-Q - sqrt(Delta))**(1/3)
x_1 = y - b/(3*a)
# Division
P(x) / (x - x_1) = p(x)
print(p(x)) # Just a placeholder

程序 returns 出现错误:“无法分配给运算符”并突出显示 # Division[=27 之后的 P(x) =] 评论(措辞不佳,是的,但我来自俄罗斯,所以是 idc)。 我尝试做的是将一个变量分配给多项式然后除法:

z = P(x)
w = x - x_1
p = z / w
print(p)

但是,唉:它只是 returns 一个普通的旧商(a = 1,b = 4,c = -9,d = -36):

(x**3 + 4*x**2 - 9*x - 36)/(x - 2.94254537742264)

这里有人知道在这种情况下该怎么做吗(更不用说 x_1 的非精确值:x^3+4x^2-9x-36=0 的根是 3 、-4 和 -3,看不到漂浮的、非理性的、凌乱的、丑陋的东西)?

tl;dr: 多项式除法混淆和非精确根

我不确定你的问题到底是什么,但这是对答案的尝试

P(x) / (x - x_1) = p(x)

由于多种原因存在问题。首先,重要的是要知道 python(以及许多其他现代编程语言)中的 = 运算符是一个赋值运算符。您似乎来自更多的数学背景,因此将其视为类似于 := 运算符的东西。这个方向总是固定的,即使用 a = b 你总是将 b 的值分配给变量 a。在您的情况下,您基本上是在为表达式分配 p 的值,这没有多大意义:

  1. Python 不能给表达式赋值(至少据我所知是这样)
  2. p(x) 尚未定义

第二个问题是您将 python 函数与数学函数混合在一起。

一个 python 函数看起来像这样:

def some_function(some_parameter)

  print("Some important Thing!: ", some_parameter)

  some_return_value = 42
  return some_return_value

它(可以)将一些变量作为输入,用它们做一些事情,然后(可以)return 做其他事情。它们通常用括号运算符 () 调用。 IE。 some_function(42) 转换为执行 some_function 并将第一个参数替换为值 42。然而,就 python 而言,sympy 中的表达式只是一个 object/variable.

所以基本上你可以写 P = a*x**3 + b*x**2 + c*x + d。您的 P(x) 函数所做的基本上是采用表达式 a*x**3 + b*x**2 + c*x + d,用 x 替换括号中的任何内容,然后将其作为 sympy 表达式返回。 (重要的是要理解,P python 函数中的 x 与您稍后定义的 x 无关!因此,人们通常会试图避免编码中的这种“虚假朋友”)

此外,sympy 中的数学函数实际上只是一个由 sympy 符号组成的表达式。就 sympy 而言,P 函数的 return 值是符号 a、b、c、d 和您放入括号中的符号的(数学)函数。这就是为什么无论何时您想要积分或微分,您都需要指定要执行的符号。

所以这条线应该看起来像这样。

p = P(x) /  (x - x_1)

或者您将 P(x) 函数替换为 P = a*x**3 + b*x**2 + c*x + d,最后得到

p = P / (x - x_1)

第三,如果你想简化表达式,你应该看看这里 (https://docs.sympy.org/latest/tutorial/simplification.html)。这里有多种简化表达式的方法,具体取决于您希望得到哪种表达式。为了使代码更快,sympy 只会在您特别要求时简化您的表达。

然而,您可能会对结果感到失望,因为行

y = (-Q + sqrt(Delta))**(1/3) + (-Q - sqrt(Delta))**(1/3)

将隐式转换为浮点数,您最终会遇到舍入问题。归咎于 (1/3) 部分,它在看到 sympy 之前将评估为 0.33333333。一种可能的解决方法是

y = (-Q + sqrt(Delta))**(sympy.Rational(1,3)) + (-Q - sqrt(Delta))**(sympy.Rational(1,3))

(您可能需要在顶部添加 import sympy

一般来说,可能值得多了解一下 python。这是一种主要试图通过烦人的技术细节来摆脱困境的语言。然而,不幸的是,这也意味着在使用像 sympy 这样的库时,事情会变得非常混乱,这些库严重依赖 类 和运算符重载等东西。多学一点 python 可能会让您更好地了解引擎盖下发生的事情,并且可能使 python 东西和特定于 sympy 的东西之间的区别变得更容易。基本上,您要确保阅读并理解此内容 (https://docs.sympy.org/latest/gotchas.html)。

如果您有任何问题或需要一些资源,请告诉我:)