Python 求解二次和三次多项式的三次函数?

Python 求解二次和三次多项式的三次函数?,python,math,python-3.x,polynomial-math,Python,Math,Python 3.x,Polynomial Math,我有一个我正在写的程序,在这个程序中,用户可以选择求解二次多项式或三次多项式的三次函数。一旦选择,程序将应用许多公式,包括:求解二次判别式、二次公式、二次多项式公式、Cardano的三次多项式类比方法和标准三次公式(基本上是关于这一点的前四个公式) 这是我的密码: import math def deg3(): print("This is a third degree polynomial calculator.") print("Please enter four numb

我有一个我正在写的程序,在这个程序中,用户可以选择求解二次多项式或三次多项式的三次函数。一旦选择,程序将应用许多公式,包括:求解二次判别式、二次公式、二次多项式公式、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.
导入数学
def deg3():
打印(“这是一个三次多项式计算器。”)
打印(“请输入四个数字”)
a=int(输入())
b=int(输入())
c=int(输入())
d=int(输入())
#应用Cardano的压缩方法找到x根,分解成不同的变量。
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
打印(“根为:”,x)
#应用最终立方公式,然后返回。
总计=(a*x**3)+(b*x**2)+(c*x)+d
总计=四舍五入(总计,3)
返回总数
#如果discr>0,则方程有三个不同的实根。
#如果discr=0,则方程有一个重根,且其所有根均为实。
#如果discr<0,则方程有一个实根和
#两个非实复共轭根。
现在它很容易返回一个总数。这个计算是正确的,但我仍在试图用类似的公式来表达我的想法。方程的判别部分是什么?我如何找到潜在的根,就像我用二次公式做的那样?这可能是一个不需要动脑筋的问题,但我想更好地理解这个过程。

首先,你的三次函数和你链接到的网站上的方程式之间有很多不同之处。其中最值得注意的是:

  • 您的操作顺序已关闭:一行,如:

    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
    来求解它。您可能对该软件包感兴趣。

    问题是什么?恐怕一点也不清楚。为了清楚起见,编辑了一下。很抱歉。@user1739537:在解释您的问题时,这个问题中的代码可以简单得多-您只需要
    cubic
    函数(其他函数都没有)和一行调用它(如
    cubic(1,2,3,4)
    )。将示例最小化将更快地得到答案。计算解决方案的方式可能导致灾难性的取消。谢谢你,大卫!这很有帮助。幸运的是,我只需要涉及实数的案例,但无论如何,我会看看cmath软件包。如果我有任何问题,我会发布我的更新代码。再次感谢。我使用了一个压缩的三次方程,即卡达诺方法。编辑了我的问题以便进一步调查。顺便问一下,你说的加号和减号都有是什么意思?我看不出来。如果使用卡达诺公式,什么数字将决定根的数量(仅限实数)?老实说,我对它的工作原理感到困惑。@user1739537:请注意该页中每个多维数据集中的第一个括号(在
    d/(2a)
    )之后-其中一个是加号,另一个是减号。重要的是,即使你只想得到实数的答案,你也必须使用复数!试着用这个方程来求解上面例子中给出的a=1,b=0,c=-15,d=-4的立方。它有一个真正的解决方案,但如果不简单地使用复数,你就无法得到它。啊!解决了的。谢谢你,大卫。