You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复ValueError: math domain error?为何该二次方程求解代码无法计算x1?

关于你的两个Python问题解答

一、修复ValueError: math domain error错误

这个错误几乎都是因为你给math.sqrt()传入了负数导致的——毕竟在实数范围内,负数不能开平方嘛。

解决思路很直接:

  • 先计算二次方程的判别式:discriminant = b² - 4ac
  • 根据判别式的正负分情况处理:
    • 如果discriminant ≥ 0:放心用math.sqrt()计算实数根
    • 如果discriminant < 0:要么告知用户“无实数根”,要么用Python的cmath模块(支持复数运算)来计算复数根

举个复数根的实现例子:

import cmath

def solve_quadratic(a, b, c):
    discriminant = b**2 - 4*a*c
    sqrt_disc = cmath.sqrt(discriminant)
    x1 = (-b + sqrt_disc) / (2*a)
    x2 = (-b - sqrt_disc) / (2*a)
    return x1, x2

# 测试你给出的参数
print(solve_quadratic(34, 68, 510))  # 会得到复数根:(-1+3.7416573867739413j, -1-3.7416573867739413j)

二、你的二次方程求根代码为什么得不到正确结果

你的代码有两个关键问题:

1. 括号位置完全错了

正确的求根公式是:

x = [-b ± √(b²-4ac)] / (2a)

但你的代码写的是(-b+math.sqrt(b**2-4*a*c))/2*a——这相当于先把分子除以2,再乘以a,和公式完全不符!必须把2*a用括号括起来,写成/(2*a)才对。

2. 没处理判别式为负的情况

你传入的参数a=34, b=68, c=510,计算判别式是:
68² - 4*34*510 = 4624 - 69360 = -64736
这是个负数,直接用math.sqrt()必然触发math domain error,也就是你遇到的第一个错误。

如果只需要处理实数根,修正后的代码应该是这样:

import math

def solve_quadratic(a, b, c):
    discriminant = b**2 - 4*a*c
    if discriminant < 0:
        return "该方程无实数根"
    sqrt_disc = math.sqrt(discriminant)
    x1 = (-b + sqrt_disc) / (2*a)
    x2 = (-b - sqrt_disc) / (2*a)
    return x1, x2

# 测试一个有实数根的例子
print(solve_quadratic(1, -3, 2))  # 输出(2.0, 1.0),正确!

内容的提问来源于stack exchange,提问作者Adam Safi

火山引擎 最新活动