33、MATLAB 数值技术:拟合、微分与积分的综合应用

MATLAB 数值技术:拟合、微分与积分的综合应用

1. 结果验证与分析

在进行数值计算后,我们需要对结果进行验证。将我们计算得到的结果与文献中报道的结果进行比较,发现二者接近但并不完全相同。例如,对于热容 (C_p) 的计算,我们拟合的结果为 (C_p = 2.737 \times 10^{-10}T^3 - 10.63 \times 10^{-7}T^2 + 1.552 \times 10^{-3}T + 4.683 \times 10^{-1}),而文献中的结果是 (C_p = 1.698 \times 10^{-10}T^3 - 7.957 \times 10^{-7}T^2 + 1.359 \times 10^{-3}T + 5.059 \times 10^{-1})。这并不令人意外,因为我们建模时使用的数据点数量有限,而文献中的模型使用了更多的数据,所以可能更准确。

2. 使用交互式拟合工具

MATLAB 提供了交互式绘图工具,无需使用命令窗口即可对绘图进行注释,还包含基本曲线拟合、复杂曲线拟合和统计工具。

2.1 基本拟合工具

要使用基本拟合工具,首先需要创建一个图形。以下是具体步骤:

x = 0:5;
y = [0,20,60,68,77,110];
plot(x,y,'o');
axis([−1,7,−20,120]);

这些命令会生成一个包含样本数据的图形。要激活曲线拟合工具,在图形的菜单栏中选择“工具” -> “基本拟合”,基本拟合窗口将出现在绘图上方。通过勾选“线性”、“三次”和“显示方程”,可以生成相应的拟合曲线。勾选“绘制残差”框会生成第二个绘图,显示每个数据点与计算线的距离。

在基本拟合窗口的右下角有一个箭头按钮,点击两次可打开窗口的其余部分。窗口的中间面板显示曲线拟合的结果,并提供将结果保存到工作区的选项;右侧面板允许根据中间面板显示的方程选择 (x) 值并计算 (y) 值。

除了基本拟合窗口,还可以从图形菜单栏访问数据统计窗口。选择“工具” -> “数据统计”,该窗口允许根据图形中的数据交互式计算统计函数,如均值和标准差,并将结果保存到工作区。

2.2 曲线拟合工具箱

除了基本拟合工具,MATLAB 还包含用于执行专业统计和数据拟合操作的工具箱。特别是曲线拟合工具箱提供了一个应用程序,允许拟合不仅仅是多项式的曲线。不过,该工具箱需要单独购买。

3. 差分与数值微分
3.1 diff 函数

函数 (y = f(x)) 的导数衡量了 (y) 随 (x) 的变化情况。如果能定义 (x) 和 (y) 的关系方程,可以使用符号工具箱中的函数求导数方程;如果只有数据,则可以通过 (y) 的变化量除以 (x) 的变化量来近似导数:
(\frac{dy}{dx} \approx \frac{\Delta y}{\Delta x} \approx \frac{y_2 - y_1}{x_2 - x_1})

例如,对于数据 (x = 0:5) 和 (y = [15, 10, 9, 6, 2, 0]),这种导数近似对应于连接数据的每个线段的斜率。MATLAB 有一个内置函数 diff ,可用于查找向量中元素值之间的差异,并可用于计算有序数据对的斜率。

delta_x = diff(x);
delta_y = diff(y);
slope = delta_y./delta_x;

使用 diff 函数返回的向量比输入向量短一个元素,因为是在计算差值。如果要绘制这些斜率与 (x) 的关系,最好创建一个条形图,因为变化率是不连续的。

x = x(:,1:5)+diff(x)/2;
bar(x,slope);

diff 函数也可用于在已知 (x) 和 (y) 关系的情况下数值近似导数。例如,对于函数 (y = x^2),使用更多的 (x) 和 (y) 值可以使绘图更平滑。

x = −2:2;
y = x.^2;
big_x = −2:0.1:2;
big_y = big_x.^2;
plot(big_x,big_y,x,y,'−o');

