Open CASCADE学习|最小二乘法拟合直线

news2024/11/17 23:56:18

最小二乘法,又称最小平方法,起源于十八世纪的大航海探索时期,发展于天文领域和航海领域。其历史可以追溯到法国科学家马里·勒让德于1805年首次提出这一概念,而1809年,高斯在他的著作《天体运动论》中也提出了最小二乘法,并发表了应用该方法计算谷神星轨道的结果。奥地利天文学家海因里希·奥尔伯斯根据高斯计算出来的轨道重新发现了谷神星,这进一步验证了最小二乘法的有效性。此后,高斯在1829年证明了最小二乘法的优化效果强于其他方法,这被称为高斯-马尔可夫定理。

在发展过程中,最小二乘法逐渐形成了两类基本算法:传统的一次完成算法和最小二乘递推算法。前者具体方法视所用输入信号而定,常见的输入信号有随机序列、伪随机序列等。后者更易于在微机上实现,适用于参数在线辨识。

然而,最小二乘法在应用中并非完美无缺。由于它基于最小化误差平方和的原理,因此在处理含有随机特性的系统时,可能会引进偏差,且易受到噪声的干扰,导致精度不佳。只有在方程中只拥有白噪声误差时,其算法精度才能达到理想状态。

尽管存在这些挑战,但最小二乘法仍被广泛应用于误差估计、曲线拟合、参数辨识、预测、预报等领域。此外,随着技术的发展,最小二乘法也在不断地改进和优化,以适应更广泛和复杂的应用场景。​

利用最小二乘法拟合曲线的一般步骤是:

  1. 将实验数据显示出来,分析曲线的形式;

  2. 确定拟合曲线的形式。对于本文来说,曲线形式是直线,y=a+bx;

  3. 建立法方程组并对其进行求解;

#include <iostream>#include <gp_Lin2d.hxx>#include <gp_Pnt2d.hxx>#include <TColgp_Array1OfPnt2d.hxx>#include <math_Vector.hxx>#include <math_SVD.hxx>#include <math_Gauss.hxx>#include <math_GaussLeastSquare.hxx>#include <OSD_Chronometer.hxx>void fitLine(const TColgp_Array1OfPnt2d& thePoints,             const std::string& theFileName,             gp_Lin2d& theLine){    math_Vector aB(1, 2, 0.0);    math_Vector aX(1, 2, 0.0);    math_Matrix aM(1, 2, 1, 2);    Standard_Real aSxi = 0.0;    Standard_Real aSyi = 0.0;    Standard_Real aSxx = 0.0;    Standard_Real aSxy = 0.0;    std::ofstream aDrawFile(theFileName);    for (Standard_Integer i = thePoints.Lower(); i <= thePoints.Upper(); ++i)    {        const gp_Pnt2d& aPoint = thePoints.Value(i);        aSxi += aPoint.X();        aSyi += aPoint.Y();        aSxx += aPoint.X() * aPoint.X();        aSxy += aPoint.X() * aPoint.Y();        aDrawFile << "vpoint p" << i << " " <<                     aPoint.X() << " " << aPoint.Y() << " 0" << std::endl;    }    aM(1, 1) = thePoints.Size();    aM(1, 2) = aSxi;    aM(2, 1) = aSxi;    aM(2, 2) = aSxx;    aB(1) = aSyi;    aB(2) = aSxy;    OSD_Chronometer aChronometer;    aChronometer.Start();    math_Gauss aSolver(aM);    //math_GaussLeastSquare aSolver(aM);    //math_SVD aSolver(aM);    aSolver.Solve(aB, aX);    if (aSolver.IsDone())    {        Standard_Real aA = aX(1);        Standard_Real aB = aX(2);        gp_Pnt2d aP1(0.0, aA);        gp_Pnt2d aP2(-aA/aB, 0.0);        theLine.SetLocation(aP1);        theLine.SetDirection(gp_Vec2d(aP1, aP2).XY());        aDrawFile << "vaxis l "                  << aP1.X() << " " << aP1.Y() << " 0 "                  << aP2.X() << " " << aP2.Y() << " 0 " << std::endl;        std::cout << "===================" << std::endl;        aX.Dump(std::cout);    }    aChronometer.Stop();    aChronometer.Show();}int main(){    gp_Lin2d aLine;    // Test data 1    TColgp_Array1OfPnt2d aPoints1(1, 6);    aPoints1.SetValue(1, gp_Pnt2d(36.9, 181.0));    aPoints1.SetValue(2, gp_Pnt2d(46.7, 197.0));    aPoints1.SetValue(3, gp_Pnt2d(63.7, 235.0));    aPoints1.SetValue(4, gp_Pnt2d(77.8, 270.0));    aPoints1.SetValue(5, gp_Pnt2d(84.0, 283.0));    aPoints1.SetValue(6, gp_Pnt2d(87.5, 292.0));    fitLine(aPoints1, "fit1.tcl", aLine);    // Test data 2    TColgp_Array1OfPnt2d aPoints2(0, 7);    aPoints2.SetValue(0, gp_Pnt2d(0.0, 27.0));    aPoints2.SetValue(1, gp_Pnt2d(1.0, 26.8));    aPoints2.SetValue(2, gp_Pnt2d(2.0, 26.5));    aPoints2.SetValue(3, gp_Pnt2d(3.0, 26.3));    aPoints2.SetValue(4, gp_Pnt2d(4.0, 26.1));    aPoints2.SetValue(5, gp_Pnt2d(5.0, 25.7));    aPoints2.SetValue(6, gp_Pnt2d(6.0, 25.3));    aPoints2.SetValue(7, gp_Pnt2d(7.0, 24.8));    fitLine(aPoints2, "fit2.tcl", aLine);    return 0;}

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

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

