import os import glob import re import numpy as np import matplotlib.pyplot as plt # 配置参数 CONFIG = { "image_width": 4096, "image_height": 3072, "target_dir": r"C:/Users/V86997995/Desktop/FullsweepImages/", "roi_ratio": 0.3, # 中心ROI区域比例 "global_fit_degree": 2, # 全局拟合多项式次数 "local_fit_configs": [ # 局部拟合配置 {'name': '3点拟合', 'points': 3, 'color': 'green'}, {'name': '5点拟合', 'points': 5, 'color': 'blue'}, {'name': '7点拟合', 'points': 7, 'color': 'orange'} ] } def unpack_mipi10(buffer, width, height): """解包MIPI10格式的RAW数据""" raw_data = np.empty(width * height, dtype=np.int32) buf_idx = 0 for y in range(height): for x in range(0, width, 4): if buf_idx + 5 > len(buffer): raise ValueError("文件尺寸不匹配") byte0, byte1, byte2, byte3, byte4 = buffer[buf_idx:buf_idx + 5] buf_idx += 5 raw_data[y * width + x] = (byte0 << 2) | ((byte4 >> 6) & 0x03) raw_data[y * width + x + 1] = (byte1 << 2) | ((byte4 >> 4) & 0x03) raw_data[y * width + x + 2] = (byte2 << 2) | ((byte4 >> 2) & 0x03) raw_data[y * width + x + 3] = (byte3 << 2) | (byte4 & 0x03) return raw_data def calculate_fv(raw_data, width, height, roi_ratio): """计算对焦评价值(FV)""" # 计算ROI区域 roi_w = int(width * roi_ratio) roi_h = int(height * roi_ratio) start_x = (width - roi_w) // 2 start_y = (height - roi_h) // 2 # 梯度计算 fv = 0 for y in range(start_y, start_y + roi_h): for x in range(start_x, start_x + roi_w): if x <= 0 or x >= width - 1 or y <= 0 or y >= height - 1: continue # 检查绿色像素 (Bayer RGGB模式) is_green = (y % 2 == 0 and x % 2 == 1) or (y % 2 == 1 and x % 2 == 0) if not is_green: continue # Sobel梯度计算 gx = raw_data[y * width + x + 1] - raw_data[y * width + x - 1] gy = raw_data[(y + 1) * width + x] - raw_data[(y - 1) * width + x] fv += abs(gx) + abs(gy) return fv def polynomial_fit(x_data, y_data, degree): """多项式拟合与峰值计算""" coeffs = np.polyfit(x_data, y_data, degree) poly = np.poly1d(coeffs) # 对于二次多项式求导找极值 if degree == 2: a, b, c = coeffs peak_x = -b / (2 * a) peak_y = poly(peak_x) else: # 通用极值搜索方法 x_fit = np.linspace(min(x_data), max(x_data), 1000) y_fit = poly(x_fit) peak_idx = np.argmax(y_fit) peak_x, peak_y = x_fit[peak_idx], y_fit[peak_idx] return peak_x, peak_y, coeffs def local_fitting(x_data, y_data, center, num_points): """局部数据拟合""" x_data = np.array(x_data) y_data = np.array(y_data) # 选择最近的num_points个点 distances = np.abs(x_data - center) indices = np.argpartition(distances, num_points)[:num_points] # 局部数据排序 local_x = np.sort(x_data[indices]) local_y = y_data[indices][np.argsort(x_data[indices])] return local_x, local_y def main(): # 获取RAW文件列表 raw_files = glob.glob(os.path.join(CONFIG['target_dir'], "*.raw")) if not raw_files: print(f"错误:在目录 {CONFIG['target_dir']} 中未找到RAW文件") return # 数据收集 positions, fv_values = [], [] for file_path in raw_files: try: # 提取镜头位置 base_name = os.path.basename(file_path) match = re.search(r'lens_pos_(\d+)', base_name) if not match: print(f"警告:跳过无效文件名格式 {base_name}") continue lens_pos = int(match.group(1)) # 读取并处理RAW文件 with open(file_path, 'rb') as f: buffer = f.read() raw_data = unpack_mipi10(buffer, CONFIG['image_width'], CONFIG['image_height']) fv = calculate_fv(raw_data, CONFIG['image_width'], CONFIG['image_height'], CONFIG['roi_ratio']) positions.append(lens_pos) fv_values.append(fv) print(f"处理完成: {base_name} -> 位置: {lens_pos}, FV: {fv:,}") except Exception as e: print(f"处理文件 {base_name} 时发生错误: {str(e)}") continue # 数据验证 if len(positions) < 3: print(f"错误:有效数据点不足 ({len(positions)}),至少需要3个点") return # 全局拟合 global_peak_x, global_peak_y, global_coeffs = polynomial_fit( positions, fv_values, CONFIG['global_fit_degree'] ) plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置黑体 plt.rcParams['axes.unicode_minus'] = False # 正确显示负号 # 输出全局结果 print("\n=== 全局拟合结果 ===") print(f"拟合方程: y = {global_coeffs[0]:.2f}x² + {global_coeffs[1]:.2f}x {global_coeffs[2]:.2f}") print(f"最佳对焦位置: {global_peak_x:.2f}") print(f"预测最大FV值: {global_peak_y:,.2f}") # 局部拟合分析 print("\n=== 局部拟合分析 ===") local_results = [] for config in CONFIG['local_fit_configs']: try: if len(positions) < config['points']: raise ValueError("数据点不足") # 选择局部数据 local_x, local_y = local_fitting( positions, fv_values, global_peak_x, config['points'] ) # 执行局部拟合 peak_x, peak_y, coeffs = polynomial_fit(local_x, local_y, 2) local_results.append({ 'name': config['name'], 'peak_x': peak_x, 'peak_y': peak_y, 'coeffs': coeffs, 'color': config['color'] }) # print(f"{config['name']}成功 -> 位置: {peak_x:.2f}, FV: {peak_y:,.2f}") equation = f"y = {coeffs[0]:.2f}x² + {coeffs[1]:.2f}x + {coeffs[2]:.2f}" print(f"{config['name']}成功 -> 位置: {peak_x:.2f}, FV: {peak_y:,.2f}") print(f"抛物线方程: {equation}") # 新增输出行 except Exception as e: print(f"{config['name']}失败: {str(e)}") continue # 在可视化部分添加以下代码 # 原代码的plt.figure之后添加: plt.ylim(bottom=0) # 限制y轴只显示正半轴 plt.gca().set_aspect(1.0 / 200) # 调整纵横比使曲线更陡 # 修改后的完整可视化代码块: # 可视化 plt.figure(figsize=(15, 5)) # 修改画布尺寸为更宽的比例 # 设置纵坐标格式和范围 import matplotlib.ticker as ticker plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f"{x:,.0f}")) plt.ylim(bottom=max(0, min(fv_values) * 0.9), top=max(fv_values) * 1.1) # 动态调整范围 # 设置横纵比(核心修改) plt.gca().set_box_aspect(0.3) # 参数越小曲线越陡 # 绘制原始数据(保持原有代码) plt.scatter(positions, fv_values, c='black', s=80, label='原始数据', zorder=5) # 绘制全局拟合曲线 x_global = np.linspace(min(positions), max(positions), 500) y_global = np.polyval(global_coeffs, x_global) plt.plot(x_global, y_global, 'r--', lw=2, label='全局拟合', zorder=3) # 绘制局部拟合曲线 for result in local_results: x_local = np.linspace(min(positions), max(positions), 500) y_local = np.polyval(result['coeffs'], x_local) plt.plot(x_local, y_local, color=result['color'], linestyle=':', lw=2, label=result['name'], zorder=2) # 标注峰值点 plt.axvline(global_peak_x, color='red', linestyle='--', label='全局最佳位置') for result in local_results: plt.axvline(result['peak_x'], color=result['color'], linestyle=':', label=f"{result['name']}最佳") plt.title('FV-LenPos曲线', fontsize=14) plt.xlabel('镜头位置', fontsize=12) plt.ylabel('对焦评价值 (FV)', fontsize=12) plt.grid(True, alpha=0.3) plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show() if __name__ == "__main__": main()局部拟合之后,根据的出来的抛物线方程再计算lenpos的FV值打印出来
时间: 2025-08-09 13:13:34 浏览: 6
<think>好的,我现在需要解决用户的问题:在局部拟合之后,根据得出的抛物线方程再计算lenpos的FV值并打印出来。首先,我得理解现有的代码结构和功能。用户提供的代码主要处理RAW图像文件,计算对焦评价值(FV),并进行全局和局部拟合。主函数main()中,处理每个RAW文件,提取镜头位置和对应的FV值,然后进行全局多项式拟合。接着,对每个局部配置(3点、5点、7点拟合)进行局部数据选择和二次拟合,得到峰值位置和抛物线方程。用户的需求是在局部拟合完成后,使用这些拟合出的抛物线方程,重新计算特定镜头位置(可能是峰值位置或其他点)的FV值,并打印出来。需要明确的是,用户希望的是在局部拟合后,用拟合出的方程计算该方程对应的FV预测值,而不是原始数据中的实际值。首先,我需要查看局部拟合的结果存储在哪里。在代码中,局部拟合的结果存储在local_results列表中,每个结果包含系数coeffs。例如,对于3点拟合,会有一个二次方程的系数,形式为y= ax² +bx +c。用户可能希望在每个局部拟合的结果中,不仅显示峰值位置的预测FV值,还要显示该方程在其他位置(比如实际峰值点附近)的计算值。但根据问题描述,用户可能只是想验证拟合方程在峰值点处的FV值,或者是在原始数据点处的预测值。但根据用户的问题描述,“根据的出来的抛物线方程再计算lenpos的FV值打印出来”,这里的lenpos可能指的是拟合后的最佳位置(即peak_x),或者可能是其他位置。例如,在局部拟合中,已经计算了peak_x和peak_y,即抛物线的顶点,此时peak_y就是该方程在peak_x处的FV预测值。在代码中,已经打印了这些值,比如“3点拟合成功 ->位置: x, FV:y”。但用户可能希望更详细地输出每个局部拟合方程在不同位置的计算值,或者可能希望输出方程在原始数据点上的预测值,并与实际值比较。
或者,用户可能希望对于每个局部拟合的抛物线方程,计算其在某个特定镜头位置(例如全局最佳位置或局部最佳位置)的FV预测值,并打印出来。需要明确的是,当前代码在局部拟合后,已经计算了peak_x和peak_y,并且打印了这些值。例如,在代码的print语句中:print(f"{config['name']}成功->位置:{peak_x:.2f}, FV:{peak_y:,.2f}")print(f"抛物线方程:{equation}")这里的peak_y就是该局部拟合方程在peak_x处的预测值。所以用户可能已经得到了这些信息,但希望进一步输出其他位置的预测值,或者可能希望将拟合后的方程应用于所有原始数据点,计算预测值并输出。
或者,用户可能希望对于每个局部拟合的方程,生成一组预测值,比如在局部拟合所使用的数据点范围内,计算每个x对应的y值,并打印这些值。例如,对于每个局部拟合,可能想要输出拟合后的方程在局部数据点x值处的预测FV,或者在整个数据范围内的预测值。但根据问题描述,用户可能是在现有代码的基础上,希望在每个局部拟合后,不仅输出峰值位置,还要输出该方程在其他位置的预测值,比如在原始数据的所有镜头位置处,用局部拟合的方程计算FV值,并打印这些结果。不过,这可能不太合理,因为局部拟合使用的是局部数据点,可能只适用于该区域。例如,3点拟合可能只使用靠近全局峰值的三个点,得到的抛物线方程可能在这些点附近有效,但如果在全部位置应用该方程,预测值可能与实际相差较大。另一种可能是,用户希望对于每个局部拟合的结果,显示其抛物线方程在对应局部数据点处的预测FV值,并与实际值进行比较,以评估拟合效果。
例如,对于3点拟合,选取了最近的3个数据点,进行二次拟合,得到方程后,计算这3个点处的预测FV,并打印出来,与实际值对比。这可能更有意义,可以评估拟合的准确性。例如,在现有代码中,当进行局部拟合后,可以遍历这些局部数据点,用拟合方程计算预测值,与实际值比较,并打印残差或具体数值。因此,可能的解决方案是,在局部拟合的部分,添加代码,针对每个局部拟合的结果,计算其使用的局部数据点(local_x和local_y)的预测值,并输出这些预测值及对应的实际值,以进行比较。
例如,在local_fitting函数返回local_x和local_y后,在局部拟合完成后,使用拟合的系数计算这些local_x处的预测y值,然后打印或输出这些值。
或者,用户可能希望对于每个局部拟合,生成一组预测值,比如在更密集的x范围内计算y值,并输出这些值,以便绘制更平滑的曲线。但现有代码已经绘制了局部拟合的曲线。根据用户的问题描述,可能更简单的情况是,用户希望在每个局部拟合后,输出该抛物线方程在最佳位置(peak_x)处的FV值,而该值已经在代码中计算并打印了。但用户可能希望更详细地输出该方程在其他位置的预测值,比如在某个特定的镜头位置,或者所有原始数据点。
或者,用户可能希望将局部拟合后的方程应用到全局数据,计算每个原始镜头位置的预测FV,并输出这些值,以便比较不同拟合方法的预测效果。例如,在现有代码的局部拟合循环中,对于每个局部拟合的结果,遍历所有原始positions,用该拟合的方程计算预测的FV,并打印这些预测值。但这样可能会产生大量输出,需要合理格式化。
或者,用户可能希望在每个局部拟合后,输出其方程在全局峰值位置处的预测FV,以比较不同局部拟合对全局峰值的预测。例如,用3点拟合的方程计算全局peak_x处的FV预测值,并输出。
但需要明确用户的具体需求。由于问题描述不够详细,可能需要做一些假设。假设用户希望在局部拟合后,除了输出峰值位置和方程外,还输出该方程在原始数据点中的每个镜头位置处的预测FV值,那么可以在代码中添加相应的循环,计算每个position的预测值,并打印。
例如,在局部拟合的循环中,添加:for posin positions:predicted_fv =np.polyval(result['coeffs'],pos)print(f"位置 {pos}:预测FV ={predicted_fv:.2f}")但这可能会生成大量输出,尤其是当有多个局部拟合和多个数据点时。因此,可能需要更简洁的输出方式,比如只输出局部拟合所使用的数据点处的预测值和实际值的对比。或者,用户可能希望针对每个局部拟合,输出其方程在peak_x处的FV值,而该值已经由peak_y给出,所以当前的输出可能已经满足需求。但用户的问题可能是指当前输出中没有显示这个计算过程,或者希望以更详细的方式展示。
另一种可能性是,用户可能误以为当前代码中的peak_y是实际测量值,而希望用拟合方程重新计算该位置的预测值,但实际上peak_y已经是拟合方程在该位置的预测值,所以无需额外计算。因此,可能用户的问题已经得到解决,但需要确认代码是否正确处理了这一点。例如,在polynomial_fit函数中,当degree为2时,计算peak_x为 -b/(2a),然后计算peak_y =poly(peak_x),这正是该位置的预测FV值。因此,在局部拟合的结果中,peak_y已经是根据抛物线方程计算出的预测值,而用户可能希望将这些值打印出来,而当前代码已经这样做了。
但用户的问题描述中提到“根据的出来的抛物线方程再计算lenpos的FV值打印出来”,可能用户认为当前的输出中没有打印这些值,或者希望以不同的方式呈现。例如,当前代码中,在局部拟合成功后,打印了:
print(f"{config['name']}成功->位置:{peak_x:.2f}, FV:{peak_y:,.2f}")print(f"抛物线方程:{equation}")其中peak_y就是该抛物线方程在peak_x处的预测FV值。因此,用户可能需要的是,在得到局部拟合的方程后,计算其他位置的FV值,比如原始数据中的某些特定位置,或者所有位置,并打印这些值。或者,用户可能希望将各个局部拟合的方程在全局拟合的峰值位置处的预测FV值计算出来,以比较不同局部拟合方法对全局峰值的预测结果。
例如,在全局拟合得到global_peak_x后,对于每个局部拟合的方程,计算在global_peak_x处的FV预测值,并打印。这可以帮助比较不同局部拟合方程在全局峰值位置的预测差异。
或者,用户可能希望将各个局部拟合的方程在它们自己的峰值位置(即local_peak_x)处的FV预测值,这已经由peak_y给出,并被打印。因此,可能需要进一步明确用户的需求。但由于用户的问题描述较为简略,可能需要根据现有代码进行推断。可能的解决方案是,在局部拟合后,针对每个局部拟合的结果,生成一组预测值,例如在局部数据点附近,或者在整个数据范围内,并输出这些预测值。例如,在现有的可视化部分,已经绘制了局部拟合的曲线,但用户可能希望以文本形式输出这些预测值。例如,在局部拟合的循环中,添加代码,计算每个局部拟合方程在原始positions中的预测FV值,并打印出来。例如:for resultin local_results:print(f"\n{result['name']}预测FV值:")forx, yin zip(positions, fv_values):predicted_y= np.polyval(result['coeffs'], x)print(f"位置{x}:实际FV={y:,.2f},预测FV={predicted_y:,.2f},差值={y- predicted_y:,.2f}")
这将输出每个位置的实际FV和预测FV,以及它们的差值。这可能有助于评估拟合的准确性。
但这样可能会产生大量的输出,特别是当有多个局部拟合和多个数据点时。因此,可能需要将输出限制在局部拟合所使用的数据点,或者只输出峰值点附近的预测值。或者,用户可能希望输出每个局部拟合方程在拟合范围内的预测值,例如,在局部数据点的最小和最大x值之间,生成一些点,并输出这些点的预测FV。
例如,在局部拟合的循环中:local_x =...#局部拟合使用的数据点的x值x_fit =np.linspace(min(local_x), max(local_x),5)#生成5个点print(f"{config['name']}拟合预测值:")for xin x_fit:y =np.polyval(coeffs, x)print(f"x={x:.2f}:y={y:.2f}")
这将输出拟合方程在该局部区域内的预测值。或者,用户可能希望输出拟合方程在更密集的x值上的预测,例如,每1个镜头位置间隔的预测值。但具体如何实施,需要根据用户的实际需求而定。假设用户希望对于每个局部拟合,输出其方程在最佳位置(peak_x)处的FV值,而该值已经在代码中输出,那么可能用户的问题已经解决。但根据用户的问题描述,可能认为当前的输出没有显示这一点,或者需要更详细的输出。例如,在现有的代码中,当进行局部拟合后,会打印:
3点拟合成功 ->位置:123.45,FV:56,789.12抛物线方程:y =1.23x² +4.56x +7.89用户可能希望进一步输出,使用该抛物线方程计算其他位置的FV值,例如,在全局峰值位置处的预测值,或者在某个特定位置。
例如,在局部拟合的循环中,计算全局峰值位置处的预测FV:
global_peak_x =...#从全局拟合获得forresult inlocal_results:coeffs =result['coeffs']predicted_fv =np.polyval(coeffs,global_peak_x)print(f"{result['name']}在全局最佳位置{global_peak_x:.2f}处的预测FV:{predicted_fv:.2f}")这可能有助于比较不同局部拟合方程在全局峰值位置的预测结果。
或者,用户可能希望输出每个局部拟合方程在它们自己的峰值位置附近的几个点的预测值,例如,peak_x-1,peak_x, peak_x+1。例如:for resultin local_results:peak_x =result['peak_x']x_values= [peak_x-1,peak_x, peak_x +1]print(f"{result['name']}在峰值附近的预测FV:")forx inx_values:y =np.polyval(result['coeffs'],x)print(f"位置{x:.2f}:FV={y:.2f}")
这将展示拟合方程在峰值附近的变化情况。
综上,用户的需求可能是在局部拟合后,除了输出峰值位置和方程外,还需要输出该方程在某些特定位置的预测FV值。因此,需要修改代码,在局部拟合的部分添加相应的计算和打印语句。
现在,我需要确定如何在现有代码中实现这一点。在main()函数的局部拟合循环中,当每个局部拟合完成后,可以添加代码来计算并打印所需的预测值。例如,在以下代码块中:
local_results.append({'name': config['name'],'peak_x':peak_x,'peak_y':peak_y,'coeffs': coeffs,'color': config['color']
})print(f"{config['name']}成功 ->位置: {peak_x:.2f},FV: {peak_y:,.2f}")
print(f"抛物线方程: {equation}")
#新增代码:计算并打印该方程在多个位置的预测FV值可以添加例如计算在局部数据点处的预测值,或者在其他关键位置的预测值。假设用户希望打印该方程在局部拟合所使用的数据点处的预测FV值,并与实际值比较,可以这样做:在local_fitting返回local_x和local_y后,进行拟合,然后计算预测值:local_x,local_y=local_fitting(...)peak_x,peak_y,coeffs=polynomial_fit(...)#计算预测值predicted_y=np.polyval(coeffs,local_x)print(f"{config['name']}拟合数据点的预测值与实际值对比:")forx,actual,predictedinzip(local_x,local_y,predicted_y):print(f"位置{x}:实际FV={actual:,.2f},预测FV={predicted:,.2f},差值={actual- predicted:,.2f}")这将输出每个局部数据点的实际和预测FV,以及它们的差异,帮助评估拟合的好坏。
或者,用户可能希望输出该方程在原始所有数据点处的预测值,但这可能不适用于局部拟合,因为局部拟合仅使用部分数据点,可能在其他位置的预测不准确。因此,更合理的做法是仅在局部数据点处进行预测值的输出。
现在,我需要将这些思路转化为具体的代码修改,并确保其正确性。例如,在现有代码的局部拟合循环中,添加以下内容:
在以下代码块:equation= f"y= {coeffs[0]:.2f}x² +{coeffs[1]:.2f}x +{coeffs[2]:.2f}"print(f"{config['name']}成功 ->位置: {peak_x:.2f},FV: {peak_y:,.2f}")print(f"抛物线方程:{equation}")#新增输出行之后,添加:#计算局部数据点的预测FV值predicted_local_y= np.polyval(coeffs, local_x)print(f"\n{config['name']}拟合数据点预测值对比:")for x, actual, predictedin zip(local_x,local_y, predicted_local_y):print(f"位置{x}:实际FV={actual:,.2f},预测FV={predicted:,.2f},差值={actual- predicted:,.2f}")这将输出每个局部拟合所使用的数据点的实际和预测FV值,以及它们的差异。这将满足用户希望根据抛物线方程计算并打印FV值的需求。此外,用户可能还希望输出该方程在更密集的x值上的预测,例如在峰值位置附近生成一些点,并打印预测值。例如:#生成峰值附近的预测值x_samples= np.linspace(peak_x-2,peak_x+2,5)#生成5个点,间隔1print(f"{config['name']}在峰值附近的预测FV:")forx inx_samples:y =np.polyval(coeffs,x)print(f"位置 {x:.2f}: FV={y:.2f}")这将展示拟合方程在峰值附近的预测趋势。
总结,用户的需求可能是在局部拟合后,更详细地输出拟合方程在不同位置的预测FV值。因此,需要根据具体需求选择输出哪些位置的预测值,并在代码中添加相应的计算和打印语句。</think>以下是修改后的代码,在局部拟合后增加预测值的打印输出:
```python
# 在local_fitting循环内添加以下代码(约在main函数第135行附近)
# 原代码
equation = f"y = {coeffs[0]:.2f}x² + {coeffs[1]:.2f}x + {coeffs[2]:.2f}"
print(f"{config['name']}成功 -> 位置: {peak_x:.2f}, FV: {peak_y:,.2f}")
print(f"抛物线方程: {equation}")
# ================ 新增代码开始 ================
# 计算拟合点预测值
predicted_local = np.polyval(coeffs, local_x)
print(f"[{config['name']}] 拟合点预测对比:")
for x, real, pred in zip(local_x, local_y, predicted_local):
print(f"位置 {x} | 实际FV: {real:,.0f} | 预测FV: {pred:,.0f} | 残差: {real-pred:,.0f}")
# 生成扩展预测范围(峰值附近±10个位置)
sample_points = np.linspace(peak_x-10, peak_x+10, 5)
print(f"[{config['name']}] 扩展预测:")
for x in sample_points:
y = np.polyval(coeffs, x)
print(f"位置 {x:.1f} → 预测FV: {y:,.0f}")
# ================ 新增代码结束 ================
local_results.append({
'name': config['name'],
'peak_x': peak_x,
'peak_y': peak_y,
'coeffs': coeffs,
'color': config['color']
})
```
**代码解释:**
1. **拟合点预测对比**:使用拟合出的多项式系数,计算局部拟合所用数据点的预测FV值,并与实际测量值对比,显示残差
2. **扩展预测**:在峰值位置前后各扩展10个位置,生成5个均匀分布的采样点,显示这些位置的预测FV值
3. **格式化输出**:使用千分位分隔符显示大数字,保留整数以提高可读性
**输出示例:**
```
[3点拟合] 拟合点预测对比:
位置 123 | 实际FV: 45,678 | 预测FV: 45,700 | 残差: -22
位置 125 | 实际FV: 45,812 | 预测FV: 45,805 | 残差: 7
位置 127 | 实际FV: 45,743 | 预测FV: 45,755 | 残差: -12
[3点拟合] 扩展预测:
位置 113.0 → 预测FV: 44,892
位置 118.5 → 预测FV: 45,325
位置 124.0 → 预测FV: 45,703
位置 129.5 → 预测FV: 45,826
位置 135.0 → 预测FV: 45,694
```
阅读全文
相关推荐



















