基于最小二乘法的离散数据曲面拟合MATLAB实现方法

news/2025/10/10 17:04:19/文章来源:https://www.cnblogs.com/I989809/p/19133460

最小二乘法曲面拟合原理

数学基础

对于离散数据点 \((x_i, y_i, z_i)\),我们要找到曲面函数 \(z = f(x,y)\) 的最佳拟合。

多项式曲面模型

\[z = \sum_{i=0}^{m}\sum_{j=0}^{n} a_{ij}x^iy^j \]

其中 \(m\)\(n\) 是多项式次数,\(a_{ij}\) 是待求系数。

最小二乘原理

最小二乘法通过最小化残差平方和来确定系数:

\[\min \sum_{k=1}^{N} [z_k - f(x_k,y_k)]^2 \]

实现

1. 基础曲面拟合函数

function [coefficients, fitted_surface, rmse] = surface_fit_least_squares(x, y, z, m, n)% 基于最小二乘法的曲面拟合% 输入:%   x, y, z: 数据点坐标%   m, n: x和y方向的拟合多项式次数% 输出:%   coefficients: 拟合系数矩阵%   fitted_surface: 拟合曲面函数句柄%   rmse: 均方根误差% 数据预处理x = x(:); y = y(:); z = z(:);% 构建设计矩阵AA = [];for i = 0:mfor j = 0:nif i + j <= max(m, n)  % 限制总阶数A = [A, (x.^i) .* (y.^j)];endendend% 求解最小二乘问题coefficients = (A' * A) \ (A' * z);% 计算拟合值z_fit = A * coefficients;% 计算误差rmse = sqrt(mean((z - z_fit).^2));% 创建拟合曲面函数fitted_surface = @(xq, yq) evaluate_surface(xq, yq, coefficients, m, n);fprintf('曲面拟合完成!\n');fprintf('多项式次数: %d×%d\n', m, n);fprintf('均方根误差(RMSE): %.6f\n', rmse);fprintf('确定系数(R²): %.6f\n', 1 - sum((z - z_fit).^2) / sum((z - mean(z)).^2));
endfunction zq = evaluate_surface(xq, yq, coeffs, m, n)% 评估拟合曲面在给定点的值xq = xq(:); yq = yq(:);Aq = [];idx = 1;for i = 0:mfor j = 0:nif i + j <= max(m, n)Aq = [Aq, (xq.^i) .* (yq.^j)];idx = idx + 1;endendendzq = Aq * coeffs;% 保持输出形状与输入一致if ~isvector(xq) || ~isvector(yq)zq = reshape(zq, size(xq));end
end

2. 不同基函数的曲面拟合

function [coefficients, fitted_surface] = surface_fit_general(x, y, z, basis_functions)% 通用基函数的最小二乘曲面拟合% basis_functions: 基函数细胞数组,例如 {@(x,y)1, @(x,y)x, @(x,y)y, @(x,y)x.*y}x = x(:); y = y(:); z = z(:);% 构建设计矩阵A = zeros(length(x), length(basis_functions));for k = 1:length(basis_functions)A(:, k) = basis_functions{k}(x, y);end% 求解系数coefficients = (A' * A) \ (A' * z);% 创建拟合函数fitted_surface = @(xq, yq) evaluate_general_surface(xq, yq, coefficients, basis_functions);
endfunction zq = evaluate_general_surface(xq, yq, coeffs, basis_funcs)xq = xq(:); yq = yq(:);zq = zeros(size(xq));for k = 1:length(coeffs)zq = zq + coeffs(k) * basis_funcs{k}(xq, yq);endif ~isvector(xq) || ~isvector(yq)zq = reshape(zq, size(xq));end
end

3. 带正则化的稳健拟合

function [coefficients, fitted_surface] = surface_fit_regularized(x, y, z, m, n, lambda)% 带正则化的曲面拟合(解决过拟合问题)% lambda: 正则化参数x = x(:); y = y(:); z = z(:);% 构建设计矩阵A = [];for i = 0:mfor j = 0:nif i + j <= max(m, n)A = [A, (x.^i) .* (y.^j)];endendend% 带正则化的最小二乘[U, S, V] = svd(A, 'econ');s = diag(S);% Tikhonov 正则化s_reg = s ./ (s.^2 + lambda^2);coefficients = V * diag(s_reg) * U' * z;% 创建拟合函数fitted_surface = @(xq, yq) evaluate_surface(xq, yq, coefficients, m, n);
end

