MATLAB最小二乘法拟合高次曲面

前言

1. **函数文件源码** :

2. **解决上述问题**

3. **生成源代码**

前言

引用来引用去实在没意思(http://blog.sina.com.cn/s/blog_8702e2b60102x4qg.html),看到的很多最小二乘法拟合曲面方程基本都是基于这样的一个方程,代码也没有什么大的改动。只是应用的时候确实存在很多问题,不太适合实际的问题。

简单分析一下上述参考的源码存在的一些问题。

1. 函数文件源码 :

function [a0, a1, a2, a3, a4, a5] = least_square_surface(x,y,z)

% 初始化矩阵

A = zeros(6,6);

B = zeros(6,1);

% 矩阵赋值(根据最小二乘法对最小二乘矩阵赋值)

for i=1:length(x)

for j = length(y)

A(1,1) = 1+A(1,1);

A(1,2) = x(i,j)+A(1,2);

A(1,3) = y(i,j)+A(1,3);

A(1,4) = x(i,j)^2+A(1,4);

A(1,5) = x(i,j)*y(i,j)+A(1,5);

A(1,6) = y(i,j)^2+A(1,6);

A(2,1) = x(i,j)+A(2,1);

A(2,2) = x(i,j)^2+A(2,2);

A(2,3) = x(i,j)*y(i,j)+A(2,3);

A(2,4) = x(i,j)^3+A(2,4);

A(2,5) = x(i,j)^2*y(i,j)+A(2,5);

A(2,6) = x(i,j)*y(i,j)^2+A(2,6);

A(3,1) = y(i,j)+A(3,1);

A(3,2) = x(i,j)*y(i,j)+A(3,2);

A(3,3) = y(i,j)^2+A(3,3);

A(3,4) = x(i,j)^2+A(3,4);

A(3,5) = x(i,j)*y(i,j)^2+A(3,5);

A(3,6) = y(i,j)^3+A(3,6);

A(4,1) = x(i,j)^2+A(4,1);

A(4,2) = x(i,j)^3+A(4,2);

A(4,3) = x(i,j)^2*y(i,j)+A(4,3);

A(4,4) = x(i,j)^4+A(4,4);

A(4,5) = x(i,j)^3*y(i,j)+A(4,5);

A(4,6) = x(i,j)^2*y(i,j)^2+A(4,6);

A(5,1) = x(i,j)*y(i,j)+A(5,1);

A(5,2) = x(i,j)^2*y(i,j)+A(5,2);

A(5,3) = x(i,j)^3+A(5,3);

A(5,4) = x(i,j)^3*y(i,j)+A(5,4);

A(5,5) = x(i,j)^2*y(i,j)^2+A(5,5);

A(5,6) = x(i,j)*y(i,j)^3+A(5,6);

A(6,1) = y(i,j)^2+A(6,1);

A(6,2) = x(i,j)*y(i,j)^2+A(6,2);

A(6,3) = y(i,j)^3+A(6,3);

A(6,4) = x(i,j)^2*y(i,j)^2+A(6,4);

A(6,5) = x(i,j)*y(i,j)^3+A(6,5);

A(6,6) = y(i,j)^4+A(6,6);

B(1,1) = z(i,j)+B(1,1);

B(2,1) = z(i,j)*x(i,j);

B(3,1) = z(i,j)*y(i,j);

B(4,1) = z(i,j)*x(i,j)^2;

B(5,1) = z(i,j)*x(i,j)*y(i,j);

B(6,1) = z(i,j)*y(i,j)^2;

end

end

C = inv(A)*B;

a0 = C(1);

a1 = C(2);

a2 = C(3);

a3 = C(4);

a4 = C(5);

a5 = C(6);

源码的基本思想是基于数学方程计算 a0~a5 这6个参数的值,并将这些参数以行向量形式返回。我们观察函数文件,看到两层 for 循环的循环体中有 x(i,j) 这样的参数,这要求传入参数 x 需要是一个 length(x)*length(y) 的矩阵,而我们在实际应用的时候,可能传入参数并不满足这样的矩阵形式,更多的可能是个向量,或者[x,y,z] 这样的矩阵,直接以输入参数代入可能会报“位置 1 的索引超出数组范围(不能超过 1)。”的错误。

2. 解决上述问题

找了个比较简单的办法来解决上述问题。我用的 MATLAB 版本是 2018a ,我们知道有一个拟合工具:

>> cftool

Fit name: 自定义;

x data, y data, z data:都需要从工作空间加载,所以你的这些数据需要先导入到 workspace(工作区);

上部中间的部分是自己设置的参数,第一行 Polynomial 为多项式拟合,拟合算法在类 fittype里面,自己查参数意义;

当然多项式拟合可以选择 x 和 y 的最高次项的幂。

3. 生成源代码

有些同学可能在想:“我要源代码,这样才能往里面传参数啊!!!”

步骤:

文件(File)->Generate Code

它就会自动生成一个函数文件,你直接调用就行了,不过里面还有一些数据类型的问题待解决,也就是函数的返回参数:

[fitresult, gof] = createFit(x, y, Z)

可能你直接用这个做还会遇到有些问题,不过终归不是什么难题了。

还是补充上怎么获取方程系数吧,参考http://www.ilovematlab.com/thread-574266-1-1.html

MATLAB的 coeffvalues()函数。help 文档:“coeffvalues(FUN)返回CFIT对象FUN的系数值作为行向量。”

matlab曲面的最小值,MATLAB最小二乘法拟合曲面相关推荐

  1. matlab曲面的最小值,MATLAB中标准三维曲面

    ​(1)sphere函数---绘制三维球面 [x,y,z]=sphere(n) %将产生(n+1)*(n+1)矩阵想,x,y,z​采用这三个矩阵可以绘制出圆心位于原点,半径是1的单位球体.n决定了球面 ...

  2. matlab寻找向量最小值,matlab – 在排序向量中快速搜索大于x的最小值

    由于输入已经排序,自定义二进制搜索应该有效(您可能需要对边缘情况进行一些更新,即请求的值小于数组的所有元素): function [result, res2] = binarySearchExampl ...

  3. UG NX 12 拟合曲面

    拟合曲面即是通过点云选取大量的点创建曲面.[拟合曲面]命令和[通过点]从[极点]命令不同,通过点.从极点选取的点要有规律,而[拟合曲面]命令选取点十分方便,但是所创建的曲面边界般和点云边缘并不贴合,需 ...

  4. 【Matlab】离散点拟合曲面

    Matlab中可以使用interp函数和griddata函数来实现插值,从而得到拟合曲面 从曲面上采样 离散点拟合曲面 1.离散点采样 为了获取离散点,首先需要从某个特定的曲面上采样. 其中利用数学的 ...

  5. matlab空间曲面拟合,【Matlab】离散点拟合曲面

    Matlab中可以使用interp函数和griddata函数来实现插值,从而得到拟合曲面 从曲面上采样 离散点拟合曲面 1.离散点采样 为了获取离散点,首先需要从某个特定的曲面上采样. 其中利用数学的 ...

  6. matlab曲面拟合的算法,Matlab三维节点拟合出平滑曲面,并求拟合曲面与底部投影形成的体积以及投影面积...

    xyz对应一个三维节点,其中,x,y在区间12.2986,32.1627和-0.01501,15.01之间,这些坐标点的投影类似于一个矩形 但不是规整矩形.要做的就是用Matlab将这些离散三维坐标点 ...

  7. Zernike函数拟合曲面--MATLAB实现

    利用前36阶zernike函数拟合曲面: 脚本程序 clc;clear; load unwrap_ph.mat unwrap_ph=max(max(unwrap_ph))-unwrap_ph; unw ...

  8. matlab最小二乘法拟合参数,matlab最小二乘法拟合

    matlab最小二乘法拟合 数学建模与数学实验 拟 合 1 实验目的 实验内容 2. 掌握用数学软件求解拟合问题. 1. 直观了解拟合基本内容. 1. 拟合问题引例及基本原理. 4. 实验作业. 2. ...

  9. 最小二乘法拟合椭圆——MATLAB和Qt-C++实现

    本小节Jungle尝试用最小二乘法拟合椭圆,并用MATLAB和C++实现. 1.理论知识 平面上任意位置的一个椭圆,其中心坐标为(x0,y0),半长轴a,半短轴b,长轴偏角为θ,方程通式为 其中 在原 ...

  10. 【Matlab】最小二乘法拟合多项式

    前言 在最近的电机项目中,有遇到有传感器数据并不线性的问题,然后想要用最小二乘法做个曲线拟合,反过来去校准不线性的传感器的数据,因此记录一下使用最小二乘法来拟合多项式的曲线的步骤.本篇从最小二乘法的原 ...

最新文章

  1. how to use the mathmatical constant e in conjunction with a vector
  2. 基于Spring boot + Mybatis +Netty 实现前后端分离的聊天App,部署到阿里云线上服务器...
  3. C语言 | 基于51单片机实现MPU6050的卡尔曼滤波算法(代码类2)
  4. 苹果隐藏app_iOS 14的隐藏功能盘点:不知道等于白更新!
  5. Hystrix原理讲解
  6. ajax请求到参数太大获取参数失败问题,Ajax请求参数较长导致请求失败
  7. Leetcode每日一题:763.partition-labels(划分字母区间)
  8. php使用redis消息队列swoole,swoole+Redis实现实时数据推送
  9. 在 Hibernate 中出现 database product name cannot be null 时怎么解决?
  10. smobiler介绍(一)
  11. 这几款手机浏览器真的牛,比夸克更好用
  12. 核密度估计_拔剑-浆糊的传说_新浪博客
  13. 解决a标签下载网络图片直接打开的问题,通过浏览器下载网络文件
  14. 如何把1个pdf拆分几个pdf
  15. 五国启动税务执法联盟以解决加密货币网络犯罪威胁
  16. BZOJ 1778 Usaco2010 驱逐猪猡
  17. 国外开源IoT平台Thingsboard社区版本(V3.3.2)在Win10环境下进行源码编译及运行指南
  18. 12306登录password参数加密逻辑
  19. Java——判断回文
  20. 3个小技巧,轻松提高抖音视频的播放量

热门文章

  1. 如何在JUnit5中使用Mockito
  2. 深度学习岗位面试记录
  3. 【023】翼辉信息于南京召开国产嵌入式信息产业前沿技术交流会暨SylixOS新版发布会
  4. 增强型绿植植被指数_植被指数--数据产品-国家青藏高原科学数据中心
  5. 基于python的多光谱影像植被指数计算
  6. 基于QT的HLW8032电能芯片测试上位机开发
  7. (2020全新)UGNX二次开发(零基础入门)到提高全套视频教程_NXopen-UG二次开发_新浪博客
  8. 遍历目录下的所有文件(文件)
  9. 虚拟机桥接模式下和windows相互ping通
  10. 【Java】随机姓名的生成