无网格方法与最小二乘法在数值模拟中的应用

需积分: 34 16 下载量 71 浏览量 更新于2024-09-08 收藏 2KB TXT 举报
"本书深入探讨了无网格移动最小二乘法形函数,涵盖了无网格方法的基本原理、不同无网格方法的对比以及它们在实际应用中的实现。书中介绍了一系列新型无网格方法,包括最小二乘配点法、加权最小二乘法、伽辽金最小二乘法和伽辽金配点法,并提供了C++编程实现的面向对象无网格法程序OMLL。此外,书中还附带MATLAB程序实例,以便读者理解和实践这些方法。这本书特别适合航空航天、力学、机械、土木工程以及水利工程领域的技术人员和相关专业的大四学生、研究生及教师阅读。" 无网格法是一种数值分析技术,用于解决偏微分方程,特别是在复杂几何形状和非均匀介质中的问题。它不同于传统的有限差分和有限元方法,因为无网格法不依赖于规则的网格结构,而是采用自由节点分布来逼近解空间,这使得它在处理不规则边界和局部精细网格时具有优势。 移动最小二乘法(MLS)是无网格方法的一种,它通过构建基于局部多项式拟合的形函数来实现离散化。形函数的构造依赖于节点周围的邻域支持,通过最小化残差平方和来确定这些函数。在书中的例子中,1维MLS近似被用来演示这种方法,程序使用MATLAB语言编写,计算了形函数、形函数的一阶导数和二阶导数,并进行了曲线拟合。 在1D MLS近似中,定义了一个区间[l, l],并使用等距节点生成坐标xi。随后,设置评估点x,计算每个节点的支持半径(在这里是节点间距的三倍),然后在所有评估点上计算MLS形函数、其一阶导数和二阶导数。这些形函数被用于近似一个已知函数,例如sin函数,通过形函数值矩阵与节点函数值矩阵的乘积得到近似解。最后,计算了近似函数和精确解之间的相对误差,以及近似函数一阶导数的相对误差,以评估方法的精度。 通过这种详细的讲解和实例,本书不仅介绍了无网格方法的基本概念,还提供了实用的编程工具,使读者能够掌握并应用这些高级数值技术。对于希望深入了解无网格法及其应用的读者来说,这是一份宝贵的资源。
2010-11-01 上传
基于移动最小二乘的图像变形技术 / Warp.h: interface for the CWarp class. // ////////////////////////////////////////////////////////////////////// #include <vector> #include <math.h> #include <cv.h> #include <highgui.h> #include <sstream> struct matrix2 { double c11,c12,c21,c22; }; class CWarp { protected: std::vector<CvPoint2D32f> m_CtrPs,m_CtrQs; public: CWarp(); virtual CvPoint2D32f Warping(const CvPoint2D32f& point)=0; virtual ~CWarp(); }; class CMLS: public CWarp { protected: void init(const CvPoint2D32f& point, CvPoint2D32f& PStar, CvPoint2D32f& QStar, std::vector<double>& Weight, std::vector<CvPoint2D32f>& PHat, std::vector<CvPoint2D32f>& QHat); CvPoint2D32f affine_warp(const CvPoint2D32f& point); CvPoint2D32f similar_warp(const CvPoint2D32f& point); CvPoint2D32f rigid_warp(const CvPoint2D32f& point); public: enum WARP_MODE {AFFINE, SIMILAR, RIGID}; CMLS(); CMLS(const std::vector<CvPoint2D32f>& CtrPs, const std::vector<CvPoint2D32f>& CtrQs); virtual CvPoint2D32f Warping(const CvPoint2D32f& point); CvPoint2D32f Warping(const CvPoint2D32f& point, WARP_MODE mode); }; class CTPS: public CWarp { public: CTPS(); CTPS(const std::vector<CvPoint2D32f>& CtrPs, const std::vector<CvPoint2D32f>& CtrQs); virtual CvPoint2D32f Warping(const CvPoint2D32f& point); private: std::vector<double> m_TPSCoeffX; std::vector<double> m_TPSCoeffY; }; class CAFFINE: public CWarp { public: CAFFINE(); ~CAFFINE(); CAFFINE(const std::vector<CvPoint2D32f>& CtrPs, const std::vector<CvPoint2D32f>& CtrQs); virtual CvPoint2D32f Warping(const CvPoint2D32f& point); const CvMat* GetMat() { return m_pAffine_m2n3; } std::string txt() const { std::ostringstream o; o << "Affine matrix: \n"; for (int i=0; i<2; i++) { for (int j=0; j<3; j++) o << " " << cvmGet(m_pAffine_m2n3, i, j); o << "\n"; } return o.str(); } private: CvMat* m_pAffine_m2n3; };