精华内容
下载资源
问答
  • 最小二乘法拟合

    2013-10-30 14:53:50
    利用最小二乘法拟合抛物线,经过测试绝对可用
  • MATLAB程序分享求解非线性最小二乘法拟合问题源程序-MATLAB求解非线性最小二乘法拟合问题 源程序代码.rar 程序代码见附件,拿资料请顺便顶个贴~~ 如果下载有问题,请加我 qq 1530497909,给你在线传
  • 最小二乘法拟合.doc

    2021-05-14 14:45:46
    最小二乘法拟合
  • 代码实现#include#include#include#include#include#include#include#includeusingnamespacestd;.../*最小二乘法拟合平面:Ax + By + Cz + D =0*//* Parameters:返回参数A B C D *//* point:存放输入...

    代码实现

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 

    using namespace std;
    using namespace Eigen;


    /* 最小二乘法拟合平面:Ax + By + Cz + D = 0 */
    /* Parameters:返回参数A B C D */
    /* point:存放输入点 */
    bool FitPlaneByLeastSquares(pcl::PointCloud<:pointxyz>&point,vector<double>& Parameters){
        Parameters.clear();
        int count = point.size();
        if (count 3)
        {
            return false;
        }

        double meanX = 0, meanY = 0, meanZ = 0;
        double meanXX = 0, meanYY = 0, meanZZ = 0;
        double meanXY = 0, meanXZ = 0, meanYZ = 0;
        for (int i = 0; i     {
            meanX += point[i].x;
            meanY += point[i].y;
            meanZ += point[i].z;

            meanXX += point[i].x * point[i].x;
            meanYY += point[i].y * point[i].y;
            meanZZ += point[i].z * point[i].z;

            meanXY += point[i].x * point[i].y;
            meanXZ += point[i].x * point[i].z;
            meanYZ += point[i].y * point[i].z;
        }
        meanX /= count;
        meanY /= count;
        meanZ /= count;
        meanXX /= count;
        meanYY /= count;
        meanZZ /= count;
        meanXY /= count;
        meanXZ /= count;
        meanYZ /= count;

        /* eigenvector */
        Matrix3d eMat;
        eMat(00) = meanXX - meanX * meanX; eMat(01) = meanXY - meanX * meanY; eMat(02) = meanXZ - meanX * meanZ;
        eMat(10) = meanXY - meanX * meanY; eMat(11) = meanYY - meanY * meanY; eMat(12) = meanYZ - meanY * meanZ;
        eMat(20) = meanXZ - meanX * meanZ; eMat(21) = meanYZ - meanY * meanZ; eMat(22) = meanZZ - meanZ * meanZ;
        Eigen::EigenSolver<:matrix3d> PlMat(eMat);
        Matrix3d eValue = PlMat.pseudoEigenvalueMatrix();
        Matrix3d eVector = PlMat.pseudoEigenvectors();/* the eigenvector corresponding to the minimum eigenvalue */double v1 = eValue(00);double v2 = eValue(11);double v3 = eValue(22);int minNumber = 0;if ((abs(v2) <= abs(v1)) && (abs(v2) <= abs(v3)))
        {
            minNumber = 1;
        }if ((abs(v3) <= abs(v1)) && (abs(v3) <= abs(v2)))
        {
            minNumber = 2;
        }double A = eVector(0, minNumber);double B = eVector(1, minNumber);double C = eVector(2, minNumber);double D = -(A * meanX + B * meanY + C * meanZ);/* result */if (C 0)
        {
            A *= -1.0;
            B *= -1.0;
            C *= -1.0;
            D *= -1.0;
        }
        Parameters.push_back(A);
        Parameters.push_back(B);
        Parameters.push_back(C);
        Parameters.push_back(D);
        Parameters.push_back(meanX);
        Parameters.push_back(meanY);
        Parameters.push_back(meanZ);return true;
    }//  ----------------可视化,左窗口为原始点云,右窗口为根据点云拟合出来的平面--------------void visualize_pcd(pcl::PointCloud<:pointxyz>::Ptr &src, pcl::ModelCoefficients &PlaneCoff){
        boost::shared_ptr<:visualization::pclvisualizer>viewer(new pcl::visualization::PCLVisualizer("Viewer"));
        viewer->setBackgroundColor(000);int v1 = 0;int v2 = 1;
        viewer->createViewPort(000.51, v1);
        viewer->createViewPort(0.5011, v2);
        viewer->setBackgroundColor(000, v1);
        viewer->setBackgroundColor(0.0500, v2);// ---------------------点云按照z字段进行渲染--------------------
        pcl::visualization::PointCloudColorHandlerGenericField<:pointxyz> fildColor(src, "z");
        viewer->addPointCloud<:pointxyz>(src, fildColor, "sample cloud", v1);//--------------------可视化拟合的平面-----------------------
        viewer->addPlane(PlaneCoff, "Plane", v2);while (!viewer->wasStopped())
        {
            viewer->spinOnce(100);
            boost::this_thread::sleep(boost::posix_time::microseconds(100000));
        }
    }intmain(int argc, char** argv){// 加载点云
        pcl::PointCloud<:pointxyz>::Ptr cloud(new pcl::PointCloud<:pointxyz>);
        pcl::io::loadPCDFile<:pointxyz>("desk2.pcd", *cloud);
        pcl::PointCloud<:pointxyz>target;
        target.resize(cloud->points.size());
        target.width = 1;
        target.height = cloud->points.size();
        target.is_dense = false;for (size_t i = 0; i points.size(); ++i)
        {
            target[i].x = cloud->points[i].x;
            target[i].y = cloud->points[i].y;
            target[i].z = cloud->points[i].z;
        }vector<double>Coff;
        FitPlaneByLeastSquares(target, Coff);
        pcl::ModelCoefficients plane_coeff;
        plane_coeff.values.resize(4);    // We need 4 values
        plane_coeff.values[0] = Coff[0];
        plane_coeff.values[1] = Coff[1];
        plane_coeff.values[2] = Coff[2];
        plane_coeff.values[3] = Coff[3];cout <"拟合系数:" <"\n A=" <0] <"\n B=" <1] <"\n C=" <2] <"\n D=" <3] <endl;
        visualize_pcd(cloud, plane_coeff);return (0);
    }

    结果展示

    40c701bba99c3aafebb6f568aa7e211a.png

    展开全文
  • 最小二乘法拟合最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小...

    最小二乘法拟合

    最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

    假设有一组实验数据(x[i], y[i]),我们知道它们之间的函数关系:y = f(x),通过这些已知信息,需要确定函数中的一些参数项。例如,如果f是一个线型函数f(x) = k * x + b, 那么参数k和b就是我们需要确定的值。如果将这些参数组用p来表示的话, 那么我们就是需要找到一组p值使得如下公式中的S函数最小:

    这种算法被称为最小二乘法拟合。

    scipy中的子函数库optimize已经提供了实现最小二乘拟合算法的函数leastsq。下面是用leastsq进行数据拟合的一个例子。

    import numpy as np

    from scipy.optimize import leastsq

    import pylab as pl

    def func(x, p):

    """

    数据拟合所用的函数:A * sin(2 * pi * k * x + theta)

    """

    A, k, theta = p

    return A * np.sin(2 * np.pi * k * x + theta)

    def residuals(p, y, x):

    """

    实验数据x,y和拟合函数之间的差, p为拟合需要找到的系数

    """

    return y - func(x, p)

    x = np.linspace(0, -2 * np.pi, 100)

    A, k, theta = 10, 0.34, np.pi / 6 #真实数据的函数参数

    y0 = func(x, [A, k, theta]) #真实的y数据

    y1 = y0 + 2 * np.random.randn(len(x)) #加入噪声之后的数据

    p0 = [7, 0.2, 0] #第一次猜测的拟合参数

    #调用leastsq进行数据拟合

    #residuals为计算误差的函数

    #p0为拟合参数的初始值

    #args为需要拟合的实验数据

    plsq = leastsq(residuals, p0, args = (y1, x))

    print("真实参数:", [A, k, theta])

    print("拟合参数:", plsq[0]) #实验数据拟合后的参数

    pl.plot(x, y0, label = u"真实数据")

    pl.plot(x, y1, label = u"带噪声的实验数据")

    pl.plot(x, func(x, plsq[0]), label =u"拟合数据")

    pl.legend()

    pl.show()

    展开全文
  • 之前介绍了用矩阵形式最小二乘法拟合平平面的方式,这次来做用矩阵形式来拟合空间球(圆)(由于测量误差的存在,认为空间圆的测量值分布在一个球面上,且球心与空间圆心重合)。二维空间中求圆心和求球的方法相同,只是...

    最小二乘法可以很好的解决Ax=b的问题,同时,矩阵形式的最小二乘法为求解带了了非常大的便利。之前介绍了用矩阵形式最小二乘法拟合平平面的方式,这次来做用矩阵形式来拟合空间球(圆)(由于测量误差的存在,认为空间圆的测量值分布在一个球面上,且球心与空间圆心重合)。二维空间中求圆心和求球的方法相同,只是少了一个维度。

    最小二乘法使用的关键步骤为使方程线性化!

    空间球方程为

    乍一看这个方程和Ax=b相差很大,经过变形得到

    将红色部分分别记作Ax,Ay,Az,Ad(加粗则表示向量),黄色部分记作d,蓝色部分记作e(加粗则表示向量),可以得到

    写为矩阵形式为(这里的加粗大写字母表示向量而不是矩阵)

    所以又回到了最小二乘法的矩阵形式,可以获得abcd,并进一步求出r。

    最小二乘法使用的关键步骤为使方程线性化!

    使方程线性化的一般方法为:将所有不包含未知量的量全都放在方程右侧,作为b(b可被直接观测和计算到);将所有包含相同因子的未知量全部整理在一起,并将因子(常数因子和可以被观测到的量均视为因子)提出来放在前面,其中没有因子的量视作因子为1(即将x视作k*x,其中k=1),将具有相同因子的未知量视为一个新的未知量。

    这种方法是不是像状态空间控制理论中的状态变量的变换!而且方程也变为控制系统的输出方程y=Ax,其中y为系统输出,可以被观测,x为系统状态,在控制系统中可以通过设计观测器观测,获得x和y之后,可以对系统进行辨识,即获得A。

    附上测试代码

    clear all

    %确认圆心和半径

    o = [13.85 23.45 8.94];

    R = mean(o);

    %获得一系列测量点

    P = [];

    nP = [];

    for i = 1:100

    vec = [randn(1,1) randn(1,1) randn(1,1)];

    vec = vec/norm(vec) + 0.01*[randn(1,1) randn(1,1) randn(1,1)];

    P = [ P; o+R*vec; ];

    nP = [nP;norm(P(i,:)-o)];

    end

    %由P生成A(包括Ax,Ay,Az,Ad)和e

    x = P(:,1);

    y = P(:,2);

    z = P(:,3);

    Ax = -2*x;

    Ay = -2*y;

    Az = -2*z;

    Ad = 0*P(:,1) + 1;

    A = [ Ax Ay Az Ad];

    e = -x.^2 -y.^2 -z.^2;

    %求解abcd, Ax=e

    X = inv(A'*A)*A'*e;

    a = X(1)

    b = X(2)

    c = X(3)

    r2 = a^2 + b^2 + c^2 - X(4)

    r = r2^0.5

    %验证结果

    err = [a b c r] - [ o R] %结果接近0,说明结果正确

    %绘图验证

    hold on

    plot3(P(:,1),P(:,2),P(:,3),'.')

    plot3(o(1),o(2),o(3),'o')

    plot3(a,b,c,'*')

    展开全文
  • matlab 最小二乘法拟合多项式怎么进行精度的优化啊数据为clear all;clcx=[0.240951631 0.883715287 0.88708334 0.91275251 0.932122682 0.94019212 0.953360145 0.953360145];y=[6.057750...

    matlab 最小二乘法拟合多项式怎么进行精度的优化啊

    数据为clear all;clc

    x=[0.240951631        0.883715287        0.88708334        0.91275251        0.932122682        0.94019212        0.953360145        0.953360145];

    y=[6.057750782        9.607404895        9.899233358        9.53385914        10.02161975        9.675123671        9.67810687        0];

    m=7;n=6;

    A=zeros(n+1);

    for j=1:n+1

    for i=1:n+1

    for k=1:m+1

    A(j,i)=A(j,i)+x(k)^(j+i-2)

    end

    end

    end;

    B=[0 0 0 0 0 0 0];

    for j=1:n+1

    for i=1:m+1

    B(j)=B(j)+y(i)*x(i)^(j-1)

    end

    end

    a=inv(A)*B;

    x=[0.240951631        0.883715287        0.88708334        0.91275251        0.932122682        0.94019212        0.953360145        0.953360145];

    z=a(1)+a(2)*x+a(3)*x.^2+a(4)*x.^3+a(5)*x.^4+a(6)*x.^5+a(7)*x.^6;

    plot(x,z)

    legend(‘离散点’,’y=a(1)+a(2)*x+a(3)*x.^2+a(4)*x.^3+a(5)*x.^4+a(6)*x.^5+a(7)*x.^6’)

    拟合出来的精度不是很好,如何改啊,求助大神!!!!!!

    展开全文
  • 最小二乘法拟合平面,可用于散斑点拟合平面。 最小二乘法拟合平面,可用于散斑点拟合平面。 最小二乘法拟合平面,可用于散斑点拟合平面。
  • 最小二乘法拟合直线C语言,可用于采样点偏差拟合直线函数,减小误差
  • 最小二乘法拟合椭圆.pdf
  • 最小二乘法拟合原理。
  • 最小二乘法拟合原理

    2012-10-24 19:21:47
    最小二乘法拟合原理最小二乘法拟合原理最小二乘法拟合原理最小二乘法拟合原理
  • 在《高等数学》的书中给出了最小二乘法拟合直线的具体实例,但是那个例子是拟合二维直线的f(t)=at+b,那么三维直线怎么使用最小二乘法来拟合呢?我们先来看看《高等数学》书中的例子,由于任何实数的平方都是正数或...
  • 最小二乘法拟合c程序

    2017-06-09 10:30:24
    最小二乘法拟合c程序
  • 因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用。/*** 函数功能:最小二乘法曲线拟合* @param x 实型一维数组,长度为 n 。存放给定 n 个数据点的 X...
  • 主要给大家介绍了关于python中matplotlib实现最小二乘法拟合的相关资料,文中通过示例代码详细介绍了关于最小二乘法拟合直线和最小二乘法拟合曲线的实现过程,需要的朋友可以参考借鉴,下面来一起看看吧。
  • python实现最小二乘法拟合
  • 使用最小二乘法拟合出的直线和曲线,基于c++实现,为了可视化,这里借助了opencv
  • 最小二乘法拟合圆.zip

    2020-12-15 23:16:55
    matlab版图像读取, 颜色转换 ,灰度化, 二值化, 边缘检测, 进行最小二乘法拟合。将不标准圆进行拟合。获得最后的圆心坐标以及半径大小。
  • 最小二乘法 拟合 多项式 最小二乘法 拟合 多项式
  • C++最小二乘法拟合直线,根据数据直接计算直线的斜率、截距和相似度,即拟合的好坏。
  • 最小二乘法拟合曲面

    热门讨论 2011-09-11 10:15:44
    最小二乘法拟合曲面的算法和举例 用最小二乘法拟合曲面方程.pdf 可用matlab进行解线性方程组得到各项系数
  • 采用最小二乘法拟合圆曲线(matlab程序)采用最小二乘法拟合圆曲线(matlab程序)采用最小二乘法拟合圆曲线(matlab程序)采用最小二乘法拟合圆曲线(matlab程序)采用最小二乘法拟合圆曲线(matlab程序)采用最小...
  • matlab非线性最小二乘法拟合问题的matlab代码对于matlab的学习很有帮助
  • Python最小二乘法拟合直线,采用了2种不同的方式,一种是直接计算,另一种是调用numpy.linalg.solve()

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,882
精华内容 1,552
关键字:

最小二乘法拟合