25、MATLAB特定应用:从统计到微积分的实用指南

MATLAB特定应用:从统计到微积分的实用指南

1. 稳健统计理解

稳健统计是一种描述性统计形式,它会舍弃极端值,以便进行变化较小且潜在误差较少的分析。当极端值可能存在误差时,就可以使用稳健统计。例如,在比较当今司机与1940年司机的平均身高时,就可以运用它。但在建造桥梁时则不适用,因为在这种情况下极端值很重要。

在不使用任何专业工具箱的情况下,在MATLAB中创建稳健统计的最佳方法是直接从向量中消除最大和最小的值。具体操作如下:
- 去除最大值 :使用 a(a == max(a)) = []; 命令。其中 max(a) 用于找到向量 a 中的最大值, (a == max(a)) 告诉MATLAB找到最大值所在的索引,然后将该元素设置为空值,从而删除它。
- 去除最小值 :使用 a(a == min(a)) = []; 命令,这里用 min(a) 函数替代了 max(a)

为了验证更改是否成功,可以使用 std() (标准偏差)函数。随着去除大值和小值,会看到 std() 输出值逐渐变小。

2. 最小二乘法拟合

最小二乘法拟合是一种确定最适合一组点的曲线的方法。在进行许多任务时,可能需要符号数学工具箱,但最小二乘法拟合是可以在不使用该工具箱的情况下完成的任务之一。下面分别介绍仅使用MATLAB和结合符号数学工具箱的操作方法。

2.1 仅使用MATLAB

仅使用MATLAB计算最小二乘法拟合信息需要进行大量的输入,以下是具体步骤:
1. 输入 XSource = 1:1:10; 并按回车键。
2. 输入 YSource = [1, 2, 3.5, 5.5, 4, 3.9, 3.7, 2, 1.9, 1.5]; 并按回车键。 XSource YSource 向量创建了一组用于最小二乘法拟合的点,两个向量的大小必须相同。
3. 输入 plot(XSource, YSource) 并按回车键,会看到这些点的绘图,这有助于直观理解该过程。
4. 输入 fun = @(p) sum((YSource - (p(1)*cos(p(2)*XSource)+p(2)*sin(p(1)*XSource))).^2); 并按回车键。这是一个函数,可用于自动化处理复杂方程的过程。该函数接受一个输入,即对最小二乘法拟合参数的猜测。
5. 输入 Guess = [2, 2]; 并按回车键。为了使函数正常工作,必须提供一个猜测值,猜测值会影响函数的输出。
6. 输入 [p, fminres] = fminsearch(fun, Guess) 并按回车键。 fminsearch() 函数接受创建的函数和猜测值,对函数进行无约束的非线性优化。例如,可能会得到如下输出:

p =
    1.6204    1.8594
fminres =
  104.9327

使用这种方法时,可以将 p 的输出值用于下一次猜测。例如,输入 Guess = [1.6204, 1.8594] 并按回车键更改猜测值,然后再次输入 [p, fminres] = fminsearch(fun, Guess) 并按回车键,会得到新的输出值。

2.2 使用MATLAB和符号数学工具箱

使用符号数学工具箱时,可以借助MuPAD使操作更简便,并且该工具箱能通过为你执行一些计算来大大减少工作量。以下步骤假设已安装符号数学工具箱,并完成了相关基础操作:
1. 点击Apps选项卡上的MuPAD Notebook条目,打开MuPAD,会看到一个新的笔记本打开。
2. 输入 XSource := [1, 2, 3, 4, 5, 6, 7, 8, 9,10]: 并按回车键。此命令创建的 XSource 向量与前面示例中的相同,使用 := 进行赋值,语句末尾添加冒号 : 可防止MuPAD提供输出。
3. 输入 YSource := [1, 2, 3.5, 5.5, 4, 3.9, 3.7, 2, 1.9, 1.5]: 并按回车键,这与前面示例中的元素集相同,此时已获得最小二乘法拟合所需的点。
4. 输入 stats::reg(XSource,YSource,p1*cos(p2*x)+p2*sin(p1*x),[x],[p1,p2],StartingValues=[2, 2]) 并按回车键。这个长语句执行的任务与前面仅使用MATLAB示例中的步骤4、5和6相同,虽然看起来更复杂,但实际上节省了步骤。输出中的 1.620458778, 1.859399122 部分是参数,可以用它们进行下一次猜测。
5. 高亮显示方程中的 2, 2 部分,输入 1.620458778, 1.859399122 ,MuPAD会用新输入的值替换旧值。
6. 按回车键,会看到更新后的值,这些值与仅使用MATLAB的解决方案输出的值非常接近。

