我有一个我正在编写的程序,用户可以选择在求解二次或三次多项式的三次函数之间进行选择。一旦选择,该程序应用了许多公式,包括:求解二次判别式,二次型,二次多项式的公式,Cardano的三次多项式的类比方法,以及标准立方公式(基本上,第一次)关于这个page)的四个公式。
这是我的代码:
import math
def deg3():
print("This is a third degree polynomial calculator.")
print("Please enter four numbers.")
a = int(input())
b = int(input())
c = int(input())
d = int(input())
# Apply Cardano's compressed method to find x root, broken up into different variables.
p = (-1 * b)/(3 * a)
q = p ** 3 + (b * c - (3 * a * d))/ (6 * (a ** 2))
r = c / (3 * a)
x = (q + (q**2 + (r - p**2)**3) **1/2) **1/3 + (q + (q**2 + (r - p**2)**3) **1/2) **1/3 + p
print("The root is:", x)
# Applies final cubic formula, and returns.
total = (a * x**3) + (b * x**2) + (c * x) + d
total = round(total, 3)
return total
# If discr > 0, then the equation has three distinct real roots.
# If discr = 0, then the equation has a multiple root and all its roots are real.
# If discr < 0, then the equation has one real root and
# two nonreal complex conjugate roots.
现在它很容易返回总数。计算是正确的,但我仍然试图围绕类似的公式包围我的大脑。等式的判别部分是什么?我如何找到潜在的根,就像我使用二次公式一样?可能是一个简单的问题,但我想更好地理解这个过程。
答案 0 :(得分:1)
首先,您的三次函数与您链接到的网站上的等式之间存在许多差异。其中最引人注目的是:
您的操作顺序已关闭:如下所示:
big = (-1 *( b**3 / 27 * a**3) + (b * c / 6 * a**2) - (d / 2 * a))
应该是:
big = (-1 *( b**3 / (27 * a**3)) + (b * c / (6 * a**2)) - (d / (2 * a)))
否则,像27 * a**3
这样的术语不会在分母中结束 - 它将在分母中被视为27,之后将被视为a**3
。
您永远不会包含多维数据集根,即使您链接到的等式中有两个。
你做x * 2 - small
,但在等式中加在一起的两个项目并不相同 - 一个有加号,另一个有减号。
但是,即使您修复了函数的所有问题,在尝试求解多个立方方程时仍会出现数学域错误。请注意您的链接中的这一段:
但是如果我们将Cardano的公式应用于这个例子,我们使用a = 1,b = 0,c = -15,d = -4,我们发现我们需要在结果中取-109的平方根计算。最终,负数的平方根将在计算的后期抵消,但是如果没有额外的复数讨论,微积分学生就无法理解该计算。
求解三次方程式需要处理复数(尽管只是暂时 - 如上所述,它们会被取消),所以你不能用math.sqrt
来解决它。您可能对cmath包感兴趣。