偷懒小工具,功能:
- 等差乘等比
- 二项分布
- 超几何分布
- 卡方计算
- 回归分析
#出现问题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()