使用符号数学工具箱可以通过减少寻找解决方案所需的步骤来节省时间和精力,且输出与仅使用MATLAB时并无不同,最大的时间节省在于能够更快、更轻松地进行猜测。

3. 线性代数应用

线性代数可用于在MATLAB中对矩阵执行许多任务,以下是一些具体应用:

3.1 行列式计算

行列式用于分析和求解线性方程组。非零值表示矩阵是非奇异的,方程组有唯一解;值为1通常表示矩阵是幺模矩阵,即实方阵。使用 det() 函数获取行列式值,提供一个矩阵作为输入,输出值会告知该矩阵是否有解。

同样重要的是 cond() 函数,它用于测试奇异矩阵。输入一个矩阵,输出会提供一个条件数,用于指定矩阵对误差的敏感度。输出值接近1表示矩阵是良态的。

以下是示例代码:

% 创建一个奇异矩阵
A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
cond_A = cond(A); % 条件数
det_A = det(A); % 行列式值

% 创建一个幺模矩阵
B = [2, 3, 2; 4, 2, 3; 9, 6, 7];
cond_B = cond(B);
det_B = det(B);

disp(['矩阵A的条件数: ', num2str(cond_A)]);
disp(['矩阵A的行列式值: ', num2str(det_A)]);
disp(['矩阵B的条件数: ', num2str(cond_B)]);
disp(['矩阵B的行列式值: ', num2str(det_B)]);
矩阵 条件数 行列式值
A 3.8131e+16 6.6613e-16
B 313.1721 1.0000

3.2 矩阵约简

约简可以帮助了解矩阵所代表的结构,并写出方程组的解。MATLAB提供了 rref() 函数来生成行最简形(RREF)。

以下是使用 rref() 求解线性方程 A*x = y 的步骤:
1. 输入 y = [1; 0; 0; 0; 0]; 并按回车键。
2. 输入 A = magic(5); 并按回车键, magic() 函数可生成任意大小的幻方矩阵。
3. 输入 B = rref([A, y]) 并按回车键,会得到如下输出:

B =
1.0000       0       0       0       0   -0.0049
     0  1.0000       0       0       0    0.0431
     0       0  1.0000       0       0   -0.0303
     0       0       0  1.0000       0    0.0047
     0       0       0       0  1.0000    0.0028
  1. 输入 x = B(:, 6) 并按回车键,得到:
x =
   -0.0049
    0.0431
   -0.0303
    0.0047
    0.0028
  1. 输入 A * x 并按回车键,输出如下:
ans =
    0.9999
   -0.0001
   -0.0001
   -0.0001
   -0.0001

可以看到输出值与原始的 y 值非常接近,证明了方程 A * x = y 成立。

3.3 特征值计算

特征值 v 是方阵的特征向量。当非零矩阵 A v 相乘时,会得到 v 的一个常数倍,通常用 λ 表示,特征值由方程 Av = λv 定义。特征值在图形处理和解析几何等领域有广泛应用。

以下是计算特征值的示例:

