【问题标题】:Cardano's Formula in Python卡尔达诺的 Python 公式
【发布时间】:2022-09-24 04:56:28
【问题描述】:

我需要有人检查我在 Python 中使用 Cardano 公式的尝试。我正在尝试求解三次方程的根,我想知道到目前为止我所做的是否正确(或错误)。 TYIA

def solve(a,b,c,d):
    Q = (3*a*c - (b**2)) / (9*(a**2))
    R = (9*a*b*c - 27*(a**2)*d - 2*(b**3)) / (54*(a**3))
    D = (Q**3) + (R**2)
    S = (R + (D**(1/2)))**(1/3)
    T = (R - (D**(1/2)))**(1/3)

    x1 = S + T - (b/(3*a))
    x2 = -((S + T)/2) - (b/(3*a)) + 0.5j * (3**(1/2)) * (S - T)
    x3 = -((S + T)/2) - (b/(3*a)) - 0.5j * (3**(1/2)) * (S - T)

    return (x1,x2,x3)
  • 只需在几个测试用例上使用它。一般来说,对于这种编程,使用测试驱动开发是一种很好的方法。
  • 那将是学习测试的好机会!
  • \"我需要有人检查\": 这不是本站的目的。这个想法是你测试你的代码,如果有问题,你把问题集中在那个上面。
  • 其他错误:您正在添加 b/(3*a) 而不是为第二个和第三个根减去它。
  • @RobertDodier:这个想法是OP在问这里之前至少做了最少的测试。测试不能替代了解您在做什么。

标签: python math cubic


【解决方案1】:

您可以将根代回方程式中,看看是否为零。

def verify(a,b,c,d,x):
    return (a*(x**3) + b*(x**2) + c*x + d)


roots = solve(a,b,c,d)

for x in roots:
    print(verify(a,b,c,d,x))

【讨论】:

  • 好点...只有 x 首先才能启用呼叫 verify( x, *roots)
  • a,b,c,d 是 coffs 而不是根。所以我们可以交替这样做
  • 当然……我的错!
【解决方案2】:

你写错了三次方程的解。一般来说,没有方程组是不可能的,所以我可以提供以下解决方案

from cmath import *

solutions = set()


def cbrt(polynomial):
    solution = set()
    root1 = polynomial ** (1 / 3)
    root2 = (polynomial ** (1 / 3)) * (-1 / 2 + (sqrt(3) * 1j) / 2)
    root3 = (polynomial ** (1 / 3)) * (-1 / 2 - (sqrt(3) * 1j) / 2)
    solution.update({root1, root2, root3})
    return solution


print('ax^3+bx^2+cx+d=0')
a, b, c, d = map(complex, input().split())

if a != 0:
    p = (3 * a * c - b ** 2) / (3 * a ** 2)
    q = (2 * b ** 3 - 9 * a * b * c + 27 * a ** 2 * d) / (27 * a ** 3)
    alpha = cbrt(-q / 2 + sqrt((q / 2) ** 2 + (p / 3) ** 3))
    beta = cbrt(-q / 2 - sqrt((q / 2) ** 2 + (p / 3) ** 3))
    for i in alpha:
        for j in beta:
            if abs((i * j) + p / 3) <= 0.00001:
                x = i + j - b / (3 * a)
                solutions.add(x)

elif b != 0:
    D = c ** 2 - 4 * b * d
    solutions.add((-c - sqrt(D)) / 2 * b)
    solutions.add((-c + sqrt(D)) / 2 * b)

elif c != 0:
    solutions.add(-d / c)

elif d == 0:
    solutions.add("True")

else:
    solutions.add("False")

print(solutions)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2015-07-30
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多