diff --git a/89-1.py b/89-1.py index 84a3ccd..44a4ef1 100644 --- a/89-1.py +++ b/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)) \ No newline at end of file diff --git a/按方法整理/拟合-最小二乘法.py b/按方法整理/拟合-最小二乘法.py index 5d70403..e3dc779 100644 --- a/按方法整理/拟合-最小二乘法.py +++ b/按方法整理/拟合-最小二乘法.py @@ -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)) + \ No newline at end of file diff --git a/按方法整理/矩阵-列主元高斯消元法.py b/按方法整理/矩阵-列主元高斯消元法.py index 80fc456..27bbf1f 100644 --- a/按方法整理/矩阵-列主元高斯消元法.py +++ b/按方法整理/矩阵-列主元高斯消元法.py @@ -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矩阵奇异,无法进行高斯消元") diff --git a/按方法整理/矩阵-平方根法.py b/按方法整理/矩阵-平方根法.py index c0ce8ed..ef1c8ee 100644 --- a/按方法整理/矩阵-平方根法.py +++ b/按方法整理/矩阵-平方根法.py @@ -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))