##拟合多次多项式不过零 def fit_polynomial(x, y, degree): n = len(x) # 创建一个系数向量,初始化为0 coefficients = [0.0] * (degree + 1) # 创建矩阵 A 和向量 B,用于最小二乘法 # A = np.zeros((degree + 1, degree + 1)) # B = np.zeros(degree + 1) A=[] B=[] for i in range(degree + 1): row = [] B.append(0) for j in range(degree + 1): row.append(0) A.append(row) # 填充 A 和 B for i in range(n): for j in range(degree + 1): for k in range(degree + 1): A[j][k] += x[i] ** (j + k) B[j] += y[i] * x[i] ** j # 使用高斯消元法求解线性方程组 for i in range(degree + 1): for j in range(i + 1, degree + 1): factor = A[j][i] / A[i][i] for k in range(i, degree + 1): A[j][k] -= factor * A[i][k] B[j] -= factor * B[i] # 回代求解系数 for i in range(degree, -1, -1): coefficients[i] = B[i] for j in range(i + 1, degree + 1): coefficients[i] -= A[i][j] * coefficients[j] coefficients[i] /= A[i][i] #以下是求解拟合优度和相关系数的公式,不需要可以注释掉。 x_mean = sum(x) / n y_mean = sum(y) / n res=0 sum_=0 total=0 for j in range(n): for i in range(len(coefficients)): sum_=sum_+coefficients[i]*(x[j]**i) res=res+(sum_-y[j])**2 total = total + (y[j] - y_mean) ** 2 sum_ = 0 r_squared = 1 - res / total up = 0.0 down1 = 0.0 down2 = 0.0 for i in range(len(x)): up = up + (x[i] - x_mean) * (y[i] - y_mean) down1 = down1 + (x[i] - x_mean) ** 2 down2 = down2 + (y[i] - y_mean) ** 2 r = up / ((down1 * down2) ** 0.5) return coefficients, r_squared, r ##拟合多次多项式过零 def fit_polynomial_through_origin(x, y, degree): n = len(x) # 创建一个系数向量,初始化为0 coefficients = [0.0] * (degree + 1) # 创建一个矩阵 A 和向量 B,用于最小二乘法 A=[] B=[] for i in range(degree + 1): row = [] B.append(0) for j in range(degree + 1): row.append(0) A.append(row) # 填充 A 和 B for i in range(n): for j in range(degree + 1): for k in range(degree + 1): A[j][k] += x[i] ** (j + k) B[j] += y[i] * x[i] ** j # 修改 A 和 B 以确保零截距 for i in range(degree + 1): A[0][i] = 0 # 将矩阵 A 的第一行设置为零 B[0] = 0 # 将向量 B 的第一个元素设置为零 # 使用高斯消元法解决线性系统 for i in range(1, degree + 1): for j in range(i + 1, degree + 1): factor = A[j][i] / A[i][i] for k in range(i, degree + 1): A[j][k] -= factor * A[i][k] B[j] -= factor * B[i] # 回代求解系数 for i in range(degree, 0, -1): coefficients[i] = B[i] / A[i][i] #以下是求解拟合优度和相关系数的公式,不需要可以注释掉。 x_mean = sum(x) / n y_mean = sum(y) / n res=0 sum_=0 total=0 for j in range(n): for i in range(len(coefficients)): sum_=sum_+coefficients[i]*(x[j]**i) res=res+(sum_-y[j])**2 total = total + (y[j] - y_mean) ** 2 sum_ = 0 r_squared = 1 - res / total up=0.0 down1=0.0 down2=0.0 for i in range(len(x)): up= up+(x[i]-x_mean)*(y[i]-y_mean) down1=down1+(x[i]-x_mean)**2 down2=down2+(y[i]-y_mean)**2 r=up/((down1*down2)**0.5) return coefficients,r_squared,r # 定义加权最小二乘法拟合函数 def weighted_fit_polynomial(x, y, weights, degree): n = len(x) # 创建一个系数向量,初始化为0 coefficients = [0.0] * (degree + 1) # 创建矩阵 A 和向量 B,用于最小二乘法 A = [] B = [] for i in range(degree + 1): row = [] B.append(0) for j in range(degree + 1): row.append(0) A.append(row) # 填充 A 和 B for i in range(n): for j in range(degree + 1): for k in range(degree + 1): A[j][k] += weights[i] * x[i] ** (j + k) B[j] += weights[i] * y[i] * x[i] ** j # 使用高斯消元法求解线性方程组 for i in range(degree + 1): for j in range(i + 1, degree + 1): factor = A[j][i] / A[i][i] for k in range(i, degree + 1): A[j][k] -= factor * A[i][k] B[j] -= factor * B[i] # 回代求解系数 for i in range(degree, -1, -1): coefficients[i] = B[i] for j in range(i + 1, degree + 1): coefficients[i] -= A[i][j] * coefficients[j] coefficients[i] /= A[i][i] return coefficients ##浓度反算 def concentration(coefficients,area): concent=0 if len(coefficients) == 2: # concent=(area-coefficients[0])/coefficients[1] concent = (area *coefficients[1]+ coefficients[0]) else: for i in range(len(coefficients)): concent=concent+coefficients[i]*(area**i) return concent
python 不调用第三方库实现多次多项式拟合,多项式拟合过零点,加权多项式拟合,拟合优度与相关系数
最新推荐文章于 2025-04-08 15:54:06 发布