2

我有一个正在编写的程序,用户可以选择在求解二次或三次多项式的三次函数之间进行选择。选择后,程序会应用许多公式,包括:求解二次判别式、二次公式、二次多项式公式、Cardano 的三次多项式类比方法和标准三次公式(基本上,第一此页面上的四个公式)。

这是我的代码:

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.

现在它很容易返回一个总数。计算是正确的,但我仍在尝试围绕类似的公式进行思考。等式的判别部分是什么?我如何找到潜在的根,就像我使用二次公式一样?可能是一个简单的问题,但我想更好地理解这个过程。

4

1 回答 1

1

首先,您的三次函数与您链接到的网站上的方程之间存在许多差异。其中最值得注意的是:

  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之后。

  2. 即使您链接到的方程式中有两个,您也永远不会包含立方根。

  3. 你这样做x * 2 - small了,但是等式中加在一起的两项并不相同——一项是加号,另一项是减号。

但是,即使您解决了该函数的所有问题,在尝试求解许多三次方程时,您仍然会遇到数学域错误。请注意您的链接中的这一段:

但是如果我们将卡尔达诺公式应用到这个例子中,我们使用 a=1, b=0, c=-15, d=-4,我们发现我们需要在结果计算中取 -109 的平方根。最终,负数的平方根将在稍后的计算中抵消,但如果不额外讨论复数,微积分学生将无法理解该计算。

Solving cubic equations requires dealing with complex numbers (though only temporarily- as noted, they'll cancel out), so you can't use math.sqrt to solve it. You might be interested in the cmath package.

于 2012-11-11T05:28:45.817 回答