通过不同数量的点来近似函数的斜率,使用的点越多,近似越准确。

3.2 前向、后向和中心差分技术

如果要在某一点近似导数,可以使用相邻点之间的斜率作为该点导数的近似值。

前向差分:
(\left(\frac{dy}{dx}\right) i = \frac{y {i + 1} - y_i}{x_{i + 1} - x_i})
可以通过 diff 函数实现:

x = linspace(0,pi/2,10);
y = sin(x);
dydx_analytical = cos(x);
dydx_approx = diff(y)./diff(x);
dydx_approx(length(x)) = NaN;
error_percentage = (dydx_analytical - dydx_approx)./dydx_analytical*100;
table = [x; dydx_analytical; dydx_approx; error_percentage];
disp('Forward Difference Approximation of the derivative of sin(x)');
disp(' x dy/dx dy/dx %error');
disp(' cos(x) forward approx.');
fprintf('%8.4f\t%8.4f\t%8.4f\t%8.4f\n',table);

后向差分与前向差分类似,只是将导数近似值分配给范围中的最后一个值。

中心差分:
(\left(\frac{dy}{dx}\right) i = \frac{y {i + 1} - y_{i - 1}}{x_{i + 1} - x_{i - 1}})
MATLAB 中的 gradient 函数使用前向差分技术处理数组中的第一个点,后向差分处理最后一个点,中心差分处理其余点来近似导数。

g = gradient(y,x);

gradient 函数也可用于二维数组来近似偏导数。以下是一个示例:

X = −2:.1:2;
Y = −2:.1:2;
[x,y] = meshgrid(X,Y);
z = 3*(1−x).^2.*exp(−(x.^2) − (y+1).^2) ...
    − 10*(x/5 − x.^3 − y.^5).*exp(−x.^2−y.^2) ...
    − 1/3*exp(−(x+1).^2 − y.^2);
surf(x,y,z);
[dzdx, dzdy] = gradient(z,X,Y);
contour(x,y,z);
hold on;
quiver(x,y,dzdx,dzdy);
4. 数值积分

积分通常被认为是曲线下的面积。可以通过将面积划分为矩形,然后对所有矩形的贡献求和来计算曲线下的面积,这就是梯形法则。

avg_y = y(1:5)+diff(y)/2;
sum(diff(x).*avg_y);

MATLAB 有一个内置函数 trapz 可以实现相同的结果:

trapz(x,y);

要近似由函数定义的曲线下的面积,可以创建一组有序的 (x - y) 对。增加 (x) 和 (y) 向量中的元素数量可以得到更好的近似。例如,对于函数 (y = x^2),从 0 到 1 的积分可以这样计算:

x = 0:0.1:1;
y = x.^2;
trapz(x,y);

MATLAB 还提供了 integral 函数,可用于计算函数的积分,无需用户指定矩形的定义方式。以下是一个示例:

fun_handle = @(x) −x.^3 + 20*x.^2 −5;
fplot(fun_handle,[−5,25]);
integral(fun_handle,0,25);
5. 计算移动边界功

以活塞 - 气缸装置为例,使用 MATLAB 的数值积分技术 integral 来计算功。假设 (PV = nRT),其中 (P) 是压力,(V) 是体积,(n) 是物质的量,(R) 是通用气体常数,(T) 是温度。

5.1 问题陈述

求活塞 - 气缸装置产生的功。

5.2 输入和输出

输入:
- (T = 300K)
- (n = 1kmol)
- (R = 8.314kJ/kmolK)
- (V_1 = 1m^3)
- (V_2 = 5m^3)

输出:活塞 - 气缸装置所做的功。

5.3 手动计算示例

由 (PV = nRT) 可得 (P = \frac{nRT}{V}),则功 (W = \int PdV = nRT \int \frac{dV}{V} = nRT \ln(\frac{V_2}{V_1}))。代入数值可得 (W = 4014kJ),由于功为正,说明是系统对外做功。

