一、算法的构思
一元二次方程的一般式:ax^2+bx+c = 0
我们知道,一元二次方程有解(根)的充要条件是:b^2-4ac>=0。如果不满足此关系式,那么方程无解。接着当方程有解的时候又出现了两种情况:1.有两个重根(大小相等的根)或者两个大小不等的根,为了是程序更加完善还要考虑到a =0的情况,即此时不能看做一元二次方程而只能将其看作一元一次方程,本程序运用求根公式来实现功能,有兴趣的伙计可以试试下面给出的韦达定理实现功能。
求根公式:
二、全部代码
'''
1.本程序用来解决一元二次方程在实数域上求根的问题
2.可按需求最大/最小值及对称轴,
3.可以绘制函数图像
'''
'''
.duichenzhou属性用来求解对称轴x轴坐标
.max_min属性用来求函数最大最小值
.x1/x2属性用来求解方程的两个根
######
使用方法
1.首先调用.calculate(a,b,c)用来计算
2.调用完成后即可调用相关属性
3.可选择.visual_image()方法进行可视化
'''
import matplotlib.pyplot as plt
import numpy as np
class L2_fun(object):
def __init__(self):
self.flag = True
self.duichenzhou = 0.0
self.max_min = 0.0
self.x1 = 0.0
self.x2 = 0.0
def calculate(self,a,b,c):
if a==0:
self.x1 = (-c)/b
self.x2 = self.x1
elif (b**2-4*a*c)>=0:
self.duichenzhou = (-b)/(2*a)
self.x1 = (-b+np.sqrt(b**2-4*a*c))/(2*a)
self.x2 = (-b-np.sqrt(b**2-4*a*c))/(2*a)
if a>0:
self.max_min = (4*a*c-b*b)/(4*a)
print('提示:此函数开口为上,极值获取的是最小值!\n')
if a<0:
self.max_min = (4*a*c - b*b) /(4*a)
print('提示:此函数开口为下,获取的是最大值!\n')
else:
self.flag = False
self.duichenzhou = (-b)/(2 * a)
self.max_min = (4*a*c-b*b)/(4*a)
print('此方程在实数域上无解!!!\n')
self.x1=self.x2 ='无解!'
def visual_image(self,a,b,c):
if self.flag==False:
print('此方程无解,但可可视化图像!\n')
v = int(self.duichenzhou)
x = np.linspace(v-15,v+15,2800)
y = a*(x**2)+b*x+c
plt.figure(figsize=(12,8),dpi=100)
plt.title('y = {}*(x**2)+{}*(x)+{}'.format(a,b,c),color ='r',fontsize=22)
plt.xlabel('x',loc= 'right',fontsize = 18)
plt.ylabel('y',loc='top',fontsize = 18)
plt.plot(x,y,color='c',label = 'y')
plt.grid(alpha=0.3,linestyle ='--')
plt.legend(loc = 'best')
plt.show()
if __name__ == '__main__':
a,b,c = map(float,input('请以空格分隔输入3个数字,免费进行运算!\n').split())#split默认以空格进行分隔
S = L2_fun()
S.calculate(a,b,c)
print(S.duichenzhou,S.x2)
S.visual_image(a,b,c)
三、需要用到的库(必须安装)
请安装numpy、和matplotlib库
将下面两句分别复制到cmd命令中,回车运行:
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
四、效果演示
欢迎大家点赞,批评指正,谢谢!!