C#中PointCollection正弦数据数值积分结果异常问题排查
代码问题分析
代码存在两个核心错误:
- 缺少积分结果累计逻辑:当前计算的
integrated_ypos仅为第i个采样区间的梯形面积,不是从序列起点到第i个点的累计积分值。梯形法数值积分的本质是将所有前置区间的面积求和,才能得到对应点的不定积分结果。未做累加时,输出值近似与sin(x)*Δx成正比,形状和原始sin数据接近,自然和理论结果-cos(x)不符。 - 人为添加了不必要的坐标变换:代码中
integrated_ypos/5+300是强制写入的缩放和偏移逻辑,这就是必须手动缩放才能正常显示的原因,常规积分计算不需要这一步。
修复后的代码
private PointCollection Numerical_Integration(PointCollection input_data) { PointCollection integrated_data = new(); // 累计积分初始值,对应不定积分的常数项,可根据需要的基线调整 double cumulative_integral = 0; // 添加积分起点,和原始数据点数量对齐 integrated_data.Add(new Point(input_data[0].X, cumulative_integral)); for (int i = 1; i < input_data.Count; i++) { // 计算当前区间的梯形面积 double interval_area = (input_data[i].Y + input_data[i - 1].Y) / 2 * (input_data[i].X - input_data[i - 1].X); // 累加得到从起点到当前点的总积分值 cumulative_integral += interval_area; integrated_data.Add(new Point(input_data[i].X, cumulative_integral)); } return integrated_data; }
补充说明
如果最终渲染时积分结果和原始正弦数据的坐标范围差异过大,可根据实际画布的坐标系要求做统一的缩放、偏移处理,不要在积分计算逻辑中硬编码固定的缩放系数。
内容的提问来源于stack exchange,提问作者Felix Götz
相关产品推荐
相关产品推荐