5.4 MATLAB 解决方案
%Example 13.5
%Calculating boundary work, using MATLAB's quadrature function
clear, clc;
%Define constants
n = 1;      % number of moles of gas
R = 8.314;  % universal gas constant
T = 300;    % Temperature, in K
%Define an anonymous function for P
P = @(V) n*R*T./V;
%Use integral to evaluate the integral
integral(P,1,5);

运行结果与手动计算结果相同。

5.5 结果验证

将 MATLAB 计算结果与手动计算结果进行比较,结果一致。同时,使用符号工具箱求解也有助于验证结果。之所以需要两种 MATLAB 解决方案,是因为有些问题无法使用符号工具解决,而有些问题(存在奇点的问题)不适合使用数值方法。

以下是一个总结流程图:

graph LR
    A[结果验证] --> B[交互式拟合工具]
    B --> B1[基本拟合工具]
    B --> B2[曲线拟合工具箱]
    B --> C[差分与数值微分]
    C --> C1[diff函数]
    C --> C2[前向、后向和中心差分技术]
    C --> D[数值积分]
    D --> D1[梯形法则]
    D --> D2[trapz函数]
    D --> D3[integral函数]
    D --> E[计算移动边界功]
    E --> E1[问题陈述]
    E --> E2[输入和输出]
    E --> E3[手动计算示例]
    E --> E4[MATLAB解决方案]
    E --> E5[结果验证]

通过以上内容,我们详细介绍了 MATLAB 中的数值技术,包括拟合、微分和积分,以及如何应用这些技术解决实际问题。希望这些内容对大家在 MATLAB 编程和数值计算方面有所帮助。

MATLAB 数值技术:拟合、微分与积分的综合应用

6. 实践练习巩固知识

为了更好地掌握上述数值技术,下面提供一些实践练习,通过实际操作加深对这些方法的理解和运用。

6.1 数值微分练习
  • 问题 1 :考虑方程 (y = x^3 + 2x^2 - x + 3),定义 (x) 向量从 (-5) 到 (+5),使用 diff 函数以向前差分的方法近似 (y) 关于 (x) 的导数。解析导数为 (\frac{dy}{dx} = y’ = 3x^2 + 4x - 1)。
    matlab x = -5:5; y = x.^3 + 2*x.^2 - x + 3; dydx_approx = diff(y)./diff(x); dydx_analytical = 3*x.^2 + 4*x - 1; % 由于向前差分少一个值,添加 NaN 使长度一致 dydx_approx = [dydx_approx, NaN]; % 比较结果 table = [x; dydx_analytical; dydx_approx]; disp('Forward Difference Approximation of the derivative of y = x^3 + 2x^2 - x + 3'); disp(' x dy/dx_analytical dy/dx_approx'); fprintf('%8.4f\t%8.4f\t%8.4f\n', table);
  • 问题 2 :对以下函数及其导数重复上述操作:
    | 函数 | 导数 |
    | ---- | ---- |
    | (y = \sin(x)) | (\frac{dy}{dx} = \cos(x)) |
    | (y = x^5 - 1) | (\frac{dy}{dx} = 5x^4) |
    | (y = 5xe^x) | (\frac{dy}{dx} = 5e^x + 5xe^x) |

以下是 (y = \sin(x)) 的示例代码:

x = -5:5;
y = sin(x);
dydx_approx = diff(y)./diff(x);
dydx_analytical = cos(x);
dydx_approx = [dydx_approx, NaN];
table = [x; dydx_analytical; dydx_approx];
disp('Forward Difference Approximation of the derivative of y = sin(x)');
disp(' x dy/dx_analytical dy/dx_approx');
fprintf('%8.4f\t%8.4f\t%8.4f\n', table);
  • 问题 3 :使用 gradient 函数求上述问题中的导数值。以 (y = x^3 + 2x^2 - x + 3) 为例:
