用户:SUS丶Un查看:0 回复:0 评论:0 创建时间:2020-07-13T21:34:20
【作品展示】

【作品介绍】
史上最全求解二次函数部分功能待完善
求大佬指点
【作品源代码】
import matplotlib.pyplot as plt # 导入matplotlib用于绘图
import numpy as np # numpy库用于科学计算
from fractions import Fraction as fa # 用于显示分数
# 求解type1
def solve_type1():
# 全局变量a, b, c, 作用类似于return
global a, b, c
# 若输入存在错误,不用手动重开程序,自动循环再次获取输入
while True:
x_collect = [] # 存放搜集到的点的x坐标数据
y_collect = [] # 存放搜集到的点的y坐标数据
num = input("请输入a, b, c中已知数量(0,1,2):")
if num == '0':
'''
for i in range(1, 4):
x_collect.append(
fa(float(input("请输入第{}个点坐标的横坐标(x):".format(i)))))
y_collect.append(
fa(float(input("请输入第{}个点坐标的纵坐标(y):".format(i)))))
# y_collect[0]=a(x_collect[0]^2)+bx_collect[0]+c
# y_collect[1]=a(x_collect[1]^2)+bx_collect[1]+c
# y_collect[2]=a(x_collect[2]^2)+bx_collect[2]+c
'''
print('当前版本尚不支持,等待后续优化')
break
elif num == '1':
collect_1 = input('''请输入已知量:
e.g.:a 1 (两个量中使用空格隔开):''').split(" ")
# 输入错误处理
if collect_1[0] != 'a' and 'b' and 'c':
print("请输入符合规则的字符")
continue
# 数据采集
for i in range(1, 3):
x_collect.append(
fa(float(input("请输入第{}个点坐标的横坐标(x):".format(i)))))
y_collect.append(
fa(float(input("请输入第{}个点坐标的纵坐标(y):".format(i)))))
# 已知量为a
if collect_1[0] == 'a':
a = fa(float(collect_1[1]))
b = fa(float(y_collect[1] - y_collect[0] -
a*(x_collect[1]+x_collect[0])))
c = fa(float(y_collect[0] - a *
(x_collect[0]**2) - b*x_collect[0]))
break
# 已知量为b
elif collect_1[0] == 'b':
b = fa(float(collect_1[1]))
a = fa(float((y_collect[1]-y_collect[0]-b) /
(x_collect[1]+x_collect[0])))
c = fa(float(y_collect[0] - a *
(x_collect[0]**2) - b*x_collect[0]))
break
# 已知量为c
elif collect_1[0] == 'c':
c = fa(float(collect_1[1]))
a_temp = (x_collect[1]*(y_collect[0]-c)-x_collect[0]*(y_collect[1]-c))/(x_collect[1]*(x_collect[0]**2)-x_collect[0]*(x_collect[1]**2))
a = fa(float(a_temp))
b_temp = ((y_collect[1]-c)*(x_collect[0]**2)-(y_collect[0]-c)*(x_collect[1]**2))/(x_collect[1]*(x_collect[0]**2)-x_collect[0]*(x_collect[1]**2))
b = fa(float(b_temp))
break
# 输入错误处理
else:
print("请输入符合规则的字符")
elif num == '2':
for i in range(2):
collect_1 = input('''请输入已知量:
e.g.:a 1 (两个量中使用空格隔开):''').split(" ")
# 输入错误处理
if collect_1[i] != 'a' and 'b' and 'c':
print("请输入符合规则的字符")
continue
x_collect.append(
fa(float(input("请输入已知点坐标的横坐标(x):"))))
y_collect.append(
fa(float(input("请输入已知点坐标的纵坐标(y):"))))
if collect_1[0] == 'a' and collect_1[2] == 'b':
a = collect_1[1]
b = collect_1[3]
c = y_collect[0] - a*(x_collect[0]**2) - b*x_collect[0]
elif collect_1[0] == 'a' and collect_1[2] == 'c':
a = collect_1[1]
c = collect_1[3]
b = (y_collect[0]-a*(x_collect[0]**2)-c) / x_collect[0]
elif collect_1[0] == 'b' and collect_1[2] == 'c':
b = collect_1[1]
c = collect_1[3]
a = (y_collect[0]-b*x_collect[0]-c) / x_collect[0]**2
break
# 输入错误处理
else:
print("请输入符合规则的字符")
continue
# 求解type2
def solve_type2():
global a, k, h
while True:
k = fa(float(input("请输入顶点坐标的横坐标x(e.g.:1):")))
h = fa(float(input("请输入顶点坐标的纵坐标y(e.g.:1):")))
x = fa(float(input("请输入已知点坐标的横坐标x:")))
y = fa(float(input("请输入已知点坐标的纵坐标y:")))
# 输入错误处理
if y-h == 0 or x-k == 0:
print("请输入除顶点外的点")
else:
a = (y-h) / ((x-k)**2)
break
# 求解type3
def solve_type3():
global a, x1, x2
x1 = fa(float(input("请输入第一个交点的x坐标:")))
x2 = fa(float(input("请输入第二个交点的x坐标:")))
x = fa(float(input("请输入已知点坐标的横坐标x:")))
y = fa(float(input("请输入已知点坐标的纵坐标y:")))
a = fa(float((y)/((x-x1)*(x-x2))))
# 化简type1的解析式
def huajian_type1():
global fun
# 若a为0
if a == 0:
if b == 0:
if c == 0:
print("该函数不存在,请检查后重试")
fun = None
else:
fun = f"y={c}"
else:
if c > 0:
fun = f"y={b}x+{c}"
elif c < 0:
fun = f"y={b}x{c}"
# 若a为1
elif a == 1:
if b == 0:
if c == 0:
fun = f"y=x^2"
elif c > 0:
fun = f"y=x^2+{c}"
elif c < 0:
fun = f"y=x^2{c}"
elif b > 0:
if c == 0:
fun = f"y=x^2+{b}x"
elif c > 0:
fun = f"y=x^2+{b}x+{c}"
elif c < 0:
fun = f"y=x^2+{b}x{c}"
elif b < 0:
if c == 0:
fun = f"y=x^2{b}x"
elif c > 0:
fun = f"y=x^2{b}x+{c}"
elif c < 0:
fun = f"y=x^2{b}x{c}"
# 其他情况
else:
if b == 0:
if c == 0:
fun = f"y={a}x^2"
elif c > 0:
fun = f"y={a}x^2+{c}"
elif c < 0:
fun = f"y={a}x^2{c}"
elif b > 0:
if c == 0:
fun = f"y={a}x^2+{b}x"
elif c > 0:
fun = f"y={a}x^2+{b}x+{c}"
elif c < 0:
fun = f"y={a}x^2+{b}x{c}"
elif b < 0:
if c == 0:
fun = f"y={a}x^2{b}x"
elif c > 0:
fun = f"y={a}x^2{b}x+{c}"
elif c < 0:
fun = f"y={a}x^2{b}x{c}"
if fun != None:
print("解析式为:"+fun)
# 化简type2
def huajian_type2():
global fun
if a == 0:
if h == 0:
print("该函数不存在,请检查后重试")
fun = None
else:
fun = f'y={h}'
elif a == 1:
if h == 0:
if k == 0:
fun = f'x^2'
elif k > 0:
fun = f'y=(x-{k})^2'
elif k < 0:
fun = f'y=(x+{-k})^2'
elif h > 0:
if k == 0:
fun = f'y=x^2+{h}'
elif k > 0:
fun = f'y=(x-{k})^2+{h}'
elif k < 0:
fun = f'y=(x+{-k})^2+{h}'
elif h < 0:
if k == 0:
fun = f'y=x^2{h}'
elif k > 0:
fun = f'y=(x-{k})^2{h}'
elif k < 0:
fun = f'y=(x+{-k})^2{h}'
else:
if h == 0:
if k == 0:
fun = f'y={a}x^2'
elif k > 0:
fun = f'y={a}(x-{k})^2'
elif k < 0:
fun = f'y={a}(x+{-k})^2'
elif h > 0:
if k == 0:
fun = f'y={a}x^2+{h}'
elif k > 0:
fun = f'y={a}(x-{k})^2+{h}'
elif k < 0:
fun = f'y={a}(x+{-k})^2+{h}'
elif h < 0:
if k == 0:
fun = f'y={a}x^2{h}'
elif k > 0:
fun = f'y={a}(x-{k})^2{h}'
elif k < 0:
fun = f'y={a}(x+{-k})^2{h}'
if fun != None:
print("解析式为:"+fun)
# 化简type3
def huajian_type3():
global fun
if a == 0:
print("该函数不存在,请检查后重试")
fun = None
elif a == 1:
if x1 == 0:
if x2 == 0:
fun = f'y=x^2'
elif x2 > 0:
fun = f'y=x(x-{x2})'
elif x2 < 0:
fun = f'y=x(x+{-x2})'
elif x1 > 0:
if x2 == 0:
fun = f'y=x(x-{x1})'
elif x2 > 0:
fun = f'y=(x-{x1})(x-{x2})'
elif x2 < 0:
fun = f'y=(x-{x1})(x+{-x2})'
elif x1 < 0:
if x2 == 0:
fun = f'y=x(x+{-x1})'
elif x2 > 0:
fun = f'y=(x+{-x1})(x-{x2})'
elif x2 < 0:
fun = f'y=(x+{-x1})(x+{-x2})'
else:
if x1 == 0:
if x2 == 0:
fun = f'y={a}(x^2)'
elif x2 > 0:
fun = f'y={a}x(x-{x2})'
elif x2 < 0:
fun = f'y={a}x(x+{-x2})'
elif x1 > 0:
if x2 == 0:
fun = f'y={a}x(x-{x1})'
elif x2 > 0:
fun = f'y={a}(x-{x1})(x-{x2})'
elif x2 < 0:
fun = f'y={a}(x-{x1})(x+{-x2})'
elif x1 < 0:
if x2 == 0:
fun = f'y={a}x(x+{-x1})'
elif x2 > 0:
fun = f'y={a}(x+{-x1})(x-{x2})'
elif x2 < 0:
fun = f'y={a}(x+{-x1})(x+{-x2})'
if fun != None:
print("解析式为:"+fun)
# 绘制函数图像
def create_graph(a, b, c, d=-10, e=10): # d,e分别是x的取值范围
x = np.arange(d, e, 0.01)
y = a*(x**2)+b*x+c
plt.plot(x, y)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.title("解析式为"+fun+"的图像")
# plt.legend('best')
point_x = b / -2*a
point_y = a*(point_x**2)+b*point_x+c
plt.scatter(point_x, point_y, c='r')
plt.text(point_x + 0.5,point_y - 5,f"顶点坐标({point_x},{point_y})",
fontsize=12,color='r')
plt.show()
# 类型采集
Input = input('''请输入二次函数类型:
\t type1(一般式):y=ax^2+bx+c (请输入1)
\t type2(顶点式):y=a(x-k)^2+h (请输入2)
\t type3(交点式):y=a(x-x1)(x-x2) (请输入3):''')
while True:
if Input == '1':
solve_type1()
huajian_type1()
if fun != None:
create_graph(a, b, c)
break
elif Input == '2':
solve_type2()
huajian_type2()
# 化简得y=ax^2-2akx+k^2+h
if fun != None:
create_graph(a, -2*a*k, k**2+h)
break
elif Input == '3':
solve_type3()
huajian_type3()
# 化简得y=ax^2-a(x2+x1)x+ax1x2
if fun != None:
create_graph(a, -a*(x2+x1), a*x1*x2)
break
else:
print("请输入符合规则的字符")
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn