在求解三次方程时,如何将三次多项式除以线性多项式 (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
的值,这没有多大意义:
- Python 不能给表达式赋值(至少据我所知是这样)
- 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)。
如果您有任何问题或需要一些资源,请告诉我:)
我正在求解 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
的值,这没有多大意义:
- Python 不能给表达式赋值(至少据我所知是这样)
- 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)。
如果您有任何问题或需要一些资源,请告诉我:)