百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Python解一元二次方程(python编程求解一元二次方程)

ztj100 2025-05-02 22:37 38 浏览 0 评论

任务要求

求一元二次方程式的根,并显示在控制台。

要求

1.数学完整性:支持实数域/复数域解集,正确处理a=0的退化情况

2.工程健壮性:验证输入数据类型,处理非数值输入及除零错误

3.结果规范:保留5位小数,输出包含方程类型说明

任务分析

数学原理

标准方程的根由判别式决定:

  • :实数根
  • :复数根

技术难点

  • 输入验证:检测非数值输入(如字符串)
  • 病态方程:当时传统公式会导致精度损失
  • 符号计算:保持等无理数的精确表达

任务实现

方法一:基础公式法(含输入验证)

import math
def solve_basic(a, b, c):
# 强制类型转换并捕获非数字输入
try:
a, b, c = float(a), float(b), float(c)
except ValueError:
return "错误:系数必须为数字"
# 处理a=0的退化情况
if a == 0:
return "退化为一元一次方程,解为:{}".format(round(-c / b, 5)) if b != 0 else "无解"
# 根据Δ计算实根或复数根,结果保留5位小
delta = b**2 - 4*a*c
if delta >= 0:
sqrt_delta = math.sqrt(delta)
root1 = (-b + sqrt_delta) / (2 * a)
root2 = (-b - sqrt_delta) / (2 * a)
return "解:{0.real:.5f}{0.imag:+.5f}j,{1.real:.5f}{1.imag:+.5f}j".format(root1, root2)
else:
real = -b / (2 * a)
imag = math.sqrt(abs(delta)) / (2 * a)
root1 = complex(real, imag)
root2 = complex(real, -imag)
return "解:{0.real:.5f}{0.imag:+.5f}j,{1.real:.5f}{1.imag:+.5f}j".format(root1, root2)
print(solve_basic(0, 2, 4)) # 退化方程解:-2.0
print(solve_basic(1, -5, 6)) # 实根:2.0,3.0
print(solve_basic(1, 2, 5)) # 输出复数根:-1.00000-2.00000j,-1.00000+2.00000j

运行结果:

退化为一元一次方程,解为:-2.0

解:2.00000+0.00000j ,3.00000+0.00000j

解:-1.00000-2.00000j ,-1.00000+2.00000j

进程已结束,退出代码为 0

方法二:复数优化算法(cmath库)

import cmath
def solve_complex(a, b, c):
if a == 0:
return "退化为一元一次方程,解为:{}".format(round(-c / b, 5)) if b != 0 else "无解"
else:
delta = cmath.sqrt(b ** 2 - 4 * a * c)
root1 = (-b - delta) / (2 * a)
root2 = (-b + delta) / (2 * a)
return "解:{0.real:.5f}{0.imag:+.5f}j ,{1.real:.5f}{1.imag:+.5f}j".format(root1, root2)
print(solve_complex(0, 2, 4)) # 退化方程解:-2.0
print(solve_complex(1, -5, 6)) # 实根:2.0,3.0
print(solve_complex(1, 2, 5)) # 输出复数根:-1.00000-2.00000j,-1.00000+2.00000j

运行结果:

退化为一元一次方程,解为:-2.0

解:2.00000+0.00000j ,3.00000+0.00000j

解:-1.00000-2.00000j ,-1.00000+2.00000j

进程已结束,退出代码为 0

说明:

  • 使用cmath.sqrt()自动处理负判别式
  • 直接返回复数对象,避免手动拼接虚部

方法三:符号计算(Sympy库)

from sympy import symbols, solve
def solve_symbolic(a, b, c):
x = symbols('x')
equation = a*x**2 + b*x + c
return "解:" + str(solve(equation, x))
print(solve_symbolic(0, 2, 4)) # 退化方程解:-2.0
print(solve_symbolic(1, -5, 6)) # 实根:2.0,3.0
print(solve_symbolic(1, 2, 5)) # 输出复数根:-1.00000-2.00000j,-1.00000+2.00000j

运行结果:

精确解:[-2]

精确解:[2, 3]

精确解:[-1 - 2*I, -1 + 2*I]

说明:

  • x = symbols('x'):使用了SymPy库中的symbols函数来定义符号变量x。符号变量是SymPy库中用于表示数学符号的主要工具,它们可以用于构建数学表达式而不需要先赋值。这里,x被定义为一个符号变量,用于表示二次方程的未知数。
  • equation = a*x**2 + b*x + c:构建了一个二次方程。a*x**2表示二次项,b*x表示一次项,c是常数项。这些系数a、b和c都是函数solve_symbolic的输入参数,用于指定二次方程的具体形式。通过这种方式,可以求解任意形式的一元二次方程。
  • solve(equation, x):调用了SymPy库中的solve函数来求解方程。solve函数的第一个参数是要求解的方程,第二个参数是要求解的符号变量。在这里,solve函数尝试找到所有满足方程的x的值。
  • solve(equation, x):solve函数返回的是一个列表,里面包含了方程的所有解,这些解可能是实数,也可能是复数。
  • 输出分数、根号等精确数学表达式,适用于需要符号推导的教学场景

方法四:数值稳定算法(工业级)

import numpy as np
def stable_solve(a, b, c):
q = -0.5 * (b + np.copysign(np.sqrt(b**2 - 4*a*c), b))
root1 = q / a
root2
= c / q
return "稳定解:{},{}".format(round(root1,5), round(root2,5))
print(stable_solve(1e-30, 1e+20, 1e-30)) # 处理大系数:-0.0,-1e+50

运行结果:

稳定解:-9.999999999999999e+49,-0.0

进程已结束,退出代码为 0

说明:适用于极端系数场景。

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: