gtfd
This commit is contained in:
29
89-1.py
29
89-1.py
@@ -43,6 +43,14 @@ def SovleRowMain(A,b):
|
||||
# 最小二乘法拟合
|
||||
def LeastSquares(list_x,list_y,n):
|
||||
m = len(list_x)
|
||||
for i in range(2*n):
|
||||
tl = [list_x[j]**(i+1) for j in range(m)]
|
||||
print(f"x^{i+1} :",tl)
|
||||
print("sum:", sum(tl))
|
||||
for i in range(n+1):
|
||||
tl = [list_y[j]*list_x[j]**i for j in range(m)]
|
||||
print(f"y*x^{i}: ",tl)
|
||||
print("sum:", sum(tl))
|
||||
x_n = []
|
||||
b = []
|
||||
for i in range(2*n+1):
|
||||
@@ -71,13 +79,16 @@ def CalculateY(list_x, coeff):
|
||||
re.append(0)
|
||||
for j in range(len(coeff)):
|
||||
re[i] += coeff[j]*list_x[i]**j
|
||||
print("y预测:", re)
|
||||
return re
|
||||
|
||||
# 计算均方根误差
|
||||
def MeanSquareErr(list_y,list_y_approx):
|
||||
m = len(list_y)
|
||||
err = 0
|
||||
print("y差值: ")
|
||||
for i in range(m):
|
||||
print(f"y-y测={list_y[i] - list_y_approx[i]}, (y-y测)^2={(list_y[i] - list_y_approx[i])**2}")
|
||||
err += (list_y[i] - list_y_approx[i])**2
|
||||
return err**0.5
|
||||
|
||||
@@ -108,17 +119,19 @@ if __name__ == "__main__":
|
||||
coeff = LeastSquares(x,y,1)
|
||||
PrintEquation(coeff)
|
||||
y_approx = CalculateY(x, coeff)
|
||||
print("均方根误差:")
|
||||
print(MeanSquareErr(y,y_approx))
|
||||
print("最大误差:")
|
||||
print(MaxErr(y,y_approx))
|
||||
# print()
|
||||
print("均方根误差:",MeanSquareErr(y,y_approx))
|
||||
# print()
|
||||
print("最大误差:",MaxErr(y,y_approx))
|
||||
|
||||
print()
|
||||
|
||||
print("二次拟合")
|
||||
coeff = LeastSquares(x,y,2)
|
||||
PrintEquation(coeff)
|
||||
y_approx = CalculateY(x, coeff)
|
||||
print("均方根误差:")
|
||||
print(MeanSquareErr(y,y_approx))
|
||||
print("最大误差:")
|
||||
print(MaxErr(y,y_approx))
|
||||
# print()
|
||||
print("均方根误差:",MeanSquareErr(y,y_approx))
|
||||
# print()
|
||||
print("最大误差:",MaxErr(y,y_approx))
|
||||
|
||||
@@ -48,6 +48,14 @@ def SovleRowMain(A,b):
|
||||
# 最小二乘法拟合
|
||||
def LeastSquares(list_x,list_y,n):
|
||||
m = len(list_x)
|
||||
for i in range(2*n):
|
||||
tl = [list_x[j]**(i+1) for j in range(m)]
|
||||
print(f"x^{i+1} :",tl)
|
||||
print("sum:", sum(tl))
|
||||
for i in range(n+1):
|
||||
tl = [list_y[j]*list_x[j]**i for j in range(m)]
|
||||
print(f"y*x^{i}: ",tl)
|
||||
print("sum:", sum(tl))
|
||||
x_n = []
|
||||
b = []
|
||||
for i in range(2*n+1):
|
||||
@@ -76,13 +84,16 @@ def CalculateY(list_x, coeff):
|
||||
re.append(0)
|
||||
for j in range(len(coeff)):
|
||||
re[i] += coeff[j]*list_x[i]**j
|
||||
print("y预测:", re)
|
||||
return re
|
||||
|
||||
# 计算均方根误差
|
||||
def MeanSquareErr(list_y,list_y_approx):
|
||||
m = len(list_y)
|
||||
err = 0
|
||||
print("y差值: ")
|
||||
for i in range(m):
|
||||
print(f"y-y测={list_y[i] - list_y_approx[i]}, (y-y测)^2={(list_y[i] - list_y_approx[i])**2}")
|
||||
err += (list_y[i] - list_y_approx[i])**2
|
||||
return err**0.5
|
||||
|
||||
@@ -117,17 +128,16 @@ if __name__ == "__main__":
|
||||
coeff = LeastSquares(list_x,list_y,1)
|
||||
PrintEquation(coeff)
|
||||
y_approx = CalculateY(list_x, coeff)
|
||||
print("均方根误差:")
|
||||
print(MeanSquareErr(list_y,y_approx))
|
||||
print("最大误差:")
|
||||
print(MaxErr(list_y,y_approx))
|
||||
print("均方根误差:",MeanSquareErr(list_y,y_approx))
|
||||
print("最大误差:",MaxErr(list_y,y_approx))
|
||||
|
||||
print()
|
||||
|
||||
print("二次拟合")
|
||||
coeff = LeastSquares(list_x,list_y,2)
|
||||
PrintEquation(coeff)
|
||||
y_approx = CalculateY(list_x, coeff)
|
||||
print("均方根误差:")
|
||||
print(MeanSquareErr(list_y,y_approx))
|
||||
print("最大误差:")
|
||||
print(MaxErr(list_y,y_approx))
|
||||
print("均方根误差:",MeanSquareErr(list_y,y_approx))
|
||||
print("最大误差:",MaxErr(list_y,y_approx))
|
||||
|
||||
|
||||
@@ -22,6 +22,11 @@ def SovleRowMain(A,b):
|
||||
b[i], b[row_max_index] = b[row_max_index], b[i]
|
||||
p[i], p[row_max_index] = p[row_max_index], p[i]
|
||||
|
||||
print(f"第{i+1}次交换,交换行{i+1}和行{row_max_index+1},A矩阵为:")
|
||||
for row in A:
|
||||
print(row)
|
||||
print(f"b向量为:{b}\n")
|
||||
|
||||
if abs(A[i][i]) < ks:
|
||||
print("A矩阵奇异,无法进行高斯消元")
|
||||
return None,None,None,None
|
||||
@@ -31,6 +36,11 @@ def SovleRowMain(A,b):
|
||||
for k in range(i + 1, n):
|
||||
A[j][k] -= m * A[i][k]
|
||||
b[j] -= m * b[i]
|
||||
print(f"系数为{-1*m}用加号")
|
||||
print("消元后的A矩阵:")
|
||||
for row in A:
|
||||
print(row)
|
||||
print(f"消元后的b向量:{b}\n")
|
||||
|
||||
if abs(A[n - 1][n - 1]) < ks:
|
||||
print("A矩阵奇异,无法进行高斯消元")
|
||||
|
||||
@@ -24,12 +24,25 @@ def SqrtSolve(A,b):
|
||||
for k in range(j):
|
||||
L[getIndexFromDownMatrix(i,j)] -= L[getIndexFromDownMatrix(i,k)]*L[getIndexFromDownMatrix(j,k)]
|
||||
L[getIndexFromDownMatrix(i,j)] /= L[getIndexFromDownMatrix(j,j)]
|
||||
print(L)
|
||||
|
||||
# 打印下三角矩阵
|
||||
print("下三角矩阵 L:")
|
||||
for i in range(n):
|
||||
L_row = []
|
||||
for j in range(n):
|
||||
if j <= i:
|
||||
L_row.append(L[getIndexFromDownMatrix(i,j)])
|
||||
else:
|
||||
L_row.append(0)
|
||||
print(L_row)
|
||||
# print(L)
|
||||
for i in range(n):
|
||||
for k in range(i):
|
||||
b[i] -= L[getIndexFromDownMatrix(i,k)]*b[k]
|
||||
b[i] /= L[getIndexFromDownMatrix(i,i)]
|
||||
|
||||
# 打印 b 向量
|
||||
print("y 向量:")
|
||||
print(b)
|
||||
for i in range(n-1,-1,-1):
|
||||
for k in range(i+1,n):
|
||||
b[i] -= L[getIndexFromDownMatrix(k,i)]*b[k]
|
||||
@@ -45,5 +58,5 @@ if __name__ == "__main__":
|
||||
|
||||
b = [10,5,4] # b向量,常数项
|
||||
|
||||
print("x:")
|
||||
print(SqrtSolve(A,b))
|
||||
# print("x:")
|
||||
print("x: \n",SqrtSolve(A,b))
|
||||
|
||||
Reference in New Issue
Block a user