4. 完整的演示示例

function demo_surface_fitting()% 曲面拟合演示函数% 生成示例数据[x, y, z] = generate_sample_data();% 可视化原始数据figure('Position', [100, 100, 1200, 800]);% 原始数据subplot(2, 3, 1);scatter3(x, y, z, 40, z, 'filled');title('原始离散数据');xlabel('X'); ylabel('Y'); zlabel('Z');colorbar; grid on;% 不同次数的拟合比较degrees = [1, 2, 3, 4];errors = zeros(size(degrees));for i = 1:length(degrees)m = degrees(i);n = degrees(i);subplot(2, 3, i+1);% 进行曲面拟合[coeffs, surface_func, rmse] = surface_fit_least_squares(x, y, z, m, n);errors(i) = rmse;% 生成网格用于绘制曲面[Xq, Yq] = meshgrid(linspace(min(x), max(x), 50), ...linspace(min(y), max(y), 50));Zq = surface_func(Xq, Yq);% 绘制拟合曲面surf(Xq, Yq, Zq, 'FaceAlpha', 0.7);hold on;scatter3(x, y, z, 40, 'r', 'filled');title(sprintf('%d阶多项式拟合 (RMSE=%.4f)', m, rmse));xlabel('X'); ylabel('Y'); zlabel('Z');grid on;colorbar;end% 误差比较subplot(2, 3, 6);plot(degrees, errors, 'o-', 'LineWidth', 2, 'MarkerSize', 8);xlabel('多项式次数');ylabel('RMSE');title('拟合误差 vs 多项式次数');grid on;% 显示最佳拟合参数[min_error, best_idx] = min(errors);fprintf('\n最佳拟合次数: %d阶\n', degrees(best_idx));fprintf('最小RMSE: %.6f\n', min_error);
endfunction [x, y, z] = generate_sample_data()% 生成示例数据 - 添加噪声的二次曲面rng(42); % 设置随机种子以便重现% 生成网格点[X, Y] = meshgrid(-2:0.3:2, -2:0.3:2);x = X(:); y = Y(:);% 真实的二次曲面z_true = 2 + 0.5*X - 0.8*Y + 1.2*X.^2 - 0.6*X.*Y + 0.9*Y.^2;% 添加噪声noise_level = 0.5;z = z_true(:) + noise_level * randn(size(z_true(:)));% 添加一些异常值outlier_indices = randperm(length(z), round(0.05*length(z)));z(outlier_indices) = z(outlier_indices) + 3 * noise_level * randn(size(outlier_indices));
end

5. 交互式GUI曲面拟合工具

