【数学建模 matlab 实验报告11】拟合

上一篇:【数学建模 matlab 实验报告10】插值

目录

实验报告

实验心得


实验报告

作业 1

截图:

代码:

Matlab 复制代码
x = linspace(-10, 10, 100);

y = x.^3 - 6*x.^2 + 5*x - 3;

noise = randn(size(y)); 
y_noisy = y + noise;

p3 = polyfit(x, y_noisy, 3); 
p2 = polyfit(x, y_noisy, 2); 
p4 = polyfit(x, y_noisy, 4); 

y_fit3 = polyval(p3, x);
y_fit2 = polyval(p2, x);
y_fit4 = polyval(p4, x);

figure;
hold on;
plot(x, y, 'b-', 'LineWidth', 2);
plot(x, y_noisy, 'ro'); 
plot(x, y_fit3, 'g--', 'LineWidth', 2);
plot(x, y_fit2, 'k:', 'LineWidth', 2); 
plot(x, y_fit4, 'm-.', 'LineWidth', 2); 
legend('原始多项式', '含噪声数据', '三次拟合', '二次拟合', '四次拟合');
title('多项式拟合比较');
xlabel('x');
ylabel('y');

disp('原始系数:');
disp([1 -6 5 -3]);
disp('三次拟合系数:');
disp(p3);
disp('二次拟合系数:');
disp(p2);
disp('四次拟合系数:');
disp(p4);

hold off;

作业 2

截图:

代码:

Matlab 复制代码
t = [0.5,1,2,3,4,5,7,9]; 
v = [6.36,6.48,7.26,8.22,8.66,8.99,9.43,9.63]; 

charging_func = @(params, t) params(1) - (params(1) - params(2)) * exp(-t / params(3));

initial_guess = [10, 0, 1]; 

fit_params = lsqcurvefit(charging_func, initial_guess, t, v);

V = fit_params(1); 
initial_voltage = fit_params(2); 
tau = fit_params(3); 
disp('最佳拟合参数:');
disp(['V = ', num2str(V)]);
disp(['初始电压 = ', num2str(initial_voltage)]);
disp(['充电常数 = ', num2str(tau)]);

figure;
hold on;
plot(t, v, 'ro'); 
t_fit = linspace(min(t), max(t), 100);
v_fit = charging_func(fit_params, t_fit); 
plot(t_fit, v_fit, 'b-', 'LineWidth', 2); 
xlabel('时间 (秒)');
ylabel('电压 (伏)');
title('电容器充电曲线拟合');
legend('数据', '拟合曲线');
hold off;

作业 3

截图:

代码:

Matlab 复制代码
F = [1,2,4,7,9,12,13,15,17]; 
x = [1.5,3.9,6.6,11.7,15.6,18.8,19.6,20.6,21.1]; 

idx_linear = F <= 10; 
F_linear = F(idx_linear);
x_linear = x(idx_linear);

p_linear = polyfit(x_linear, F_linear, 1);
k = p_linear(1); 
p_poly = polyfit(x, F, 2); 

figure;
hold on;
plot(x, F, 'bo', 'MarkerFaceColor', 'b'); 
x_fit = linspace(0, max(x), 100);
F_fit_linear = polyval(p_linear, x_fit);
F_fit_poly = polyval(p_poly, x_fit);
plot(x_fit, F_fit_linear, 'r-', 'LineWidth', 2); 
plot(x_fit, F_fit_poly, 'g--', 'LineWidth', 2); 
xlabel('伸长 (米)');
ylabel('力 (牛顿)');
title('弹簧伸长与施加力的关系');
legend('实验数据', '胡克定律线性拟合', '非线性拟合');
hold off;

disp(['弹性常数 k = ', num2str(k)]);
disp('多项式拟合系数:');
disp(p_poly);

作业 4

用下列数据拟合,求出a, b的值,并作拟合效果图。

|---|-----|-----|-----|-----|-----|-----|
| x | 0 | 0.2 | 0.4 | 0.6 | 0.8 | 1 |
| y | 4.0 | 4.5 | 5.0 | 6.0 | 6.8 | 7.7 |

截图:

代码:

Matlab 复制代码
x = [0,0.2,0.4,0.6,0.8,1]; 
y = [4,4.5,5,6,6.8,7.7]; 

p = polyfit(x, y, 1); 
a = p(1); 
b = p(2); 

x_fit = linspace(min(x), max(x), 100); 
y_fit = polyval(p, x_fit); 

figure;
plot(x, y, 'bo', 'MarkerFaceColor', 'b'); 
hold on;
plot(x_fit, y_fit, 'r-', 'LineWidth', 2); 
xlabel('X');
ylabel('Y');
title('线性拟合效果图');
legend('原始数据', '拟合线');
hold off;

disp(['拟合得到的参数 a: ', num2str(a)]);
disp(['拟合得到的参数 b: ', num2str(b)]);

作业 5

截图:

代码:

Matlab 复制代码
x1 = [470, 285, 470, 470, 470, 100, 100, 470, 100, 100, 100, 285, 285];
x2 = [300, 80, 300, 80, 80, 190, 80, 190, 300, 300, 80, 300, 190];
x3 = [10, 10, 120, 120, 10, 10, 65, 65, 54, 10, 120, 10, 120];
y_actual = [8.55, 3.79, 4.82, 0.02, 2.75, 14.39, 2.54, 4.35, 13.00, 8.5, 0.05, 11.32, 3.13];

x1 = x1(:); 
x2 = x2(:);  
x3 = x3(:);  
y_actual = y_actual(:);  

x_data = [x1, x2, x3];  

beta0 = [1, 0.05, 0.02, 0.1, 2];  

