二维曲线拟合

本文概述了二维曲线拟合的基础理论,包括最小二乘法、广义逆(伪逆矩阵)和矩阵分解。重点介绍了Matlab中的样条工具箱,如csapi、csape、ppmak等,用于生成和处理各种样条函数,如三次样条、分段多项式样条和B样条。此外,还讨论了polyfit函数在拟合数据上的应用。
摘要由CSDN通过智能技术生成

一.相关基础理论知识

最近在学习这方面的知识,本文为网上资料的总结和自己的一些代码验证。
我们根据平面上的一些离散点绘制出一条近似曲线。如果曲线通过所有点,称为插值;如果曲线不一定通过点,而是以某种方式逼近这些点,称为拟合。
构造拟合曲线,通常有以下几种方法:
(1)最小二乘法;
(2)分段拟合法;
(3)…

1. 最小二乘法

根据解的存在情况,线性方程可以分为:

  1. 有唯一解的恰定方程组
  2. 解不存在的超定方程组
    (Ax=b,A为n×m矩阵,如果A列满秩,且n>m,方程组没有精确解,常用于数据拟合);
  3. 有无穷多解的欠定方程组
    (Ax=b,A为n×m矩阵,如果A行满秩,且n<m);

在MATLAB中求解超定方程,有以下几种方法:

  1. 左除是建立在奇异值分解基础之上得到最小二乘法的解,因此最可靠;
x=A\b;
  1. 最小二乘法求解;
x=lsqnonneg(A,b);
  1. 广义逆,解不一定满足Ax=b,x只是最小二乘意义上的解;
x=pinv(A);

2. 广义逆(伪逆矩阵)

广义逆法(伪逆矩阵)是建立在对原超定方程直接进行 householder变换的基础上,其算法可靠性稍逊与(SVD)奇异值求解,但速度较快;以B=pinv(A)为例,函数返回矩阵A的伪逆矩阵。如果矩阵A是可逆(非奇异)的,那么pinv(A)与inv(A)的结果是一样的,而且pinv比inv效率低。但如果矩阵A是非方阵或奇异矩阵,则inv(A)不存在,但pinv(A)仍然存在,并表现出一些与逆矩阵类似的性质。

【定义】
令A是任意m x n矩阵,若G满足下述条件(Moore-penrose条件),称矩阵G是A的广义逆矩阵:
(1)GAG = G;
(2)AGA = A;
(3)AG为hermitian矩阵,即(AG)^H=AG;
(4)GA为hermitian矩阵,即(GA)^H=GA;

【测试】
在Matlab中,用以下几种方式求逆:
(1)直接求解:InvA = inv(A’*A)*A’; %求导,令导数为0,结果如下: InvA=(ATA)-1AT
(2)SVD分解:[U,Λ,V]=svd(A)
(3)QR分解:[Q,R]=qr(A)
(4)LU分解:[L,U]=lu(A)

 a=[1 2 3; 4 5 6; 23 3 6];
 b=inv(a);
 c=pinv(a);
 [U,D
可以使用 SciPy 库中的 `curve_fit` 函数进行三维点拟合曲线。 首先,我们需要导入必要的库和数据: ```python import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # 三维点数据 x_data = np.array([1, 2, 3, 4, 5]) y_data = np.array([2, 3, 4, 5, 6]) z_data = np.array([3, 4, 5, 6, 7]) ``` 然后,我们需要定义拟合曲线的函数,这里我们使用二次函数: ```python def func(x, a, b, c): return a * x**2 + b * x + c ``` 接着,我们使用 `curve_fit` 函数进行拟合: ```python popt, pcov = curve_fit(func, (x_data, y_data), z_data) ``` 其中 `popt` 是拟合出的参数,`pcov` 是参数的协方差。 最后,我们可以绘制出拟合曲线: ```python fig = plt.figure() ax = fig.add_subplot(projection='3d') # 绘制原始数据点 ax.scatter(x_data, y_data, z_data) # 生成拟合曲线上的点 x_fit = np.linspace(x_data.min(), x_data.max(), 50) y_fit = np.linspace(y_data.min(), y_data.max(), 50) X_fit, Y_fit = np.meshgrid(x_fit, y_fit) Z_fit = func((X_fit, Y_fit), *popt) # 绘制拟合曲线 ax.plot_surface(X_fit, Y_fit, Z_fit, alpha=0.3) plt.show() ``` 完整代码如下: ```python import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 三维点数据 x_data = np.array([1, 2, 3, 4, 5]) y_data = np.array([2, 3, 4, 5, 6]) z_data = np.array([3, 4, 5, 6, 7]) # 定义拟合曲线的函数 def func(x, a, b, c): return a * x**2 + b * x + c # 使用 curve_fit 进行拟合 popt, pcov = curve_fit(func, (x_data, y_data), z_data) # 绘制拟合曲线 fig = plt.figure() ax = fig.add_subplot(projection='3d') # 绘制原始数据点 ax.scatter(x_data, y_data, z_data) # 生成拟合曲线上的点 x_fit = np.linspace(x_data.min(), x_data.max(), 50) y_fit = np.linspace(y_data.min(), y_data.max(), 50) X_fit, Y_fit = np.meshgrid(x_fit, y_fit) Z_fit = func((X_fit, Y_fit), *popt) # 绘制拟合曲线 ax.plot_surface(X_fit, Y_fit, Z_fit, alpha=0.3) plt.show() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值