mathCheat.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #出现问题conda activate base
  2. import sys
  3. #等差乘等比——错位相减法
  4. def cuoWeiXiangJian():
  5. from fractions import Fraction
  6. print("错位相减法求前n项和,若通项为a_n=(a*n+b)*q^(n+m),请填写")
  7. a=Fraction(input("a="))
  8. b=Fraction(input("b="))
  9. q=Fraction(input("q="))
  10. m=int(input("m="))
  11. #将指数统一为n-1
  12. a=a*pow(q,(m+1))
  13. b=b*pow(q,(m+1))
  14. #计算A,B
  15. A=a/(q-1)
  16. B=(b-A)/(q-1)
  17. print("结果为S_n=(An+B)*q^n-B")
  18. print("A=",A, "B=",B)
  19. #二项分布
  20. def binomial():
  21. from fractions import Fraction
  22. from math import comb
  23. n=int(input("n="))
  24. p=Fraction(input("p="))
  25. print("EX=",n*p)
  26. print("DX=",n*p*(1-p))
  27. for i in range(n+1):
  28. print("P(X=",i,")=",comb(n,i)*pow(p,i)*pow(1-p,n-i))
  29. #超几何分布
  30. def hypergeometric():
  31. from fractions import Fraction
  32. from math import comb
  33. N=int(input("总数N=")) #总数
  34. M=int(input("满足条件数M=")) #次品数
  35. n=int(input("抽取数n=")) #抽取数
  36. m=max(0,n-N+M)
  37. r=min(n,M)
  38. print("EX=",Fraction(n*M,N))
  39. print("DX=",Fraction(n*M*(N-M)*(N-n),N*N*(N-1)))
  40. for k in range(m,r+1):
  41. print("P(X=",k,")=",Fraction(comb(M,k)*comb(N-M,n-k),comb(N,n)))
  42. #卡方计算
  43. def k2():
  44. from fractions import Fraction
  45. print("请输入核心2✖️2单元的abcd")
  46. a=int(input("a="))
  47. b=int(input("b="))
  48. c=int(input("c="))
  49. d=int(input("d="))
  50. n=a+b+c+d
  51. K2=Fraction(n*((a*d-b*c)**2),(a+b)*(c+d)*(a+c)*(b+d))
  52. print("K^2=",K2)
  53. print("近似值为",float(K2))
  54. #一元线性回归模型
  55. def regression():
  56. from math import sqrt
  57. x = input("请输入x(用空格分割):").split()
  58. x = list(map(float,x))
  59. y = input("请输入y(用空格分割):").split()
  60. y = list(map(float,y))
  61. sx=0
  62. sy=0
  63. sx2=0
  64. sy2=0
  65. sxy=0
  66. if len(x)==len(y):
  67. n = len(x)
  68. for i in range(n):
  69. sx += x[i]
  70. sy += y[i]
  71. sx2 += x[i]**2
  72. sy2 += y[i]**2
  73. sxy += x[i]*y[i]
  74. xBar = sx/n
  75. yBar = sy/n
  76. sigmaX = sx2 - n*xBar*xBar
  77. sigmaY = sy2 - n*yBar*yBar
  78. sigmaXY = sxy - n*xBar*yBar
  79. r = sigmaXY/sqrt(sigmaX*sigmaY)
  80. b = sigmaXY/sigmaX
  81. a = yBar-b*xBar
  82. se2=0
  83. for i in range(n):
  84. se2 += (y[i]-b*x[i]-a)**2
  85. R2 = 1 - se2/sigmaY
  86. print("x_bar=",xBar)
  87. print("y_bar=",yBar)
  88. print("sigma (x-x)^2 =",sigmaX)
  89. print("sigma (y-y)^2 =",sigmaY)
  90. print("sigma (x-x)(y-y) =",sigmaXY)
  91. print("相关系数r=",r)
  92. print("b=",b)
  93. print("a=",a)
  94. print("残差平方和为",se2)
  95. print("决定系数R^2=",R2)
  96. else:
  97. print("x,y长度不一致")
  98. #混合方差
  99. def mixS2():
  100. from fractions import Fraction
  101. x = input("请输入各层样本量(用空格分割):").split()
  102. x = list(map(Fraction,x))
  103. y = input("请输入各层对应的均值(用空格分割):").split()
  104. y = list(map(Fraction,y))
  105. z = input("请输入各层对应的方差(用空格分割):").split()
  106. z = list(map(Fraction,z))
  107. if ((len(x)==len(y))&(len(x)==len(z))):
  108. m = 0
  109. j = 0
  110. f = 0
  111. for i in range(len(x)):
  112. m += x[i]
  113. j += x[i]*y[i]
  114. j = j/m
  115. for i in range(len(x)):
  116. f += x[i]*(z[i]+(y[i]-j)**2)/m
  117. print("总均值为",j)
  118. print("总方差为",f)
  119. else:
  120. print("输入有误!")
  121. #直方图
  122. def histogram():
  123. from fractions import Fraction
  124. from math import floor
  125. a = Fraction(input("请输入直方图左端点:"))
  126. d = Fraction(input("请输入直方图组距:"))
  127. f = input("请输入各组频率(用空格分割):").split()
  128. f = list(map(Fraction,f))
  129. p = input("请输入需求解的百分位数,无需求解请留空:")
  130. x = d/2
  131. s = 0
  132. n = len(f)
  133. sump = 0
  134. for pi in f:
  135. sump += pi
  136. if sump == 1:
  137. for i in range(n):
  138. x += (a+i*d)*f[i]
  139. for i in range(n):
  140. s += (a+i*d+d/2-x)**2*f[i]
  141. print("均值:",Fraction(x),",近似值:",float(x))
  142. print("方差:",Fraction(s),",近似值:",float(s))
  143. m = 0
  144. if p!="":
  145. p = Fraction(p)
  146. for i in range(n):
  147. if m >= p:
  148. q = Fraction(a+i*d-(m-p)/f[i-1]*d)
  149. print(p,"百分位数为",floor(q),"+",q-floor(q))
  150. break
  151. else:
  152. m += f[i]
  153. m = 0
  154. for i in range(n):
  155. if m >= 0.5:
  156. q = Fraction(a+i*d-(m-0.5)/f[i-1]*d)
  157. print("中位数为",floor(q),"+",q-floor(q))
  158. break
  159. else:
  160. m += f[i]
  161. else:
  162. print("频率之和不为1")
  163. #二阶行列式
  164. def det2(a,b,c,d):
  165. return a*d-b*c
  166. #二元一次方程组
  167. def tle(a1,b1,c1,a2,b2,c2):
  168. return((det2(c1,b1,c2,b2)/det2(a1,b1,a2,b2),det2(a1,c1,a2,c2)/det2(a1,b1,a2,b2)))
  169. #点关于直线对称
  170. def dot_line():
  171. from fractions import Fraction
  172. a=Fraction(input("请输入点的横坐标:"))
  173. b=Fraction(input("请输入点的纵坐标:"))
  174. A=Fraction(input("请输入直线一般方程x的系数:"))
  175. B=Fraction(input("请输入直线一般方程y的系数:"))
  176. C=Fraction(input("请输入直线一般方程的常数项:"))
  177. m,n = tle(A,B,(-1)*(A*a+B*b+2*C),B,-A,a*B-A*b)
  178. print("对称点为:(",m,",",n,")")
  179. #直线关于点对称
  180. def line_dot():
  181. from fractions import Fraction
  182. A=Fraction(input("请输入直线一般方程x的系数:"))
  183. B=Fraction(input("请输入直线一般方程y的系数:"))
  184. C=Fraction(input("请输入直线一般方程的常数项:"))
  185. a=Fraction(input("请输入点的横坐标:"))
  186. b=Fraction(input("请输入点的纵坐标:"))
  187. m=-2*A*a-2*B*b-C
  188. print("对称直线三个系数分别为:",A,B,m)
  189. #直线关于直线对称
  190. def line_line():
  191. from fractions import Fraction
  192. P=Fraction(input("请输入直线一般方程x的系数:"))
  193. Q=Fraction(input("请输入直线一般方程y的系数:"))
  194. R=Fraction(input("请输入直线一般方程的常数项:"))
  195. A=Fraction(input("请输入对称轴一般方程x的系数:"))
  196. B=Fraction(input("请输入对称轴一般方程y的系数:"))
  197. C=Fraction(input("请输入对称轴一般方程的常数项:"))
  198. k=2*(P*A+Q*B)/(A*A+B*B)
  199. print("对称直线三个系数分别为:",P-A*k,Q-B*k,R-C*k)
  200. #三个点求圆的方程
  201. def circle():
  202. from fractions import Fraction
  203. x1=Fraction(input("请输入第一个点的横坐标:"))
  204. y1=Fraction(input("请输入第一个点的纵坐标:"))
  205. x2=Fraction(input("请输入第二个点的横坐标:"))
  206. y2=Fraction(input("请输入第二个点的纵坐标:"))
  207. x3=Fraction(input("请输入第三个点的横坐标:"))
  208. y3=Fraction(input("请输入第三个点的纵坐标:"))
  209. z1=x1*x1+y1*y1
  210. z2=x2*x2+y2*y2
  211. z3=x3*x3+y3*y3
  212. D,E = tle(x1-x2,y1-y2,z2-z1,x1-x3,y1-y3,z3-z1)
  213. F = -z1-D*x1-E*y1
  214. r2 = D*D+E*E-4*F
  215. print("D=",D,"E=",E,"F=",F)
  216. print("圆心:(",-D/2,",",-E/2,")"," 半径的平方:",r2)
  217. def main():
  218. if len(sys.argv) < 2:
  219. print("Usage: python mathCheat.py <tool_name>")
  220. sys.exit(1)
  221. tool_name = sys.argv[1]
  222. if tool_name in toolbox:
  223. try:
  224. toolbox[tool_name]()
  225. except:
  226. print("某些地方出错了!")
  227. else:
  228. print("工具名无效!")
  229. sys.exit(1)
  230. if __name__ == "__main__":
  231. toolbox = {"错位相减":cuoWeiXiangJian,"错位相减法":cuoWeiXiangJian, "等差乘等比":cuoWeiXiangJian,
  232. "二项分布":binomial,"超几何分布":hypergeometric,"K2":k2,"卡方":k2,"独立性检验":k2,
  233. "回归分析":regression,"相关系数":regression,"最小二乘法":regression,"决定系数":regression,"残差平方和":regression,"线性回归":regression,
  234. "混合方差":mixS2,"混合均值":mixS2,"直方图":histogram,
  235. "点关于线对称":dot_line, "点关于直线对称":dot_line, "直线关于点对称":line_dot, "线关于点对称":line_dot, "直线关于直线对称":line_line, "线关于线对称":line_line,
  236. "三个点求圆的方程":circle,"已知三点求圆的方程":circle,"求圆的方程":circle,
  237. }
  238. main()