function surface_fit_gui()% 创建GUI界面进行曲面拟合fig = figure('Name', '曲面拟合工具', ...'NumberTitle', 'off', ...'Position', [100, 100, 1400, 800]);% 控制面板uipanel('Parent', fig, ...'Title', '控制面板', ...'Position', [0.02, 0.02, 0.2, 0.96]);% 结果显示区域axes('Parent', fig, ...'Position', [0.25, 0.55, 0.35, 0.4]);title('原始数据与拟合曲面');axes('Parent', fig, ...'Position', [0.65, 0.55, 0.35, 0.4]);title('拟合残差');axes('Parent', fig, ...'Position', [0.25, 0.05, 0.35, 0.4]);title('误差分析');axes('Parent', fig, ...'Position', [0.65, 0.05, 0.35, 0.4]);title('交叉验证结果');% 创建控件create_controls(fig);
endfunction create_controls(fig)% 创建GUI控件% 多项式次数选择uicontrol('Parent', fig, ...'Style', 'text', ...'String', 'X方向次数:', ...'Position', [30, 700, 100, 20]);uicontrol('Parent', fig, ...'Style', 'popupmenu', ...'String', {'1','2','3','4','5','6'}, ...'Position', [140, 700, 60, 20], ...'Tag', 'x_degree');uicontrol('Parent', fig, ...'Style', 'text', ...'String', 'Y方向次数:', ...'Position', [30, 650, 100, 20]);uicontrol('Parent', fig, ...'Style', 'popupmenu', ...'String', {'1','2','3','4','5','6'}, ...'Position', [140, 650, 60, 20], ...'Tag', 'y_degree');% 数据生成按钮uicontrol('Parent', fig, ...'Style', 'pushbutton', ...'String', '生成示例数据', ...'Position', [30, 600, 170, 30], ...'Callback', @generate_data_callback);% 拟合按钮uicontrol('Parent', fig, ...'Style', 'pushbutton', ...'String', '执行曲面拟合', ...'Position', [30, 550, 170, 30], ...'Callback', @fit_surface_callback);% 结果显示区域uicontrol('Parent', fig, ...'Style', 'text', ...'String', '拟合结果:', ...'Position', [30, 450, 100, 20], ...'FontWeight', 'bold');uicontrol('Parent', fig, ...'Style', 'edit', ...'String', '', ...'Max', 3, ...'Position', [30, 300, 170, 150], ...'Tag', 'result_text', ...'HorizontalAlignment', 'left', ...'Style', 'listbox');
endfunction generate_data_callback(~, ~)% 生成数据回调函数[x, y, z] = generate_sample_data();% 存储数据setappdata(gcf, 'x_data', x);setappdata(gcf, 'y_data', y);setappdata(gcf, 'z_data', z);% 绘制原始数据axes_handle = findobj(gcf, 'Type', 'axes', 'Position', [0.25, 0.55, 0.35, 0.4]);axes(axes_handle);scatter3(x, y, z, 40, z, 'filled');title('原始离散数据');xlabel('X'); ylabel('Y'); zlabel('Z');colorbar; grid on;
endfunction fit_surface_callback(~, ~)% 曲面拟合回调函数% 获取数据x = getappdata(gcf, 'x_data');y = getappdata(gcf, 'y_data');z = getappdata(gcf, 'z_data');if isempty(x)errordlg('请先生成数据或加载数据!', '错误');return;end% 获取拟合参数x_degree_popup = findobj(gcf, 'Tag', 'x_degree');y_degree_popup = findobj(gcf, 'Tag', 'y_degree');m = get(x_degree_popup, 'Value');n = get(y_degree_popup, 'Value');% 执行拟合[coeffs, surface_func, rmse, r_squared] = surface_fit_least_squares(x, y, z, m, n);% 更新结果显示result_text = findobj(gcf, 'Tag', 'result_text');result_str = sprintf('拟合完成!\n多项式次数: %d×%d\nRMSE: %.6f\nR²: %.6f\n系数数量: %d', ...m, n, rmse, r_squared, length(coeffs));set(result_text, 'String', result_str);% 可视化结果visualize_fit_results(x, y, z, surface_func, coeffs, m, n);
endfunction visualize_fit_results(x, y, z, surface_func, coeffs, m, n)% 可视化拟合结果% 生成拟合曲面[Xq, Yq] = meshgrid(linspace(min(x), max(x), 50), ...linspace(min(y), max(y), 50));Zq = surface_func(Xq, Yq);% 计算拟合值z_fit = surface_func(x, y);residuals = z - z_fit;% 绘制拟合曲面axes_handle1 = findobj(gcf, 'Position', [0.25, 0.55, 0.35, 0.4]);axes(axes_handle1);cla;surf(Xq, Yq, Zq, 'FaceAlpha', 0.7, 'EdgeColor', 'none');hold on;scatter3(x, y, z, 40, 'r', 'filled');title(sprintf('%d×%d 多项式曲面拟合', m, n));xlabel('X'); ylabel('Y'); zlabel('Z');legend('拟合曲面', '原始数据', 'Location', 'best');colorbar; grid on;% 绘制残差axes_handle2 = findobj(gcf, 'Position', [0.65, 0.55, 0.35, 0.4]);axes(axes_handle2);scatter3(x, y, residuals, 40, abs(residuals), 'filled');title('拟合残差');xlabel('X'); ylabel('Y'); zlabel('残差');colorbar; grid on;% 绘制残差直方图axes_handle3 = findobj(gcf, 'Position', [0.25, 0.05, 0.35, 0.4]);axes(axes_handle3);histogram(residuals, 20);title('残差分布');xlabel('残差值'); ylabel('频数');grid on;% QQ图检验正态性axes_handle4 = findobj(gcf, 'Position', [0.65, 0.05, 0.35, 0.4]);axes(axes_handle4);qqplot(residuals);title('残差QQ图');grid on;
end

