偷懒小工具,功能:

  • 等差乘等比
  • 二项分布
  • 超几何分布
  • 卡方计算
  • 回归分析
#出现问题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 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,               
               }
    main()
最后修改:2024 年 03 月 06 日
如果觉得我的文章对您有用,请随意点赞