x = -5:5;
y = x.^3 + 2*x.^2 - x + 3;
dydx_gradient = gradient(y, x);
disp('Derivative of y = x^3 + 2x^2 - x + 3 using gradient function');
disp(' x dydx_gradient');
fprintf('%8.4f\t%8.4f\n', [x; dydx_gradient]);
  • 问题 4 :绘制结果并比较两种方法。以 (y = x^3 + 2x^2 - x + 3) 为例:
x = -5:5;
y = x.^3 + 2*x.^2 - x + 3;
dydx_approx = diff(y)./diff(x);
dydx_approx = [dydx_approx, NaN];
dydx_gradient = gradient(y, x);
dydx_analytical = 3*x.^2 + 4*x - 1;

figure;
subplot(3,1,1);
plot(x, dydx_analytical, 'b', 'DisplayName', 'Analytical');
title('Analytical Derivative');
xlabel('x');
ylabel('dy/dx');
legend;

subplot(3,1,2);
plot(x, dydx_approx, 'r', 'DisplayName', 'Forward Difference');
title('Forward Difference Approximation');
xlabel('x');
ylabel('dy/dx');
legend;

subplot(3,1,3);
plot(x, dydx_gradient, 'g', 'DisplayName', 'Gradient Function');
title('Gradient Function Approximation');
xlabel('x');
ylabel('dy/dx');
legend;
6.2 数值积分练习
  • 问题 1 :考虑方程 (y = x^3 + 2x^2 - x + 3)
    • (a) 使用 trapz 函数估计 (y) 关于 (x) 从 (-1) 到 (1) 的积分,使用 11 个 (x) 值。
x = linspace(-1, 1, 11);
y = x.^3 + 2*x.^2 - x + 3;
integral_trapz = trapz(x, y);
disp(['Integral using trapz: ', num2str(integral_trapz)]);
- **(b)** 使用 `integral` 函数求 \(y\) 关于 \(x\) 从 \(-1\) 到 \(1\) 的积分。
fun_handle = @(x) x.^3 + 2*x.^2 - x + 3;
integral_integral = integral(fun_handle, -1, 1);
disp(['Integral using integral: ', num2str(integral_integral)]);
- **(c)** 与使用符号工具箱函数 `int` 的解析解进行比较。解析解为 \(\int_{a}^{b} (x^3 + 2x^2 - x + 3) dx = \frac{1}{4} (b^4 - a^4) + \frac{2}{3} (b^3 - a^3) - \frac{1}{2} (b^2 - a^2) + 3(b - a)\),这里 \(a = -1\),\(b = 1\)。
syms x;
a = -1;
b = 1;
integral_analytical = int(x^3 + 2*x^2 - x + 3, x, a, b);
disp(['Integral using symbolic toolbox: ', char(integral_analytical)]);
  • 问题 2 :对以下函数重复上述操作:
    | 函数 | 积分 |
    | ---- | ---- |
    | (y = \sin(x)) | (\int_{a}^{b} \sin(x)dx = \cos(a) - \cos(b)) |
    | (y = x^5 - 1) | (\int_{a}^{b} (x^5 - 1)dx = \frac{b^6 - a^6}{6} - (b - a)) |
    | (y = 5xe^x) | (\int_{a}^{b} (5xe^x)dx = (-5e^b + 5be^b) - (-5e^a + 5ae^a)) |

以 (y = \sin(x)) 为例,使用 trapz 函数的代码如下:

x = linspace(0, pi, 11);
y = sin(x);
integral_trapz = trapz(x, y);
disp(['Integral of sin(x) using trapz: ', num2str(integral_trapz)]);
7. 总结与应用拓展

通过上述内容,我们全面了解了 MATLAB 中的数值技术,包括结果验证、交互式拟合工具的使用、差分与数值微分以及数值积分等方面。这些技术在科学研究、工程计算、数据分析等领域都有广泛的应用。

例如,在物理实验中,我们可以使用数值微分来计算物理量的变化率,如速度、加速度等;在化学工程中,数值积分可用于计算反应热、物质的量等。在实际应用中,我们可以根据具体问题选择合适的方法和函数,同时要注意结果的验证和误差分析。