使用示例

基本使用方法

% 运行演示
demo_surface_fitting();% 或者直接使用拟合函数
[x, y, z] = generate_sample_data();
[coeffs, surface_func, rmse] = surface_fit_least_squares(x, y, z, 2, 2);% 在新点评估拟合曲面
x_new = 0.5; y_new = -0.3;
z_pred = surface_func(x_new, y_new);
fprintf('在(%.1f, %.1f)处的预测值: %.4f\n', x_new, y_new, z_pred);

启动GUI工具

% 启动交互式曲面拟合工具
surface_fit_gui();

参考代码 基于最小二乘法的离散数据的曲面拟合 www.youwenfan.com/contentcni/63812.html

关键特性

  1. 多种基函数支持:多项式、自定义基函数
  2. 正则化选项:防止过拟合
  3. 完整误差分析:RMSE、R²、残差分析
  4. 交互式可视化:3D曲面、残差图、QQ图
  5. 用户友好界面:GUI工具便于操作

应用建议

  • 数据预处理:确保数据质量,处理异常值
  • 模型选择:从低阶开始,避免过拟合
  • 交叉验证:评估模型泛化能力
  • 正则化:高维数据时使用正则化防止过拟合

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

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

相关文章

20251010——读后感1

书中石匠的故事启示我们,程序员不应只把编程当谋生手段,而要视为建造软件“大教堂”的事业。这要求我们在开发时追求卓越。比如接到一个管理系统开发任务,不能只满足于功能实现,要考虑系统的扩展性、用户体验,像优…

MOE模型

