| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- #出现问题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 <tool_name>")
- 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()
|