#出现问题conda activate base import sys #等差乘等比——错位相减法 def cuoWeiXiangJian(): from fractions import Fraction print("错位相减法求前n项和,若通项为a_n=(a*n+b)*q^(n+m),请填写") a=Fraction(input("a=")) b=Fraction(input("b=")) q=Fraction(input("q=")) m=int(input("m=")) #将指数统一为n-1 a=a*pow(q,(m+1)) b=b*pow(q,(m+1)) #计算A,B A=a/(q-1) B=(b-A)/(q-1) print("结果为S_n=(An+B)*q^n-B") print("A=",A, "B=",B) #二项分布 def binomial(): from fractions import Fraction from math import comb n=int(input("n=")) p=Fraction(input("p=")) print("EX=",n*p) print("DX=",n*p*(1-p)) for i in range(n+1): print("P(X=",i,")=",comb(n,i)*pow(p,i)*pow(1-p,n-i)) #超几何分布 def hypergeometric(): from fractions import Fraction from math import comb N=int(input("总数N=")) #总数 M=int(input("满足条件数M=")) #次品数 n=int(input("抽取数n=")) #抽取数 m=max(0,n-N+M) r=min(n,M) print("EX=",Fraction(n*M,N)) print("DX=",Fraction(n*M*(N-M)*(N-n),N*N*(N-1))) for k in range(m,r+1): print("P(X=",k,")=",Fraction(comb(M,k)*comb(N-M,n-k),comb(N,n))) #卡方计算 def k2(): from fractions import Fraction print("请输入核心2✖️2单元的abcd") a=int(input("a=")) b=int(input("b=")) c=int(input("c=")) d=int(input("d=")) n=a+b+c+d K2=Fraction(n*((a*d-b*c)**2),(a+b)*(c+d)*(a+c)*(b+d)) print("K^2=",K2) print("近似值为",float(K2)) #一元线性回归模型 def regression(): from math import sqrt x = input("请输入x(用空格分割):").split() x = list(map(float,x)) y = input("请输入y(用空格分割):").split() y = list(map(float,y)) sx=0 sy=0 sx2=0 sy2=0 sxy=0 if len(x)==len(y): n = len(x) for i in range(n): sx += x[i] sy += y[i] sx2 += x[i]**2 sy2 += y[i]**2 sxy += x[i]*y[i] xBar = sx/n yBar = sy/n sigmaX = sx2 - n*xBar*xBar sigmaY = sy2 - n*yBar*yBar sigmaXY = sxy - n*xBar*yBar r = sigmaXY/sqrt(sigmaX*sigmaY) b = sigmaXY/sigmaX a = yBar-b*xBar se2=0 for i in range(n): se2 += (y[i]-b*x[i]-a)**2 R2 = 1 - se2/sigmaY print("x_bar=",xBar) print("y_bar=",yBar) print("sigma (x-x)^2 =",sigmaX) print("sigma (y-y)^2 =",sigmaY) print("sigma (x-x)(y-y) =",sigmaXY) print("相关系数r=",r) print("b=",b) print("a=",a) print("残差平方和为",se2) print("决定系数R^2=",R2) else: print("x,y长度不一致") #混合方差 def mixS2(): from fractions import Fraction x = input("请输入各层样本量(用空格分割):").split() x = list(map(Fraction,x)) y = input("请输入各层对应的均值(用空格分割):").split() y = list(map(Fraction,y)) z = input("请输入各层对应的方差(用空格分割):").split() z = list(map(Fraction,z)) if ((len(x)==len(y))&(len(x)==len(z))): m = 0 j = 0 f = 0 for i in range(len(x)): m += x[i] j += x[i]*y[i] j = j/m for i in range(len(x)): f += x[i]*(z[i]+(y[i]-j)**2)/m print("总均值为",j) print("总方差为",f) else: print("输入有误!") #直方图 def histogram(): from fractions import Fraction from math import floor a = Fraction(input("请输入直方图左端点:")) d = Fraction(input("请输入直方图组距:")) f = input("请输入各组频率(用空格分割):").split() f = list(map(Fraction,f)) p = input("请输入需求解的百分位数,无需求解请留空:") x = d/2 s = 0 n = len(f) sump = 0 for pi in f: sump += pi if sump == 1: for i in range(n): x += (a+i*d)*f[i] for i in range(n): s += (a+i*d+d/2-x)**2*f[i] print("均值:",Fraction(x),",近似值:",float(x)) print("方差:",Fraction(s),",近似值:",float(s)) m = 0 if p!="": p = Fraction(p) for i in range(n): if m >= p: q = Fraction(a+i*d-(m-p)/f[i-1]*d) print(p,"百分位数为",floor(q),"+",q-floor(q)) break else: m += f[i] m = 0 for i in range(n): if m >= 0.5: q = Fraction(a+i*d-(m-0.5)/f[i-1]*d) print("中位数为",floor(q),"+",q-floor(q)) break else: m += f[i] else: print("频率之和不为1") #二阶行列式 def det2(a,b,c,d): return a*d-b*c #二元一次方程组 def tle(a1,b1,c1,a2,b2,c2): return((det2(c1,b1,c2,b2)/det2(a1,b1,a2,b2),det2(a1,c1,a2,c2)/det2(a1,b1,a2,b2))) #点关于直线对称 def dot_line(): from fractions import Fraction a=Fraction(input("请输入点的横坐标:")) b=Fraction(input("请输入点的纵坐标:")) A=Fraction(input("请输入直线一般方程x的系数:")) B=Fraction(input("请输入直线一般方程y的系数:")) C=Fraction(input("请输入直线一般方程的常数项:")) m,n = tle(A,B,(-1)*(A*a+B*b+2*C),B,-A,a*B-A*b) print("对称点为:(",m,",",n,")") #直线关于点对称 def line_dot(): from fractions import Fraction A=Fraction(input("请输入直线一般方程x的系数:")) B=Fraction(input("请输入直线一般方程y的系数:")) C=Fraction(input("请输入直线一般方程的常数项:")) a=Fraction(input("请输入点的横坐标:")) b=Fraction(input("请输入点的纵坐标:")) m=-2*A*a-2*B*b-C print("对称直线三个系数分别为:",A,B,m) #直线关于直线对称 def line_line(): from fractions import Fraction P=Fraction(input("请输入直线一般方程x的系数:")) Q=Fraction(input("请输入直线一般方程y的系数:")) R=Fraction(input("请输入直线一般方程的常数项:")) A=Fraction(input("请输入对称轴一般方程x的系数:")) B=Fraction(input("请输入对称轴一般方程y的系数:")) C=Fraction(input("请输入对称轴一般方程的常数项:")) k=2*(P*A+Q*B)/(A*A+B*B) print("对称直线三个系数分别为:",P-A*k,Q-B*k,R-C*k) #三个点求圆的方程 def circle(): from fractions import Fraction x1=Fraction(input("请输入第一个点的横坐标:")) y1=Fraction(input("请输入第一个点的纵坐标:")) x2=Fraction(input("请输入第二个点的横坐标:")) y2=Fraction(input("请输入第二个点的纵坐标:")) x3=Fraction(input("请输入第三个点的横坐标:")) y3=Fraction(input("请输入第三个点的纵坐标:")) z1=x1*x1+y1*y1 z2=x2*x2+y2*y2 z3=x3*x3+y3*y3 D,E = tle(x1-x2,y1-y2,z2-z1,x1-x3,y1-y3,z3-z1) F = -z1-D*x1-E*y1 r2 = D*D+E*E-4*F print("D=",D,"E=",E,"F=",F) print("圆心:(",-D/2,",",-E/2,")"," 半径的平方:",r2) def main(): if len(sys.argv) < 2: print("Usage: python mathCheat.py ") sys.exit(1) tool_name = sys.argv[1] if tool_name in toolbox: try: toolbox[tool_name]() except: print("某些地方出错了!") else: print("工具名无效!") sys.exit(1) if __name__ == "__main__": toolbox = {"错位相减":cuoWeiXiangJian,"错位相减法":cuoWeiXiangJian, "等差乘等比":cuoWeiXiangJian, "二项分布":binomial,"超几何分布":hypergeometric,"K2":k2,"卡方":k2,"独立性检验":k2, "回归分析":regression,"相关系数":regression,"最小二乘法":regression,"决定系数":regression,"残差平方和":regression,"线性回归":regression, "混合方差":mixS2,"混合均值":mixS2,"直方图":histogram, "点关于线对称":dot_line, "点关于直线对称":dot_line, "直线关于点对称":line_dot, "线关于点对称":line_dot, "直线关于直线对称":line_line, "线关于线对称":line_line, "三个点求圆的方程":circle,"已知三点求圆的方程":circle,"求圆的方程":circle, } main()