model = @(beta, x) (((beta(1) * x(:, 2)) - (x(:, 3) / beta(5))) ./ ...
                    (1 + beta(2) * x(:, 1) + beta(3) * x(:, 2) + beta(4) * x(:, 3)));

options = optimoptions('lsqcurvefit', 'Display', 'off'); 
[beta_estimated, resnorm] = lsqcurvefit(model, beta0, x_data, y_actual, [], [], options);

disp('估计的参数值:');
disp(beta_estimated);

disp('平方残差:');
disp(resnorm);

实验心得

本次拟合实验于5月2日开展,围绕多项式拟合、非线性拟合等核心内容,通过MATLAB编程实现不同场景下的数据拟合与结果分析,涵盖线性与非线性、单变量与多变量拟合任务,不仅掌握了各类拟合方法的实操技巧,更深刻理解了拟合技术的核心原理与工程应用价值,在理论落地与问题解决中积累了宝贵的实验经验。

拟合技术的核心意义在于通过构建合理的数学模型,对离散实验数据进行拟合,消除随机误差的影响,揭示数据背后的内在规律,这一技术广泛应用于物理测量、化学反应、工程测试等多个领域。本次实验的五个作业层层递进,从基础的多项式拟合到复杂的多参数非线性拟合,逐步提升了对拟合方法的理解与应用能力,也让我清晰认识到不同拟合方法的适用场景与优劣差异。

作业1通过对比二次、三次、四次多项式拟合含噪声的三次函数数据,直观展现了拟合阶数对拟合效果的影响。实验中,通过polyfit函数求解拟合系数,polyval函数计算拟合值并绘图对比,发现三次拟合与原始多项式曲线贴合度最高,二次拟合因阶数不足无法准确捕捉数据变化趋势,四次拟合则出现过度拟合现象,这让我理解了拟合阶数选择的核心原则------需匹配原始数据的变化规律,避免阶数过低导致拟合不足或阶数过高引发过度拟合。同时,实验也体现了误差处理的重要性,通过添加随机噪声模拟实际实验数据,拟合技术能够有效过滤噪声,还原数据本质规律。

作业2至作业5聚焦不同实际场景的拟合应用,进一步深化了对拟合技术的理解。作业2针对电容器充电曲线,采用lsqcurvefit函数实现非线性拟合,通过自定义充电函数、设置初始猜测值,精准求解出饱和电压、初始电压和充电常数,拟合曲线与实验数据高度贴合,展现了非线性拟合在动态过程建模中的优势。作业3研究弹簧伸长与施加力的关系,分别采用线性拟合(胡克定律)与二次多项式拟合,对比发现线性拟合适用于力较小时的规律描述,非线性拟合则能覆盖全部实验数据,体现了拟合方法需结合实验原理与数据特征选择。

作业4通过简单线性拟合求解参数a、b,熟练掌握了polyfit函数在一元线性拟合中的基础应用,拟合效果图清晰呈现了原始数据与拟合线的贴合程度,直观体现了线性拟合在数据规律简单、线性关系明显场景中的实用性。作业5针对化学反应速率与反应物含量的关系,实现多参数非线性拟合,通过自定义反应速率模型、设置初始参数猜测值,求解出未知参数,且估计参数与参考值较为接近,验证了拟合技术在复杂多变量系统建模中的可靠性,也让我认识到初始猜测值、模型构建对拟合精度的重要影响。

实验过程中,也深刻认识到拟合实验的严谨性要求。参数设置、初始猜测值选择、模型构建等细节,都会影响拟合结果的精度与可靠性,例如作业2中初始猜测值设置不合理会导致拟合失败,作业5中模型表达式的疏漏会造成参数估计偏差。同时,通过实验也理解了最小二乘法的核心思想,其作为拟合的核心原理,通过最小化残差平方和实现最优拟合,确保拟合结果最接近实际实验数据,这也是各类拟合方法的核心依据。

通过本次拟合实验,不仅熟练掌握了polyfit、polyval、lsqcurvefit等MATLAB函数的使用方法,更掌握了线性拟合、多项式拟合、非线性拟合的核心原理与应用技巧,理解了拟合技术在处理离散实验数据、揭示数据规律、实现参数估计中的重要作用。拟合技术作为连接实验数据与数学模型的桥梁,是工程实践中数据处理的核心方法之一。未来,将进一步深化对拟合原理的研究,熟练掌握不同场景下拟合方法的选择技巧,提升数据处理与建模能力,将实验所学应用于实际工程问题的解决中,充分发挥拟合技术的实用价值。

相关推荐
Ulyanov2 小时前
Python与YAML的优雅交响:从配置管理到数据艺术的完美实践 (一)
开发语言·前端·python·数据可视化
李昊哲小课2 小时前
Pandas数据分析 - 第三章:DataFrame 对象详解
数据挖掘·数据分析·pandas
菜菜小狗的学习笔记2 小时前
八股(一)Java基础
java·开发语言
zml.~2 小时前
Spark 数据分析:从核心原理到企业级实战全解析
大数据·数据挖掘·数据分析·spark
Anfioo2 小时前
Java 基础-面向对象思想知识点详解
java·开发语言
bnmoel2 小时前
C语言自定义类型:联合和枚举
c语言·开发语言·数据结构·算法
计算机安禾2 小时前
【数据结构与算法】第34篇:选择排序:简单选择排序与堆排序
c语言·开发语言·数据结构·c++·算法·排序算法·visual studio
zml.~2 小时前
大数据分析实战:基于 Spark 的新能源汽车全链路数据分析指南
大数据·数据分析·spark·汽车
ん贤2 小时前
Go 并发高频十问:goroutine 与线程的区别是什么?select 底层原理是什么?
开发语言·golang·并发