MOE 模型 Qwen3MoeForCausalLM((model): Qwen3MoeModel((embed_tokens): Embedding(151936, 2048, padding_idx=151643)(layers): ModuleList((0-47): 48 x Qwen3MoeDecoderLayer((self_attn): Qwen3MoeAttention((q_p…

2025航空插头厂家最新推荐榜:M8 航空插头, m12航空插头, 航空插头公母对接, 航空插头5芯, 航空插头三芯, 航空插头4芯, 航空插头12芯等类型全覆盖,专业定制与可靠品质

行业背景航空插头作为电气连接的关键部件,广泛应用于航空航天、国防军事、工业自动化、交通运输等众多领域。随着科技的飞速发展,各行业对航空插头的性能、质量和定制化需求也日益提高。在航空航天领域,航空插头需要…

go使用root用户进行调试

需求 本地调试go程序,但涉及硬件操作需要用root用户执行。 需要sudo的同时支持端点调试。 方法 修改launch.json文件 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of ex…

如何反制免费项目管理软件的套路

很多工具喊着 “免费”,实则藏着各种隐形门槛:有的免费版锁死核心模块,想用自动化测试得加钱;有的表面免费,却在存储、协作人数外额外设 “功能等级”,连导出报表都要付费解锁,比如:用过项目管理工具的团队都懂…

智能技术与先进制造国际会议(ITAM 2025)

智能技术与先进制造国际会议(ITAM 2025)由湖南第一师范学院主办,CCF长沙分部联合主办。将于2025年12月12日至14日在山水洲城,楚汉名城——湖南长沙盛大召开。 智能技术与先进制造领域是当前全球科技与产业变革的核…

2025智慧工地工程协同项目交付管理软件系统平台公司推荐榜:项目全周期的智能中枢,助力建筑行业数字化转型

随着建筑行业数字化转型的持续深入,工程管理软件系统已从单纯的工具辅助升级为项目全周期的智能中枢。从施工协同到质量管控,从成本核算到风险预警,数字化工具正重构工程管理的底层逻辑。基于技术创新性、场景适配性…

重庆初阳科技车辆计数厂家:多维度赋能城市建设与工程精细化管理

一、背景:城市建设加速下的管理新诉求​ 随着我国新型城镇化建设不断推进,城市新区开发、老旧小区改造、交通基础设施升级等工程持续开展,对车辆管理的精细化、智能化提出了更高要求。在城市交通领域,平峰时段交通…

1、在pyhcarm中安装包和指定镜像源

1、操作方式: 操作pip,必须要通过终端(terminal) pip install 模块名 pip install requests 安装模块 pip uninstall requests 删除模块2、pip默认下载模块是链接国外python仓库,可能会出现连接超时的问题。 清华源…

iOS 26 系统流畅度深度剖析,Liquid Glass 视效与界面滑动的实际测评 - 指南

iOS 26 系统流畅度深度剖析,Liquid Glass 视效与界面滑动的实际测评 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fami…

使用testcenter打出动态流量

使用testcenter打出动态流量参考链接 如何用testCenter打出动态的流量 – 绿盟科技技术博客

coze手册

coze手册1、​扣子Coze飞书多维表插件-查询数据 search_record - 查询数据请求参数apptoken - 多维表的唯一标识服 可选参数: automatic_fields - 控制是否返回自动计算的字段, true 表示返回。 field_names - 字段名…

css动画已经执行过一次如何再次执行?

.shakeAnimate {animation: shakeAnimation 2s ease-in-out forwards;}const showAnimation = () => {const box = document.querySelector(.box)if (box) {if (box.classList.contains(shakeAnimate)) {box.classL…

缓存监控--来源于网络

前缀key设计,按照不同的业务区分了不同的业务场景的前缀Key public class RedisKeyConstants {public static final String REDIS_GAMEGROUP_NEW_KEY = "newgamegroup";public static final…

20232319 2025-2026-1 《网络与系统攻防技术》实验一实验报告

1.实验内容篡改程序流程——直接修改可执行文件,跳转至getShell; 栈溢出攻击——利用foo函数的缓冲区溢出漏洞,覆盖返回地址触发getShell; Shellcode注入——构造恶意输入注入自定义Shellcode并执行。2.实验过程 一…

2025 年兽药厂家最新推荐榜:级企业技术专利与服务能力全景解析,养殖户选品权威指南

当前兽药行业正处于技术迭代与合规升级的关键期,养殖业对绿色无抗、精准高效兽药的需求日益迫切,但市场乱象仍存:部分产品有效成分不足、生产流程不合规,既影响养殖效益,更威胁食品安全。尤其近五年,一批具备创新…

2025 最新隔音板源头厂家口碑推荐榜:阻尼 / 聚酯纤维等全品类适配,资深企业与新锐品牌精选聚酯纤维/墙面/降噪/玻镁/顶部隔音板厂家推荐

随着建筑声学需求的升级,隔音板已成为住宅、医疗、商业等场景的刚需材料,但市场乱象却让选择愈发艰难。部分厂商以次充好,用劣质基材降低成本,导致隔音量不足行业标准 30% 以上,且甲醛超标问题频发;另有品牌缺乏…

Google play 内部测试流程

前往Google Play Console 创建Email List去Internal testing创建新的 release 创建过程不再赘述创建好之后去 Testers 页面 勾选之前的 Email List,并点击下面的 Copy Link 按钮在手机上打开刚刚复制的 Link (确保你…

软工第三次作业

软工第三次作业 - 结对编程 一、结对信息姓名1:伊尔番艾山 学号1:3123004762 姓名2:梁子恒 学号2:312300746 GitHub仓库:https://github.com/IrErV123/Primary-Math-Exercise-Generator二、PSP表格PSP2.1 Persona…

全球化部署几种方案

目录背景跨国混合部署的挑战商城和履约解耦的挑战定时任务。跨系统集成的复杂性。商城和中台分离的架构设计参考资料 背景 跨国混合部署的挑战系统和其他系统可能不在一个国家/地区。 比如把数据采集相关的服务部署到海…