相关文章

LangChain核心模块 Model I/O

Model I/O 任何语言模型应用程序的核心元素都是模型。LangChain 为您提供了与任何语言模型交互的构建块。 Models llm 和 chat_model 都是表示特定模型配置的对象。 LLM 对象将字符串作为输入和输出字符串。ChatModel 对象将消息列表作为输入并输出消息。 LLM 返回一个字符…

idea创建angular项目

1.idea创建项目 idea&#xff1a;2023.2.3版本 不做赘述&#xff0c;我这里是创建模块&#xff0c;创建项目的话大同小异 2.创建完成后注意一下红色部分&#xff0c;后期需要 3.进入项目根目录 注意&#xff1a;一定要进入项目根目录&#xff0c;就是我们上面红色方框部分&a…

研华工控机610L学习笔记1:基本了解与认识

今日开始学习一些工控机的基本知识&#xff1a; 目录 目录 1、工控机介绍&#xff1a; 2、研华610L说明书参数了解&#xff1a; 3、基本结构了解&#xff1a; 前面板&#xff1a; 后窗&#xff1a; 4.RS232串口&#xff1a; ​编辑 5、工控机分类&#xff1a; 6、工控上…

第四十五周:文献阅读

目录 摘要 Abstract 文献阅读&#xff1a;基于注意力的双向LSTM和编码器-解码器的水质预测 现有问题 提出方法 创新点 方法论 1、EMD&#xff08;经验模态分解&#xff09; 2、VMD&#xff08;变分模态分解&#xff09; 3、VBAED模型 研究实验 数据集 数据预处理 …

AC和AP wlan使用案例

关于AC和AP的一篇 拓补图&#xff1a; AC1 sysn AC vlan 10int g0/0/1 p l t p t a v 10 port trunk pvid vlan 10 q int g0/0/2 p l t p t a v 10 port trunk pvid vlan 10 q int vlan 10 ip add 192.168.10.1 24 q dhcp enable int vlan 10 dhcp select interface q capwa…

算法打卡day24|回溯法篇04|Leetcode 93.复原IP地址、78.子集、90.子集II

算法题 Leetcode 93.复原IP地址 题目链接:93.复原IP地址 大佬视频讲解&#xff1a;复原IP地址视频讲解 个人思路 这道题和昨天的分割回文串有点类似&#xff0c;但这里是限制了只能分割3次以及分割块的数字大小&#xff0c;根据这些不同的条件用回溯法解决就好啦 解法 回溯…

三.寄存器(内存访问)

1.内存中字的存储 2.并不是所有cpu都支持将数据段送入段寄存器&#xff0c;所以有时候用个别的寄存器先把数据段存储起来&#xff0c;再把该寄存器mov到段寄存器。 3.字的传送 4.栈 5.栈机制 举例说明 6.栈顶超界问题 push超界 pop超界 7.栈段

管理自由,体验简单,使用安全 | 详解威联通全套多用户多权限管理方案【附TS-466C产品介绍】

