This commit is contained in:
lwj
2025-06-19 00:08:48 +08:00
parent 3d1d16df10
commit e4e1a4be1e
4 changed files with 66 additions and 20 deletions

29
89-1.py
View File

@@ -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))

View File

@@ -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))

View File

@@ -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矩阵奇异无法进行高斯消元")

View File

@@ -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))