我有一个正在编写的程序,用户可以选择在求解二阶或三次多项式的三次函数之间进行选择。选择后,程序将应用许多公式,包括:求解二阶判别式,二次方程式,二阶多项式的公式,卡尔达诺三阶多项式的类似方法以及标准三次方程式(基本上是第一阶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.


现在,它很容易返回总计。该计算是正确的,但我仍在尝试将类似公式包裹在脑海中。等式的判别式是什么?与二次公式一样,如何找到潜在的根?也许这很容易理解,但是我想更好地理解这一过程。

最佳答案

首先,三次函数和链接到的站点上的方程之间有很多区别。其中最著名的:


您的操作顺序已关闭:类似以下行:

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,但是等式中加在一起的两个项并不相同-一个带有加号,而另一个带有减号。


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


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


求解三次方程式需要处理复数(尽管只是暂时的-如前所述,它们会被抵消),所以您不能使用math.sqrt来求解。您可能对cmath软件包感兴趣。

09-07 04:57