管理自由&#xff0c;体验简单&#xff0c;使用安全 | 详解威联通全套多用户多权限管理方案【附TS-466C产品介绍】 哈喽小伙伴们好&#xff0c;我是Stark-C~。今天我们来解决一个之前评论区多次被提及的问题--多用户权限管理。 对于我们NAS用户来说&#xff0c;基本都会面临这…

Windows server 2008 R2 在VMware虚拟机上的安装

Windows server 2008 R2 在VMware虚拟机上的安装 准备工作VMware 新建并配置虚拟机安装和启动Windows server 2008 R2 准备工作 Windows server 2008 R2 ISO镜像的下载&#xff1a;Windows server 2008 R2 ISO VMware 新建并配置虚拟机 第一步&#xff0c;点击新建虚拟机 第…

leetcode每日一题2671

目录 一.题目原型 二.思路解析&#xff1a; 三.具体代码实现&#xff1a; 一.题目原型 二.思路解析&#xff1a; 其实我们可以用两个哈希表来解决这道题&#xff0c;一个哈希表hash1用来存这个数字出现了几次。另一个哈希表hash2用来存出现了几次的次数有几次&#xff0c;由于…

MySQL的日志:undo log、redo log、binlog有什么作用

目录 从一个update语句说起 undo log 为什么需要undo log undo log 版本链 undo log 是如何持久化到磁盘? redo log 为什么需要redo log redo的组成 redo Log的刷盘策略 redo Log循环写 crash-safe能力 binlog 为什么需要 binlog &#xff1f; binlog与redo lo…

unity学习(69)——多人位置同步

简单的很&#xff0c;每个客户端向服务器发送位置信息&#xff0c;服务器再把这些位置信息发送给其他客户端。 1.客户端发送。 1.1在SocketModel脚本中添加一个新的类MoveDTO public class MoveDTO {public string Id{get; set;}public int Dir{get;set;}public Assets.Mode…

数据分析和机器学习库Pandas的使用

Pandas 库是一个免费、开源的第三方 Python 库&#xff0c;是 Python 数据分析和机器学习的工具之一。Pandas 提供了两种数据结构&#xff0c;分别是 Series&#xff08;一维数组结构&#xff09;与 DataFrame&#xff08;二维数组结构&#xff09;&#xff0c;极大地增强的了 …

2024-Spring IOC 和 AOP源码分析(上篇)

前言&#xff1a;笔者最近面了几次大厂。。。开局Spring源码暴击 之前看过忘了写篇总结。。。 1、介绍一下Spring 核心组件&#xff1a; 常用模块&#xff1a; 常用注解&#xff1a; 2、说一下SpringIOC原理 概念&#xff1a;Spring 通过一个配置文件描述 Bean 及 Bean …

登录校验:JWT令牌、Filter、Interceptor

JWT&#xff1a; 全称&#xff1a;JSON Web Token 定义了一种简洁的、自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息&#xff0c;由于数字签名的存在&#xff0c;这些信息是可靠的。 组成&#xff1a; Header(头部)&#xff1a;&#xff08;“alg&q…

基于物理的实时渲染 -- PBR

简介 PBR&#xff0c;或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering)&#xff0c;它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。正因为基于物理的渲染目的便是为了使用一种更符合物理学规律的方式来模…

如何申请代码签名证书

代码签名证书也是数字证书的一种&#xff0c;其主要作用是对可执行脚本、软件代码和内容进行数字签名的数字证书。代码签名证书用于验证开发者身份真实性、保护代码的完整性。用户下载软件时&#xff0c;能通过数字签名验证软件来源&#xff0c;确认软件、代码没有被非法篡改或…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 1 套

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&#…

数据结构和算法:树

二叉树 与链表类似&#xff0c;二叉树的基本单元是节点&#xff0c;每个节点包含值、左子节点引用和右子节点引用。 /* 二叉树节点结构体 */ struct TreeNode {int val; // 节点值TreeNode *left; // 左子节点指针TreeNode *right; // 右子节点指针TreeNode(int x) : val(x),…

项目管理证书有何用?这些PMP考试机会一定要抓住

项目管理证书有何用&#xff1f;这些PMP考试机会一定要抓住&#xff01; PMP认证的中文全称是“项目管理专业人士资格认证”&#xff0c;是目前国际上声誉较高并且含金量比较高的项目管理证书之一&#xff0c;本人有幸考过&#xff0c;也通过PMP认证成功转岗&#xff0c;应该也…