我有一组 XY 值(即散点图),我想要一个 Pascal 例程来生成适合这些点的 N 阶多项式的系数,就像 Excel 所做的那样。
5 回答
我使用了 David J Taylor 的 Polyfit 示例 (curvefit.zip),它实现了最小二乘曲线拟合算法(也称为线性回归),David 的网站在这里,但请继续阅读,因为我的版本更好。(见下文)。
David 使用的算法的起源是一本关于 Pascal 程序员科学数学的书,Allen Miller 的 Curve Fitting routines 来自“Pascal Programs For Scientists And Engineers”一书,由 Juergen Loewner 于 1982 年 10 月键入并提交给 MTPUG,并更正了并由 Jeff Weiss 改编为 Turbo Pascal。
您可以在此处直接从 bitbucket 获取 curvefit.zip 。(您可以使用 Mercurial/TortoiseHG 克隆源代码,或从 bitbucket 下载 ZIP)
hg clone https://bitbucket.org/wpostma/curvefit curvefit
它可以在任何 delphi 版本 5 及更高版本中运行,无论是否为 Unicode,甚至是 Delphi 10 Berlin。它在演示中有一个小图表,由我添加。我还添加了一种通过原点强制结果的方法,这是一种常见的技术,您希望除常数项之外的所有值都得到最佳拟合,应该将其强制为零或某些实验得出的平均值。强制“空白减法”设置为等于一系列分析“零样本”的平均值,在某些类型的分析化学中与某些类型的仪器一起使用时很常见,在其他科学案例中,它可能更多比最佳拟合有用,因为您可能希望尽量减少原点周围的误差,而不是尽量减少距离原点最远的曲线区域的误差。
我还应该澄清一下,出于线性回归的目的,“曲线”也可能是一条线,这是我分析化学目的所需的情况,并且任何直线的方程 (y=mx+b) 也称为“校准曲线”。一阶曲线拟合是一条线(y = mx +b),二阶曲线拟合(如图所示)是抛物线(y = nX^2 + mX + b)。正如您可能猜到的那样,此算法可以从一阶扩展到您可能希望的任何级别。不过,我还没有测试过它超过 8 个术语。
这是一个屏幕截图:
Bitbucket 项目链接:
尝试 TPMath http://tpmath.sourceforge.net/ - 我多年来一直使用它来拟合山回归,并且可以推荐它。
检查Turbo Power 的 SysTools 库中的函数,现在是开源的,它包含单元 StStat 中的数学函数。
即使您已经给出了答案,但为了完整起见,我想我会添加以下内容:
我们使用 SDL Components 的数学包并且对它非常满意。
http://www.lohninger.com/delfcomp.html
这是经过深思熟虑的,并且完全符合我们的需要。
他的网站上有许多其他有趣的工具。
XlXtrFun是我所知道和使用的最好的曲线拟合,但它适用于 Excel: