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

2024-10-03 11:12:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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

该程序返回一个错误:“无法分配给操作员”,并在#Division注释后突出显示p(x)(措辞不好,是的,但我来自俄罗斯)。 我试着给多项式分配一个变量,然后除以:

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

但遗憾的是:它只返回一个普通的旧商(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:多项式除法混淆和非精确根


Tags: fromimportinputsqrtintdivisiondelta方程
1条回答
网友
1楼 · 发布于 2024-10-03 11:12:24

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

线路

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

这个问题有多种原因。首先,重要的是要知道python(以及许多其他现代编程语言)中的=运算符是赋值运算符。你似乎来自更多的数学背景,所以认为它有点像^ {< CD2> }运算符。这个方向总是固定的,即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

它可以把一些变量作为输入,用它们做一系列的事情,然后返回其他的东西。它们通常用括号运算符()调用。即some_function(42)转换为执行some_function,并用值42替换第一个参数。然而,就python而言,Symphy中的表达式只是一个对象/变量

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

此外,symphy中的数学函数实际上只是由symphy符号形成的表达式。就sympy而言,P函数的返回值是符号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之类的库时,事情可能会变得非常混乱,而sympy严重依赖于类和运算符重载之类的东西。多学一点python可能会让您更好地了解引擎盖下正在发生的事情,并且可能会更容易区分python内容和特定于Symphy的内容。基本上,您希望确保阅读并理解此(https://docs.sympy.org/latest/gotchas.html

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

相关问题 更多 >