C++使用Alglib数学库进行非线性最小二乘拟合

目录

一、前言

二、主要函数分析

2.1 lsfitcreatef

2.2 lsfitsetcond

2.3 lsfitfit

 2.4 lsfitresults

三、基础代码实现

3.1 定义待拟合函数

3.2 数据拟合

四、可视化代码实现

4.1 拟合h文件

4.2 拟合cpp文件

4.2 代码实验


一、前言

本文记录基于Alglib进行非线性最小二乘拟合的实现方法。此外借用qwt图表库进行图表部分的显示。具体qwt配置方法可见之前写的文章——QWT+Qt Creator+MSVC的配置与使用。Alglib 是一个广泛应用于数值分析和数据处理的 C++ 库,它提供了丰富的数学函数和算法,涵盖了多个领域。

开发环境:

Qt版本:Qt 5.12.0

Qt Creator版本:Qt Creator 4.8.0

MSVC版本:MSVC 2017_64

QWT版本:QWT 6.3.0

Alglib版本:ALGLIB 4.03.0

二、主要函数分析

2.1 lsfitcreatef

alglib::lsfitcreatef 函数属于 Alglib 库中的最小二乘拟合(Least Squares Fitting)相关模块。它的主要作用是初始化一个最小二乘拟合的任务状态,为后续进行具体的拟合计算做准备,比如通过后续调用其他相关函数来完成诸如线性拟合、非线性拟合等不同类型的最小二乘拟合操作,以找到最适合给定数据点的函数模型参数。

