基于Eigen库的多项式曲线拟合实现(最小二乘法)

本文介绍基于Eigen库的多项式曲线拟合实现(最小二乘法)。

1.基础知识

1)范德蒙矩阵

范德蒙矩阵是一个n*m的矩阵,定义为

V= \begin{pmatrix} 1 & x_1 & x_1^2 & \dots & x_1^{m-1}\\ 1 & x_2 & x_2^2 & \dots & x_2^{m-1}\\ 1 & x_3 & x_3^2 & \dots & x_3^{m-1}\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ 1 & x_n & x_n^2 & \dots & x_n^{m-1} \end{pmatrix}

其第i 行、第j 列可以表示为x_{i}^{j-1}。范德蒙矩阵可以应用于多项式的最小二乘法。

2)最小二乘法原理

给出n个点(x_{i},y_{i})i=1,2,3,\cdot \cdot \cdot ,n求(n-1)次多项式

p(x)=a_{n-1}x^{n-1}+a_{n-2}x^{n-2}+\cdot \cdot \cdot +a_{1}x^{1}+a_{0}

满足

\left\{\begin{matrix} p(x_{1})=a_{n-1}x_{1}^{n-1}+a_{n-2}x_{1}^{n-2}+\cdot \cdot \cdot +a_{1}x_{1}^{1}+a_{0}\\ p(x_{2})=a_{n-1}x_{2}^{n-1}+a_{n-2}x_{2}^{n-2}+\cdot \cdot \cdot +a_{1}x_{2}^{1}+a_{0} \\ \cdot \\ \cdot \\ \cdot \\ p(x_{n})=a_{n-1}x_{n}^{n-1}+a_{n-2}x_{n}^{n-2}+\cdot \cdot \cdot +a_{1}x_{n}^{1}+a_{0} \end{matrix}\right.

将上面的线性方程组写成矩阵的形式为Aa=y,A为n*n阶范德蒙矩阵。若点数大于待求变量个数,需对矩阵做适当变形

A^{T}Aa=A^{T}y

a=(A^{T}A)^{-1}A^{T}y

a就是我们要求的多项式的系数。

2.Eigen库

Eigen库是用C++编写的线性代数库,实现了线性代数以及矩阵分析中所有的计算方法。使用它可以很方便的实现矩阵运算。

Eigen库的下载地址:​​​​​​https://eigen.tuxfamily.org/index.php?title=Main_Page

Eigen库教程地址:https://eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html

我这边下载的是“eigen-3.4.0”,使用时将目录下的“Eigen”目录拷贝到工程目录下,在开发环境中添加此目录即可。这里给出一个测试程序测试环境是否正常。

#include <iostream>
#include <Eigen/Dense>
 
int main()
{
    Eigen::MatrixXd m(2, 2);

    m(0, 0) = 1;
    m(1, 0) = 2;
    m(0, 1) = 3;
    m(1, 1) = 4;
    std::cout << "matrix m:\n" << m << std::endl;

    return 0;
}

程序正常编译,输出即可。

3.实现

根据上面的公式,使用Eigen提供的类可轻松实现,参考代码如下:

static bool LeastSquareMethod(Eigen::VectorXf &x, Eigen::VectorXf &y, uint8_t orders, Eigen::VectorXf &coeffs)
{
    Eigen::MatrixXf mtxVandermonde(x.size(), orders + 1);   // Vandermonde matrix of X-axis coordinate vector of sample data
    Eigen::VectorXf vectColVandermonde = x;                 // Vandermonde column
    Eigen::VectorXf vectResult;

    if ((x.size() < 2) || (y.size() < 2) || (x.size() != y.size()) || (orders < 1))
    {
        return false;
    }

    mtxVandermonde.col(0) = Eigen::VectorXf::Constant(x.size(), 1, 1);
    mtxVandermonde.col(1) = vectColVandermonde;

    // construct Vandermonde matrix column by column
    for (int32_t i = 2; i < orders + 1; i++)
    {
        vectColVandermonde = vectColVandermonde.array() * x.array();
        mtxVandermonde.col(i) = vectColVandermonde;
    }

    // calculate coefficients vector of fitted polynomial
    coeffs = (mtxVandermonde.transpose() * mtxVandermonde).inverse() * mtxVandermonde.transpose() * y;

    return true;
}

其中,

x为输入值

y为输出值

coeffs为计算的参数值

4.测试

int main()
{
    Eigen::VectorXf x(5);
    Eigen::VectorXf y(5);

    x(0) = 1;
    x(1) = 2;
    x(2) = 3;
    x(3) = 4;
    x(4) = 5;

    y(0) = 3;
    y(1) = 5;
    y(2) = 8;
    y(3) = 9;
    y(4) = 12;

    Eigen::VectorXf coeffs;
    LeastSquareMethod(x, y, 3, coeffs);

    cout << "The coefficients vector is: \n" << endl;
    for (int32_t i = 0; i < coeffs.size(); i++)
    {
        cout << "coeffs" << i << ": " << coeffs(i) << endl;
    }

    return 0;
}

结果:

作为比较,我们在Matlab中采用同样的数据进行计算可得:

可见,结果还是比较相近的。

总结,本文介绍了基于Eigen库的多项式曲线拟合实现(最小二乘法)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/512658.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【智能算法】蜜獾算法(HBA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;FA Hashim等人受到自然界中蜜獾狩猎行为启发&#xff0c;提出了蜜獾算法&#xff08;(Honey Badger Algorithm&#xff0c;HBA&#xff09;。 2.算法原理 2.1算法思想 蜜獾以其…

上传苹果IPA安装包的注意事项与技巧:确保顺利通过审核

目录 引言 摘要 第二步&#xff1a;打开appuploader工具 第二步&#xff1a;打开appuploader工具&#xff0c;第二步&#xff1a;打开appuploader工具 第五步&#xff1a;交付应用程序&#xff0c;在iTunes Connect中查看应用程序 总结 引言 在将应用程序上架到苹果应用商…

权限问题(Windows-System)

方法&#xff1a;用命令来写一个注册表的脚本 &#xff1f;System是最高级用户&#xff0c;但不拥有最高级权限 编写两文档&#xff1a;system.reg 和 remove.reg,代码如下&#xff1a; system.reg&#xff1a; Windows Registry Editor Version 5.00[-HKEY_CLASSES_ROOT\*…

[StartingPoint][Tier0]Dancing

Task 1 What does the 3-letter acronym SMB stand for? (3个字母的首字母缩略词SMB代表什么&#xff1f;) Server Message Block Task 2 What port does SMB use to operate at? (SMB 使用什么端口进行操作&#xff1f;) 445 Task 3 What is the service name for port…

redis持久化管理

目录 查看Redis内存使用 查看Redis内存使用 info memory 内存碎片率 内存碎片&#xff0c;如何产生 跟踪内存碎片率对理解Redis实例的资源性能是非常重要的&#xff1a; ●内存碎片率稍大于1是合理的&#xff0c;这个值表示内存碎片率比较低&#xff0c;也说明 Redis 没有发…

webapi 允许跨域

1.在Nuget安装webapi.cors 添加完会有这个包 然后在项目App_Start 目录下的WebApiConfig.cs里面添加 // Web API 配置和服务// 添加跨域设置config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

前端跨页面通信方案介绍

在浏览器中&#xff0c;我们可以同时打开多个Tab页&#xff0c;每个Tab页可以粗略理解为一个“独立”的运行环境&#xff0c;即使是全局对象也不会在多个Tab间共享。然而有些时候&#xff0c;我们希望能在这些“独立”的Tab页面之间同步页面的数据、信息或状态。这就是本文说说…

从零开始为香橙派orangepi zero 3移植主线linux——2.linux kernel

从零开始为香橙派orangepi zero 3移植主线linux——2.linux kernel 0.环境搭建补档NFS服务TFTP服务 一、linux kernel编译二、运行 0.环境搭建补档 linux kernel验证时&#xff0c;使用tftp服务从ubuntu主机下载启动更加方便&#xff0c;等到验证无误后再一次性烧写到tf卡。所以…

使用 Docker 部署 Photopea 在线 PS 工具

1&#xff09;Photopea 介绍 GitHub&#xff1a;https://github.com/photopea/photopea 官方手册&#xff1a;https://www.photopea.com/learn/ Adobe 出品的「PhotoShop」想必大家都很熟悉啦&#xff0c;但是「PhotoShop」现在对电脑配置要求越来越高&#xff0c;体积越来越大…

中兴R5300 G4服务器BMC远程管理启用防火墙设置

中兴R5300 G4服务器启用了BMC远程管理&#xff0c;为保障设备安全配置启用防火墙只放通特定维护服务器可以访问。 一、设备初始登录信息 1、中兴R5300G4服务器&#xff0c;默认BMC管理地址https//192.168.5.7 2、中兴zteroot用户的默认密码为&#xff1a;Superuser9! 二、…

python文件处理:解析docx/word文件文字、图片、复选框

前言 因为一些项目原因&#xff0c;我需要提供解析docx内容功能。本来以为这是一件比较简单的工作&#xff0c;没想到在解析复选框选项上吃了亏&#xff0c;并且较长一段时间内通过各种渠道都没有真正解决这一问题&#xff0c;反而绕了远路。 终于&#xff0c;我在github pytho…

中颖51芯片学习1. 系统时钟及IO口输出操作

中颖51芯片学习1. 系统时钟及IO口输出操作 一、芯片介绍1. 规格2. 资源3. 中断源&#xff1a;4. 方框图5. 封装&#xff08;1&#xff09;32脚LQFP封装&#xff08;2&#xff09;28脚SOP封装&#xff08;3&#xff09;20脚SOP封装 二、开发环境搭建1. 安装keil2. 安装中颖keil插…

【管理咨询宝藏47】AA银行风险管理体系提升分析报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏47】AA银行风险管理体系提升分析报告 【格式】PPT版本&#xff0c;可编辑 【关键词】战略规划、商业分析、管理咨询 【强烈推荐】这是一套市面上…

Java入门基础day27

day27 接口 package com.saas; ​ public interface MyInterface { ​int NUM 100; ​public void test(); } package com.saas; ​ public class MyClass01 extends Object implements MyInterface{ ​int NUM 200; ​Overridepublic void test() {System.out.println(NUM)…

一文解析智慧城市,人工智能技术将成“智”理主要手段

长期以来&#xff0c;有关智慧城市的讨论主要围绕在技术进步方面&#xff0c;如自动化、人工智能、数据的公开以及将更多的传感器嵌入城市以使其更加智能化。实际上&#xff0c;智慧城市是一个关于未来的设想&#xff0c;其重要原因在于城市中存在各种基础设施、政治、地理、财…

鸿蒙开发-ArkTS语言-并发

鸿蒙开发-UI-交互事件-键鼠事件 鸿蒙开发-UI-交互事件-焦点事件 鸿蒙开发-UI-交互事件-手势事件 鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 文章目录 前言 一、并发概述 二、异步并发开发 1. 异步并发概述 1.1 Promise 1.2 async/await 2. 单次…

【HTML】制作一个简单的三角形动态图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML和CSS代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文件名改为[index.html]&#xff0c;CSS的文件名…

llama.cpp运行qwen0.5B

编译llama.cp 参考 下载模型 05b模型下载 转化模型 创建虚拟环境 conda create --prefixD:\miniconda3\envs\llamacpp python3.10 conda activate D:\miniconda3\envs\llamacpp安装所需要的包 cd G:\Cpp\llama.cpp-master pip install -r requirements.txt python conver…

JavaScript 对象管家 Proxy

JavaScript 在 ES6 中&#xff0c;引入了一个新的对象类型 Proxy&#xff0c;它可以用来代理另一个对象&#xff0c;并可以在代理过程中拦截、覆盖和定制对象的操作。Proxy 对象封装另一个对象并充当中间人&#xff0c;其提供了一个捕捉器函数&#xff0c;可以在代理对象上拦截…

什么是ECC?ECC 和 RSA 之间有何区别?

椭圆曲线密码学 (ECC) 是一种基于椭圆曲线数学的公开密钥加密算法。 它提供了一种执行密钥交换、数字签名和加密等加密操作的安全方式。 ECC 为 1977 年首次发布的 Rivest-Shamir-Adleman (RSA) 加密算法提供了一种替代性方案。 继续阅读&#xff0c;进一步了解椭圆曲线密码学…