【C++】【MATLAB】三元二次多项式拟合求极值点原理+代码

一、需求描述

本人最近需要对多个3维数据进行曲线的拟合,并且找到极大值点。
难点:
1.一组数据有125个点,每个点有3个坐标值(x,y,z),以及一个对应的得分值t。x,y,z范围不限,t的范围是0到1。
2.得用C++语言去实现本人的需求,因此在做拟合工作时不能直接简单调用MATLAB的Curve Fitting工具包,得自己明确具体的求解公式然后用C++实现。
本博客提供本人的求解思路以及具体代码,供参考。

二、求解思路

1.确定多项式

要想求极值点,首先要对拿到手的数据做曲线拟合,然后再求极值点。
一般使用的待拟合的函数就是多项式函数,而且本人的数据是越靠近中心,结果值越接近于1,所以就自然地使用二次多项式。
具体地表达式如下:

t=a0*x^2+a1*y^2+a2*z*2+a3*x*y+a4*x*z+a5*y*z+a6*x+a7*y+a8*z+a9

其中t代表得分值,x,y,z代表每个点的坐标值;而a0到a9就是需要利用已知的数据来求解出来的系数。

2.确定待定系数

如何确定这些系数?我们的目标很简单,让拟合出来的函数在已知的坐标点上的函数值和真实的得分值差距越小越好。
所以可以构建一个平方差的损失函数,对于每个点的损失函数公式如下:

Error = [ti-(a0*xi^2+a1*yi^2+a2*zi*2+a3*xi*yi+a4*xi*zi+a5*yi*zi+a6*xi+a7*yi+a8*zi+a9)]^2

那么所有点的损失函数就是将所有点的error累加起来即可。

那么如何找到合适的系数值让上述的损失函数最小?
根据高等数学的多元函数极值理论,在极值点对每个变量的偏导数为0。
对于上面的式子来说,每个系数最高次数是2次,经过求导之后最高只有1次,所以令所有的偏导数为0之后只有唯一的一组解。

令所有的偏导数为0,可以得到9组方程,并且转化为矩阵相乘的形式,如下图所示:
请添加图片描述
再通过逆矩阵的运算便可求解得到10个待定系数的值。

3.确定极大值点

在上一步确定待定系数之后,对于多项式求它的极值点的方法仍然令一阶偏导数为0来确定极值点的坐标,如下图所示:
请添加图片描述

最终就可以求解到极大值点的坐标了。

三、实现代码

本人将MATLAB和C++版本的代码都放到本人在Github上三元二次多项式求极值点的仓库中去了,可以按照注释去理解本人的实现。
欢迎点赞和转发,有问题的Github项目下提交你的Issue。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值