void lsfitcreatef(const real_2d_array &x,     //自变量x,二维数组const real_1d_array &y,     //因变量y,一维数组const real_1d_array &c,     //参数c,一维数组const double diffstep,      //数值微分步长lsfitstate &state,          //库中专门定义的用于记录最小二乘拟合任务状态信息的一种类型const xparams _xparams = alglib::xdefault);

其中自变量x是一个二维数组,如果要拟合的函数是多元函数, 则每一列代表一个自变量数据。const xparams _xparams是库中定义的一种参数结构体类型,它用于传递一些额外的、与自变量相关的配置参数或者约束条件等信息,这些信息有助于更精细地定制最小二乘拟合任务,使其能更好地适应不同的应用场景和数据特点。

2.2 lsfitsetcond

alglib::lsfitsetcond的主要作用是设定非线性最小二乘拟合的停止条件。

void lsfitsetcond(const lsfitstate &state,     //它指代一个用于存储算法状态的结构。const double epsx,           //基于迭代过程中一些向量的欧几里得范数(Euclidian norm)来定义停止条件的关键参数。const ae_int_t maxits,       //它代表最大迭代次数。const xparams _xparams = alglib::xdefault);

2.3 lsfitfit

alglib::lsfitfit函数主要用于启动非线性拟合器的迭代过程。在非线性最小二乘拟合等相关任务中,通过调用这些函数,并传入相应的参数,就能驱动拟合算法依据给定的数据和相关计算规则不断迭代,以找到合适的拟合参数,使得拟合函数尽可能好地符合实际的数据情况。

void lsfitfit(lsfitstate &state,        //它指代一个用于存储算法状态的结构。void (*func)(const real_1d_array &c, const real_1d_array &x, double &func, void *ptr),void  (*rep)(const real_1d_array &c, double func, void *ptr) = NULL,void *ptr = NULL,const xparams _xparams = alglib::xdefault);
  • void (*func)是一个回调函数(callback),用于计算给定自变量 x 处的函数值。
  • void (*rep)是一个可选的回调函数,它会在每次迭代完成后被调用。其作用主要是用于在迭代过程中做一些额外的信息记录、状态展示或者用户自定义的一些与迭代相关的操作等。同样是一个回调函数,它的作用是在给定自变量 x 处,既要计算出函数(或价值函数)值,还要计算出函数关于待拟合参数的梯度(gradient )值。
  • *ptr是一个可选的指针,它可以被传递给这些回调函数。

 2.4 lsfitresults

alglib::lsfitresults的作用是获取关于非线性最小二乘拟合所得到的结果相关情况。

void lsfitresults(const lsfitstate &state, ae_int_t &info, real_1d_array &c, lsfitreport &rep,         //这是一个包含了多个字段的结构体,用于呈现关于此次优化(拟合)的详细报告信息,const xparams _xparams = alglib::xdefault);

Info 参数:

  • 不同的取值对应不同的拟合结果状态,具体含义如下:
  • -8 值:表示优化器在目标函数和 / 或其梯度中检测到了 NAN(非数字,比如 0/0 等情况会出现)或者 INF(无穷大,像对数函数中自变量取不恰当值时可能出现)这样的异常值。
  • -7 值:意味着梯度验证失败了。
  • -3 值:表示存在不一致的约束条件。
  • 2 值:代表相对步长不再超过 EpsX 这个设定值了。
  • 5 值:说明已经执行了 MaxIts 步(最大迭代次数)的迭代操作。
  • 7 值:表示设定的停止条件太严格了,进一步的拟合改进已经变得不可能。

三、基础代码实现

3.1 定义待拟合函数

void function_cx_1_func(const real_1d_array &c, const real_1d_array &x, double &func, void *ptr)
{func = exp(-c[0]*pow(x[0],2));
}

3.2 数据拟合

//引入原始数据
real_2d_array x = "[[-1],[-0.8],[-0.6],[-0.4],[-0.2],[0],[0.2],[0.4],[0.6],[0.8],[1.0]]";
real_1d_array y = "[0.223130, 0.382893, 0.582748, 0.786628, 0.941765, 1.000000, 0.941765, 0.786628, 0.582748, 0.382893, 0.223130]";
//参数值猜想
real_1d_array c = "[0.3]";
//拟合参数设定
double epsx = 0.000001;
ae_int_t maxits = 0;
lsfitstate state;
lsfitreport rep;
double diffstep = 0.0001;
alglib::ae_int_t info = 5;
//进行非线性拟合
alglib::lsfitcreatef(x, y, c, diffstep, state);
alglib::lsfitsetcond(state, epsx, maxits);
alglib::lsfitfit(state, function_cx_1_func);
alglib::lsfitresults(state,info, c, rep);

四、可视化代码实现

4.1 拟合h文件

注:MyQWTChart类为基于QWT实现的自定义类。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QVector>
#include <QHBoxLayout>
#include "Dependence/alglib/alglibinternal.h"
#include "Dependence/alglib/ap.h"
#include "Dependence/alglib/interpolation.h"
#include "Dependence/alglib/linalg.h"
#include "Dependence/alglib/optimization.h"
#include "MyQWTChart.h"namespace Ui {
class MainWindow;
}
using namespace alglib;
class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();MyQWTChart* m_pSourceQwt;MyQWTChart* m_pFitQwt;QHBoxLayout* m_pLayout;QVector<double> m_vSourceX;QVector<double> m_vSourceY;QVector<double> m_vFitX;QVector<double> m_vFitY;
private slots:void on_pb_Fit_clicked();private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H

4.2 拟合cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);m_pSourceQwt = new MyQWTChart(this,"X","Y");m_pSourceQwt->AddCurve("原始数据",MyQWTChart::e_Ellipse,Qt::blue);m_pFitQwt = new MyQWTChart(this,"X","Y");m_pFitQwt->AddCurve("拟合曲线",MyQWTChart::e_Line,Qt::red);m_pLayout = new QHBoxLayout;m_pLayout->addWidget(m_pSourceQwt);m_pLayout->addWidget(m_pFitQwt);ui->gb_Show->setLayout(m_pLayout);
}MainWindow::~MainWindow()
{delete ui;
}
void function_cx_1_func(const real_1d_array &c, const real_1d_array &x, double &func, void *ptr)
{func = exp(-c[0]*pow(x[0],2));
}
void MainWindow::on_pb_Fit_clicked()
{m_vSourceX.clear();m_vSourceY.clear();real_2d_array x = "[[-1],[-0.8],[-0.6],[-0.4],[-0.2],[0],[0.2],[0.4],[0.6],[0.8],[1.0]]";real_1d_array y = "[0.223130, 0.382893, 0.582748, 0.786628, 0.941765, 1.000000, 0.941765, 0.786628, 0.582748, 0.382893, 0.223130]";for(int i=0;i<x.rows();i++){m_vSourceX.push_back(x[i][0]);m_vSourceY.push_back(y[i]);}real_1d_array c = "[0.3]";double epsx = 0.000001;ae_int_t maxits = 0;lsfitstate state;lsfitreport rep;double diffstep = 0.0001;alglib::ae_int_t info = 5;alglib::lsfitcreatef(x, y, c, diffstep, state);alglib::lsfitsetcond(state, epsx, maxits);alglib::lsfitfit(state, function_cx_1_func);alglib::lsfitresults(state,info, c, rep);m_vFitX.clear();m_vFitY.clear();for(int i=1;i<=2000;i++){double x = double(i/1000.0)-1;m_vFitX.push_back(x);alglib::real_1d_array xData;xData.setlength(1);xData[0] = x;double y;function_cx_1_func(c,xData,y,NULL);m_vFitY.push_back(y);}m_pFitQwt->SetData(0,m_vFitX,m_vFitY);m_pSourceQwt->SetData(0,m_vSourceX,m_vSourceY);
}

4.2 代码实验

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot汽车世界:资讯与技术的交汇

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

算法--“找零方案”问题

def main():d [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1.0] # 存储各种硬币的面值d_num [] # 存储每种硬币的数量total_money 0 # 收银员拥有的总金额# 输入每种硬币的数量temp input(请输入每种零钱的数量&#xff08;以空格分隔&#xff09;:)d_num0 temp.split() # 以空…

【UGUI】Unity 背包系统实现02:道具信息提示与显示

在游戏开发中&#xff0c;背包系统是一个常见的功能模块&#xff0c;用于管理玩家拾取的物品。本文将详细介绍如何在 Unity 中实现一个简单的背包系统&#xff0c;包括道具信息的提示和显示功能。我们将通过代码和场景搭建来逐步实现这一功能。 1. 功能需求清单 在实现背包系…

java基础概念31:常见API-Runtime

一、Runtime类常用方法 Runtime&#xff1a;表示当前虚拟机JVM的运行环境&#xff0c;只能有一个。 【注意】&#xff1a; 获取Runtime对象&#xff0c;只能通过getRuntime静态方法。 好处&#xff1a;不管在哪个类中调用Runtime方法&#xff0c;获取的都是同一个对象。即&…

SpringBoot 之整合gRPC

父工程中引入基本的依赖&#xff1a; <modules><module>api</module><module>client</module><module>service</module></modules><parent><artifactId>spring-boot-starter-parent</artifactId><group…

高性能linux服务器运维实战 运维深入实践

用户权限管理 用户与用户组 用户与角色分类 用户是根据角色定义的。可分三类用户角色&#xff0c;root用户&#xff0c;普通用户&#xff0c;虚拟用户 虚拟用户实际不存在&#xff0c;只是为了方便管理&#xff0c;满足进程或文件的属主需求 用户和组配置文件 /etc/passw…

景联文科技:以全面数据处理服务推动AI创新与产业智能化转型

数据标注公司在人工智能领域扮演着重要角色&#xff0c;通过提供高质量的数据标注服务&#xff0c;帮助企业和组织训练和优化机器学习模型。从需求分析到数据交付&#xff0c;每一个步骤都需要严格把控&#xff0c;确保数据的质量和安全性。 景联文科技是一家专业的数据采集与标…

上市公司企业研发操纵数据集(2008-2023年)

一、数据介绍&#xff1a;参考《财会月刊》苑泽明&#xff08;2020&#xff09;老师的做法&#xff0c;具体模型如下所示&#xff0c;TA 为总资产&#xff1b;RD 为研发支出&#xff1b;MV 为企业市值取对数&#xff1b;TBQ 为企业托宾 Q值&#xff1b;INT 为营业利润&#xff…

Maven的下载安装及配置

一、下载Maven 1、访问Maven官网&#xff1a; 打开浏览器&#xff0c;访问Maven的官方网站&#xff1a;Download Apache Maven – Maven 2、选择Maven版本&#xff1a; 在下载页面上&#xff0c;选择适合您操作系统的Maven版本。通常&#xff0c;Maven提供二进制zip归档和tar…

ISCTF 2024 web

ISCTF 2024 web 小蓝鲨的冒险 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__); $a "isctf2024"; $b $_GET["b"]; parse_str($b); echo "小蓝鲨开始闯关&#xff0c;你能帮助他拿到flag吗?<br>"; if ($a…

Loopy为何成为IP联名新顶流,如何赋能品牌营销新高度?

在当今竞争激烈的市场环境中&#xff0c;跨界合作已成为品牌营销的重要策略之一。一个成功的跨界合作案例&#xff0c;便是Loopy IP与多个品牌的深度合作。这只来自韩国动画片《小企鹅Pororo》中的配角&#xff0c;凭借一套打工人表情包在中国社交网络迅速走红&#xff0c;并逐…

Mendix 创客访谈录|Mendix 助力西门子原生数字化工厂精益高效

本期创客 向宇轩 西门子数控&#xff08;南京&#xff09;有限公司 数字化工程师 大家好&#xff0c;我是向宇轩。专业背景是计算机科学与技术&#xff0c;毕业后加入西门子数控&#xff08;南京&#xff09;有限公司&#xff08;SNC&#xff09;担任数字化工程师的职务&#x…

C++ —— string类(上)

目录 string的介绍 string类功能的使用介绍 constructor —— 构造 介绍使用&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;4&#xff09; &#xff1a;构造、拷贝构造、带参构造 介绍&#xff08;3&#xff09;&#xff1a;拷贝string类对象的一部分字符…

关于Qt C++中connect的几种写法

目录 1. 传统的槽函数写法 2. 使用函数指针的connect写法&#xff08;5.0&#xff09; 3. Lambda表达式作为槽函数&#xff08;C11&#xff09; 4.使用QOverload选择重载信号的写法 这connect函数就像是编程世界里的“茴”字&#xff0c;千变万化&#xff0c;各有千秋。咱们…

(二)PyTorch简要教学

文章目录 PyTorch教学一、训练一个神经网络二、用PyTorch是怎么去做的&#xff08;一&#xff09;Dataset & DataLoader&#xff08;二&#xff09;Tensors&#xff08;1&#xff09;Tensor是什么&#xff08;2&#xff09;怎么获得Tensor&#xff08;3&#xff09;Tensor相…

GRPC实现

1.首先下载对应编译插件&#xff0c;这里不再提供下载 2.编写proto文件 3.编写完成用命令生成go文件 protoc --go_out. --go-grpc_out. *.proto --go_out. 其中的. 是说你要编译的 .proto 文件目录为当前目录&#xff0c;按需修改 --go-grpc_out.&#xff0c;其中的. 是说你生…

Path does not exist: file:/D:/pythonProject/spark/main/datas/input/u.data

出现标题中的错误原因可能是&#xff1a; 1.文件路径书写错误&#xff1b; 2.文件本身不存在。 从图中可以看出&#xff0c;数据源文件是存在的&#xff0c;但是读取不到文件&#xff0c;说明代码中的文件路径写错了&#xff0c;从报错的结果可以看出&#xff0c;python在D:/…

Wallpaper壁纸制作学习记录01

导入图像 打开wallpaper软件&#xff0c;找到下方的播放列表&#xff0c;选择壁纸编辑器。 弹出下列界面&#xff0c;在创建壁纸处可以选择图片拖入。 在开始导入任何图像之前&#xff0c;请首先确保主背景图像表示实际屏幕分辨率。展示示例图像是 1920 x 1080&#xff0c;这…

【知识科普】统一身份认证CAS

什么是CAS 综合概述一、CAS概述二、CAS的组成与工作原理三、CAS的特性与支持四、CAS的应用场景 示例展示场景设定CAS认证过程 其他认证细节CAS认证过程的细节CAS认证过程的特性 参考文献 综合概述 统一身份认证CAS&#xff08;Central Authentication Service&#xff09;&…

计算机网络-MSTP工作原理

前面大致学习了MSTP基础概念与组成&#xff0c;今天来了解MSTP的工作原理。 一、MSTP拓扑计算&#xff1a; MSTP可以将整个二层网络划分为多个MST域&#xff0c;各个域之间通过计算生成CST&#xff0c;域内生成IST&#xff0c;CST和IST构成了整个交换设备网络的CIST。 域内还可…