A = gallery('riemann', 4); % 创建测试矩阵
lambda = eig(A); % 计算特征值
disp(['矩阵A的特征值: ', num2str(lambda')]);

输出结果为:

lambda =
   -0.1249
    2.0000
    3.3633
    4.7616

3.4 因式分解

因式分解是将一个对象(如数字、多项式或矩阵)分解的过程,其目的是降低对象的复杂度,使其更易于理解和求解,还能帮助确定对象的构成方式。在MATLAB中使用 factor() 函数进行因式分解,它可以用于处理数字、多项式和矩阵。

  • 处理数字 :直接提供数字作为输入,例如:
factor_2 = factor(2); % 输出为 2
factor_12 = factor(12); % 输出为 [2, 2, 3]
disp(['2的因式分解结果: ', num2str(factor_2)]);
disp(['12的因式分解结果: ', num2str(factor_12')]);
  • 处理多项式 :首先使用 syms 声明符号对象,例如:
syms x y;
result = factor(x^2 + 2*x*y + y^2); % 输出为 (x + y)^2
disp(['多项式因式分解结果: ', char(result)]);
  • 处理矩阵 :创建矩阵后,将矩阵包含在 sym() 函数中,以便 factor() 函数能够接受它,例如:
A = magic(4);
factor_A = factor(sym(A));
disp('矩阵因式分解结果:');
disp(factor_A);

输出结果为:

ans =
[ 2^4,   2,   3,    13]
[   5,  11, 2*5,   2^3]
[ 3^2,   7, 2*3, 2^2*3]
[ 2^2, 2*7, 3*5,     1]

4. 微积分应用

微积分可以解决许多代数无法解决的问题,它主要分为微分微积分和积分微积分两部分,以下是在MATLAB中使用符号数学工具箱解决一些简单微积分问题的示例:

4.1 微分微积分

MATLAB提供了良好的微分微积分支持,以下是单变量微分的示例步骤:
1. 输入 syms x 并按回车键,创建一个符号对象用于计算。
2. 输入 f(x) = sin(x^3) 并按回车键,创建用于计算的符号函数。
3. 输入 Result = diff(f) 并按回车键,输出结果为:

Result(x) =
3*x^2*cos(x^3)
  1. 输入 plot(Result(1:50)) 并按回车键,会得到一个绘图,展示了原符号函数微分的结果。

4.2 积分微积分

MATLAB在积分微积分方面也有很好的支持,以下是单变量积分的示例步骤:
1. 输入 syms x 并按回车键,创建符号对象。
2. 输入 f(x) = (x^3 + 3*x^2) / x^3 并按回车键,创建符号函数。
3. 输入 Result = int(f, x) 并按回车键,输出结果为:

Result(x) =
x + 3*log(x)
  1. 输入 plot(Result(1:50)) 并按回车键,会得到一个绘图,展示了原符号函数积分的结果。

4.3 多元微积分

许多问题涉及多个变量,以下是一个多元微积分的示例步骤:
1. 输入 syms x y 并按回车键,创建两个符号对象。
2. 输入 f(x, y) = x^2 * sin(y) 并按回车键,创建接受两个输入的符号函数。
3. 输入 Result = diff(f) 并按回车键,输出结果为:

Result(x, y) =
2*x*sin(y)

这里默认是对 x 求导。若要对 y 求导( df/dy ),则输入 diff(f, y)
4. 输入 plot(Result(1:50, 1:50)) 并按回车键,会得到一个绘图。需要注意的是,这里必须同时提供 x y 输入,且两个向量的元素数量必须相同,否则MATLAB会抛出异常。

通过以上内容,可以看到MATLAB在统计、线性代数和微积分等方面都有强大的功能,能够帮助解决各种实际问题。

5. 操作流程总结

为了更清晰地展示上述操作的流程,下面通过 mermaid 格式的流程图进行总结。

5.1 最小二乘法拟合流程

graph LR
    A[开始] --> B[创建 XSource 和 YSource 向量]
    B --> C[绘制点图]
    C --> D[定义函数 fun]
    D --> E[提供猜测值 Guess]
    E --> F[fminsearch 函数优化]
    F --> G[输出结果 p 和 fminres]
    G --> H{是否需要新猜测?}
    H -- 是 --> I[更新 Guess]
    I --> F
    H -- 否 --> J[结束]

5.2 线性方程求解流程(使用 rref)

graph LR
    A[开始] --> B[创建向量 y]
    B --> C[创建矩阵 A]
    C --> D[构建增广矩阵 [A, y]]
    D --> E[rref 函数化简]
    E --> F[提取解 x]
    F --> G[验证方程 A * x = y]
    G --> H[结束]

5.3 微积分计算流程

graph LR
    A[开始] --> B[创建符号对象]
    B --> C[定义符号函数 f]
    C --> D{微分或积分?}
    D -- 微分 --> E[使用 diff 函数计算]
    D -- 积分 --> F[使用 int 函数计算]
    E --> G[绘制结果图]
    F --> G
    G --> H[结束]

6. 注意事项与技巧

6.1 稳健统计

  • 在使用稳健统计时,要明确极端值是否会对分析产生较大误差。例如在分析司机身高时,极端值可能是测量误差导致,此时使用稳健统计可以得到更可靠的结果;但在建造桥梁等场景中,极端值可能是关键因素,不能随意舍弃。
  • 验证更改是否成功时, std() 函数输出值变小并不一定意味着结果更准确,还需要结合具体问题进行判断。

6.2 最小二乘法拟合

  • 猜测值对函数输出有较大影响,初始猜测可以根据经验或问题的特点进行选择。如果初始猜测不合理,可能会导致函数收敛速度变慢或无法收敛。
  • 使用符号数学工具箱时,虽然可以节省时间和精力,但也要注意输入的准确性,特别是在替换猜测值时,要确保新值的正确性。

6.3 线性代数

  • 在使用 det() cond() 函数时,要理解它们的输出含义。条件数接近 1 表示矩阵是良态的,但在实际应用中,可能会遇到条件数较大但仍然可以接受的情况,需要根据具体问题进行判断。
  • 进行矩阵约简时,要注意矩阵的类型和性质。非奇异矩阵可以约简为单位矩阵,但奇异矩阵可能无法得到理想的结果。

6.4 微积分

  • 在进行多元微积分计算时,要明确求导或积分的变量。默认情况下, diff() 函数对第一个变量求导,如果需要对其他变量求导,要明确指定变量。
  • 绘制结果图时,要确保输入的向量元素数量相同,否则会导致 MATLAB 抛出异常。

7. 总结

MATLAB 作为一款强大的科学计算软件,在统计、线性代数和微积分等领域都有广泛的应用。通过稳健统计可以处理可能存在误差的极端值,最小二乘法拟合可以找到最适合一组点的曲线,线性代数可以对矩阵进行各种操作,微积分可以解决许多代数无法解决的问题。

同时,符号数学工具箱的使用可以大大简化计算过程,节省时间和精力。在实际应用中,要根据具体问题选择合适的方法和工具,并注意操作的准确性和合理性。通过不断练习和实践,能够更好地掌握 MATLAB 的功能,解决各种复杂的科学计算问题。

希望本文的内容能够帮助读者更好地理解和应用 MATLAB,在实际工作和学习中发挥更大的作用。

应用领域 关键函数 示例代码
稳健统计 max() , min() , std() a(a == max(a)) = [];
最小二乘法拟合 fminsearch() , stats::reg [p, fminres] = fminsearch(fun, Guess);
线性代数 det() , cond() , rref() , eig() , factor() det(A); cond(A); rref([A, y]); eig(A); factor(sym(A));
微积分 diff() , int() diff(f); int(f, x);

以上表格总结了各个应用领域的关键函数和示例代码,方便读者快速查阅和使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值