以下是一个应用拓展的流程图,展示了如何将这些数值技术应用到实际问题中:

graph LR
    A[实际问题] --> B[数据采集]
    B --> C[选择合适的数值技术]
    C --> C1{拟合?}
    C1 -- 是 --> D[使用拟合工具]
    C1 -- 否 --> C2{微分?}
    C2 -- 是 --> E[使用差分或 gradient 函数]
    C2 -- 否 --> C3{积分?}
    C3 -- 是 --> F[使用 trapz 或 integral 函数]
    D --> G[结果分析与验证]
    E --> G
    F --> G
    G --> H[应用结果解决问题]

总之,MATLAB 的数值技术为我们解决各种复杂的数值问题提供了强大的工具。通过不断的实践和应用,我们可以更好地掌握这些技术,提高解决实际问题的能力。希望大家在今后的学习和工作中能够灵活运用这些方法,取得更好的成果。

内容概要:本文介绍了一个基于多传感器融合的定位系统设计方案,采用GPS、里程计和电子罗盘作为定位传感器,利用扩展卡尔曼滤波(EKF)算法对多源传感器数据进行融合处理,最终输出目标的滤波后位置信息,并提供了完整的Matlab代码实现。该方法有效提升了定位精度稳定性,尤其适用于存在单一传感器误差或信号丢失的复杂环境,如自动驾驶、移动采用GPS、里程计和电子罗盘作为定位传感器,EKF作为多传感器的融合算法,最终输出目标的滤波位置(Matlab代码实现)机器人导航等领域。文中详细阐述了各传感器的数据建模方式、状态转移观测方程构建,以及EKF算法的具体实现步骤,具有较强的工程实践价值。; 适合人群:具备一定Matlab编程基础,熟悉传感器原理和滤波算法的高校研究生、科研人员及从事自动驾驶、机器人导航等相关领域的工程技术人员。; 使用场景及目标:①学习和掌握多传感器融合的基本理论实现方法;②应用于移动机器人、无人车、无人机等系统的高精度定位导航开发;③作为EKF算法在实际工程中应用的教学案例或项目参考; 阅读建议:建议读者结合Matlab代码逐行理解算法实现过程,重点关注状态预测观测更新模块的设计逻辑,可尝试引入真实传感器数据或仿真噪声环境以验证算法鲁棒性,并进一步拓展至UKF、PF等更高级滤波算法的研究对比。
内容概要:文章围绕智能汽车新一代传感器的发展趋势,重点阐述了BEV(鸟瞰图视角)端到端感知融合架构如何成为智能驾驶感知系统的新范式。传统后融合前融合方案因信息丢失或算力需求过高难以满足高阶智驾需求,而基于Transformer的BEV融合方案通过统一坐标系下的多源传感器特征融合,在保证感知精度的同时兼顾算力可行性,显著提升复杂场景下的鲁棒性系统可靠性。此外,文章指出BEV模型落地面临大算力依赖高数据成本的挑战,提出“数据采集-模型训练-算法迭代-数据反哺”的高效数据闭环体系,通过自动化标注长尾数据反馈实现算法持续进化,降低对人工标注的依赖,提升数据利用效率。典型企业案例进一步验证了该路径的技术可行性经济价值。; 适合人群:从事汽车电子、智能驾驶感知算法研发的工程师,以及关注自动驾驶技术趋势的产品经理和技术管理者;具备一定自动驾驶基础知识,希望深入了解BEV架构数据闭环机制的专业人士。; 使用场景及目标:①理解BEV+Transformer为何成为当前感知融合的主流技术路线;②掌握数据闭环在BEV模型迭代中的关键作用及其工程实现逻辑;③为智能驾驶系统架构设计、传感器选型算法优化提供决策参考; 阅读建议:本文侧重技术趋势分析系统级思考,建议结合实际项目背景阅读,重点关注BEV融合逻辑数据闭环构建方法,并可延伸研究相关企业在舱泊一体等场景的应用实践。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值