31、MATLAB 中的高级数学运算:复数、微积分及相关应用

MATLAB 中的高级数学运算:复数、微积分及相关应用

1. 复数相关知识

1.1 复数的表示与创建

复数通常写成 $z = a + bi$ 的形式,其中 $a$ 是实部,$b$ 是虚部,$i$ 为 $\sqrt{-1}$。在工程中,也常写成 $a + bj$ 的形式。在 MATLAB 里, i j 是内置函数,可用来创建复数,如 5 + 2i 3 - 4j ,且虚部值与 i j 间无需乘号。

此外,MATLAB 还有 complex 函数用于创建复数,它可以接收两个数分别作为实部和虚部,或者只接收一个数作为实部,此时虚部为 0。示例代码如下:

>> z1 = 4 + 2i
z1 =
    4.0000 + 2.0000i
>> z2 = sqrt(-5)
z2 =
    0 + 2.2361i
>> z3 = complex(3,-3)
z3 =
    3.0000 - 3.0000i
>> z4 = 2 + 3j
z4 =
    2.0000 + 3.0000i
>> z5 = (-4) ^ (1/2)
ans =
    0.0000 + 2.0000i
>> myz = input('Enter a complex number: ')
Enter a complex number: 3 + 4i
myz =
    3.0000 + 4.0000i

1.2 复数的实部与虚部获取

MATLAB 提供了 real imag 函数来分别获取复数的实部和虚部。示例如下:

>> real(z1)
ans =
    4
>> imag(z3)
ans =
    -3

1.3 复数的打印

使用 disp 函数可自动显示复数的实部和虚部;而 fprintf 函数默认只打印实部,若要打印完整复数,需分别打印实部和虚部。示例如下:

>> disp(z1)
    4.0000 + 2.0000i
>> fprintf('%f\n', z1)
    4.000000
>> fprintf('%f %f\n', real(z1), imag(z1))
4.000000 2.000000
>> fprintf('%f + %fi\n', real(z1), imag(z1))
4.000000 + 2.000000i

1.4 复数的判断

isreal 函数用于判断一个数是否为实数,若参数无虚部则返回逻辑真(1),否则返回逻辑假(0)。示例如下:

>> isreal(z1)
ans =
    0
>> z5 = complex(3)
z5 =
    3
>> isreal(z5)
ans =
    0
>> isreal(3.3)
ans =
    1

1.5 复数的运算

1.5.1 相等判断

两个复数相等的条件是它们的实部和虚部都相等,在 MATLAB 中可使用相等运算符进行判断。示例如下:

>> z1 == z2
ans =
    0
>> complex(0,4) == sqrt(-16)
ans =
    1
1.5.2 加减运算

对于两个复数 $z_1 = a + bi$ 和 $z_2 = c + di$,有 $z_1 + z_2 = (a + c) + (b + d)i$,$z_1 - z_2 = (a - c) + (b - d)i$。下面是实现复数相加的两种方法:

% 编程概念方法
addcomp.m
function outc = addcomp(z1, z2)
% Adds two complex numbers and returns the result
% Adds the real and imaginary parts separately
realpart = real(z1) + real(z2);
imagpart = imag(z1) + imag(z2);
outc = realpart + imagpart * i;
>> addcomp(3+4i, 2-3j)
ans =
    5.0000 + 1.0000i

% 高效方法
addcomp2.m
function outc = addcomp2(z1,z2)
% Adds two complex numbers and returns the result
outc = z1 + z2;
>> addcomp2(3+4i, 2-3j)
ans =
    5.0000 + 1.0000i
1.5.3 乘法运算

两个复数相乘的公式为 $z_1 * z_2 = (a + bi) * (c + di) = (a c - b d) + (a d + c b)i$。示例如下:

>> z1 = 3 + 4i
z1 =
    3.0000 + 4.0000i
>> z2 = 1 - 2i
z2 =
    1.0000 - 2.0000i
>> z1 * z2
ans =
    11.0000 - 2.0000i
1.5.4 共轭与绝对值

复数 $z = a + bi$ 的共轭复数为 $\overline{z} = a - bi$,绝对值为 $|z| = \sqrt{a^2 + b^2}$。在 MATLAB 中,可使用 conj 函数求共轭复数, abs 函数求绝对值。示例如下:

>> z1 = 3 + 4i
z1 =
    3.0000 + 4.0000i
>> conj(z1)
ans =
    3.0000 - 4.0000i
>> abs(z1)
ans =
    5

1.6 复数方程表示为多项式

MATLAB 用系数行向量表示多项式,当表达式或方程涉及复数时也适用。例如,多项式 $z^2 + z - 3 + 2i$ 可用向量 [1 1 -3 + 2i] 表示。可使用 roots 函数求多项式方程的根, polyval 函数求多项式在某点的值。示例如下:

>> roots([1 1 -3+2i])
ans =
    -2.3796 + 0.5320i
    1.3796 - 0.5320i
>> cp = [1 1 -3+2i]
cp =
    1.0000
    1.0000
    -3.0000 + 2.0000i
>> polyval(cp,3)
ans =
    9.0000 + 2.0000i

1.7 复数的极坐标形式

任何复数 $z = a + bi$ 可看作复平面上的点 $(a,b)$ 或向量,它也可用极坐标 $(r, \theta)$ 表示,其中 $r$ 是向量的模,$\theta$ 是角度。转换公式如下:
- 极坐标转直角坐标:$a = r \cos \theta$,$b = r \sin \theta$
- 直角坐标转极坐标:$r = \sqrt{a^2 + b^2}$,$\theta = \arctan(\frac{b}{a})$

在 MATLAB 中,可使用 abs 函数求 $r$, angle 函数求 $\theta$。示例如下:

>> z1 = 3 + 4i;
r = abs(z1)
r =
    5
>> theta = angle(z1)
theta =
    0.9273
>> r*exp(i*theta)
ans =
    3.0000 + 4.0000i

1.8 复数的绘图

常见的复数数据绘图方法有:
- 用 plot 函数绘制实部与虚部的关系
- 用 plot 函数只绘制实部
- 用 plot 函数在一个图中绘制实部和虚部并添加图例
- 用 polar 函数绘制模和角度

使用 plot 函数处理单个复数或复数向量时,会绘制实部与虚部的关系,例如 plot(z) 等同于 plot(real(z), imag(z)) 。示例如下:

>> z1 = 3 + 4i;
>> plot(z1,'*', 'MarkerSize', 12)
>> xlabel('Real part')
>> ylabel('Imaginary part')
>> title('Complex number')

2. 微积分相关知识

2.1 积分

2.1.1 梯形法则

梯形法则是一种近似计算曲线下面积的简单方法,其公式为 $\frac{(f(a) + f(b))(b - a)}{2}$。在 MATLAB 中可通过自定义函数或使用内置的 trapz 函数实现。示例如下:

% 编程概念方法
trapint.m
function int = trapint(fnh, a, b)
% approximates area under a curve using a
% trapezoid
int = (b-a) * (fnh(a) + fnh(b))/2;
>> f = @ (x) 3 .* x .^ 2 - 1;
approxint = trapint(f, 2, 4)
approxint =
    58

% 高效方法
>> x = [2 4];
>> y = f(x);
>> trapz(x,y)
ans =
    58

若将区间 $[a, b]$ 划分为 $n$ 个小区间,对每个小区间应用梯形法则并求和,可提高计算精度。示例如下:

% 编程概念方法
trapintn.m
function intsum = trapintn(fnh, lowrange,highrange, n)
% implements trapezoidal rule using n intervals
intsum = 0;
increm = (highrange - lowrange)/n;
for a = lowrange: increm : highrange - increm
    b = a + increm;
    intsum = intsum + (b-a) * (fnh(a) + fnh(b))/2;
end
>> trapintn(f,2,4,2)
ans =
    55

% 高效方法
>> x = 2:4;
>> y = f(x)
>> trapz(x,y)
ans =
    55

此外,MATLAB 还有 quad 函数,它使用辛普森方法进行积分计算。示例如下:

>> quad(f,2,4)
ans =
    54

2.2 微分

函数 $y = f(x)$ 的导数表示为 $\frac{dy}{dx}$ 或 $f’(x)$,定义为因变量 $y$ 相对于自变量 $x$ 的变化率,即函数在某点切线的斜率。

MATLAB 中的 polyder 函数可求多项式的导数, polyval 函数可求导数在某些点的值。示例如下:

>> origp = [1 2 -4 3];
>> diffp = polyder(origp)
diffp =
    3
    4
    -4
>> polyval(diffp, 1:3)
ans = 
    3
    16
    35

导数也可通过极限 $\lim_{h \to 0} \frac{f(x + h) - f(x)}{h}$ 定义,在 MATLAB 中可使用 diff 函数近似计算导数。示例如下:

>> f = @ (x) x .^ 3 + 2 .* x .^ 2 - 4 .* x + 3;
>> x = 1:3;
>> y = f(x)
y =
    2
    11
    36
>> diff(y)
ans =
    9 25
>> diff(x)
ans =
    1 1
>> diff(y) ./ diff(x)
ans = 
    9
    25

2.3 符号数学工具箱中的微积分运算

符号数学工具箱中有多个函数可进行符号微积分运算,如 diff 用于求导, int 用于积分, limit 用于求极限。示例如下:

% 求不定积分
>> syms x
>> int(3*x^2 - 1)
ans =
x^3-x

% 求定积分
>> int(3*x^2 - 1, 2, 4)
ans =
54

% 求极限
>> syms x h
>> f = @ (x) x .^3 + 2 .*x.^2 - 4 .* x + 3
>> limit((f(x+h)-f(x))/h,h,0)
ans =
3*x^2-4+4*x

% 符号求导
>> syms x f
>> f = x^3 + 2*x^2 - 4*x + 3
f =
x^3+2*x^2-4*x+3
>> diff(f)
ans =
3*x^2-4+4*x

3. 常见陷阱与编程风格指南

3.1 常见陷阱

  • 忘记 fprintf 函数默认只打印复数的实部。
  • 外推距离数据集过远。

3.2 编程风格指南

曲线拟合效果越好,插值和外推的值就越精确。

4. 练习题

4.1 多项式相关

  • 用系数行向量表示多项式 $2x^3 - 3x^2 + x + 5$ 和 $3x^4 + x^2 + 2x - 4$。
  • 求函数 $f(x) = 3x^2 - 2x - 5$ 的根,并绘制该函数在 $[-3, 3]$ 区间的图像。
  • 计算多项式 $3x^3 + 4x^2 + 2x - 2$ 在 $x = 4$,$x = 6$ 和 $x = 8$ 处的值。
  • 对于多项式 pol = [3 6 5] ,用 roots 函数求根并绘图,然后将 pol 的最后一个数改为 -7 再次求根并绘图。

4.2 数据拟合相关

  • 创建向量 x 包含整数 1 到 20,向量 y 包含 20 个范围在 $[-2, 2]$ 的随机整数,拟合一条直线并绘图。
  • 根据给定的肺压力 - 体积数据,编写脚本拟合直线并绘图,直线斜率为肺和胸壁的实际顺应性。
  • 根据给定的电路电压 - 时间数据,拟合直线并确定电压为 5 时的时间。
  • 生成 10 个范围在 $[0, 100]$ 的随机整数,拟合直线并绘图以检验其均匀分布性。
  • 编写函数处理数据点向量,若向量长度不同则打印错误信息,否则拟合随机次数的多项式并绘图。
  • 编写函数 halffit 对温度数据进行二次插值,绘制原始数据、插值数据和插值曲线。
  • 编写函数 fitsubs 图形化显示不同次数多项式拟合数据的差异。
  • 对四个点拟合直线和二次曲线并绘图。
  • 根据给定的温度 - 时间数据,创建向量、绘图、拟合曲线并确定温度为 60 度和 65 度时的时间。

4.3 数据文件相关

  • 对于汽车距离 - 速度数据,存储到文件中并读取,拟合直线并绘图。
  • 编写函数处理数据点向量,在一个图中绘制数据点、二阶多项式和三阶多项式。
  • 根据雪深数据文件,拟合二次曲线预测雪完全融化的周数并绘图。
  • 根据公司成本 - 销售数据文件,绘制成本、销售和利润的柱状图并外推下一季度的成本。

4.4 复数相关

  • 存储复数 $3 - 2i$ 和 $\sqrt{-3}$ 到变量中并以 $a + bi$ 的形式打印。
  • 创建复数变量 $c_1 = 2 - 4i$ 和 $c_2 = 5 + 3i$,进行加减、乘法运算,求共轭复数和模,并转换为极坐标形式。
  • 将表达式 $z^3 - 2z^2 + 3 - 5i$ 用系数行向量表示,求解方程 $z^3 - 2z^2 + 3 - 5i = 0$ 并求 $z = 2$ 时多项式的值。
  • 确定如何使用 polar 函数绘制复数的极坐标图。
  • 将实部和虚部分别存储的变量合并为复数。

4.5 微积分相关

  • 用符号函数 int 求函数 $4x^2 + 3$ 的不定积分和从 $x = -1$ 到 $x = 3$ 的定积分,并用 trapz 函数近似计算。
  • quad 函数近似计算曲线 $4x^2 + 3$ 在 $[-1, 3]$ 区间下的面积。
  • polyder 函数求多项式 $2x^3 - x^2 + 4x - 5$ 的导数。

5. 总结

本文介绍了 MATLAB 中复数和微积分的相关知识,包括复数的表示、运算、极坐标形式和绘图,以及积分、微分的计算方法和符号数学工具箱中的微积分运算。同时,还给出了常见陷阱、编程风格指南和大量练习题,有助于读者深入理解和掌握这些知识。

通过学习这些内容,读者可以利用 MATLAB 解决各种高级数学问题,如复数方程求解、曲线积分和微分计算等。在实际应用中,应根据具体问题选择合适的方法和函数,以提高计算效率和精度。

希望本文能为读者在 MATLAB 高级数学运算方面提供有价值的参考,帮助读者更好地运用 MATLAB 进行科学计算和数据分析。

6. 知识梳理与对比

6.1 复数运算方法对比
运算类型 手动编程方法 MATLAB 内置函数方法
加法 分离实部和虚部相加
matlab<br>function outc = addcomp(z1, z2)<br>realpart = real(z1) + real(z2);<br>imagpart = imag(z1) + imag(z2);<br>outc = realpart + imagpart * i;<br>end<br>
直接使用加法运算符
matlab<br>function outc = addcomp2(z1,z2)<br>outc = z1 + z2;<br>end<br>
乘法 按照公式 $(a + bi) * (c + di) = (a c - b d) + (a d + c b)i$ 手动计算 直接使用乘法运算符
共轭 手动编写函数改变虚部符号 使用 conj 函数
matlab<br>conj(z1)<br>
绝对值 手动编写函数计算 $\sqrt{a^2 + b^2}$ 使用 abs 函数
matlab<br>abs(z1)<br>
6.2 积分方法对比
积分方法 原理 MATLAB 实现 精度
梯形法则(单区间) 用梯形面积近似曲线下面积 $\frac{(f(a) + f(b))(b - a)}{2}$ 自定义函数或使用 trapz 函数(单区间)
matlab<br>function int = trapint(fnh, a, b)<br>int = (b-a) * (fnh(a) + fnh(b))/2;<br>end<br>
matlab<br>trapz(x,y)<br>
较低
梯形法则(多区间) 将区间划分成多个小区间,每个小区间用梯形面积近似并求和 自定义函数或使用 trapz 函数(多区间)
matlab<br>function intsum = trapintn(fnh, lowrange,highrange, n)<br>intsum = 0;<br>increm = (highrange - lowrange)/n;<br>for a = lowrange: increm : highrange - increm<br> b = a + increm;<br> intsum = intsum + (b-a) * (fnh(a) + fnh(b))/2;<br>end<br>end<br>
matlab<br>trapz(x,y)<br>
中等
辛普森方法 使用更复杂的多项式近似曲线 使用 quad 函数
matlab<br>quad(f,2,4)<br>
较高

7. 操作流程总结

7.1 复数操作流程
graph TD;
    A[创建复数] --> B[进行复数运算];
    B --> C[获取实部和虚部];
    C --> D[判断是否为实数];
    D --> E[转换为极坐标形式];
    E --> F[绘制复数图形];
7.2 微积分操作流程
graph TD;
    A[定义函数] --> B[选择积分或微分方法];
    B --> C{积分或微分};
    C -- 积分 --> D[选择积分方法(梯形法则或辛普森方法)];
    D --> E[计算积分值];
    C -- 微分 --> F[选择微分方法(`polyder` 或 `diff`)];
    F --> G[计算导数值];

8. 进一步拓展思考

8.1 复数在实际中的应用

复数在信号处理、电路分析、量子力学等领域有广泛应用。例如在电路分析中,交流电路的电压和电流可以用复数表示,通过复数运算可以方便地计算电路的阻抗、功率等参数。在信号处理中,复数常用于表示相位和幅度,进行滤波、调制等操作。

8.2 微积分在科学计算中的重要性

微积分是科学计算的基础,在物理学、工程学、经济学等领域都有重要应用。例如在物理学中,通过积分可以计算物体的位移、速度、加速度等物理量;通过微分可以研究物体的运动状态变化。在工程学中,微积分可以用于优化设计、控制理论等方面。

9. 回顾与展望

本文全面介绍了 MATLAB 中复数和微积分的相关知识,通过详细的代码示例和操作步骤,帮助读者掌握这些知识的实际应用。同时,通过知识梳理和对比,让读者更清晰地了解不同方法的优缺点。

在未来的学习和工作中,读者可以进一步深入研究这些知识,探索它们在更多领域的应用。例如,可以结合机器学习算法,利用微积分进行模型的优化;利用复数进行更复杂的信号处理和数据分析。希望读者能够不断实践和探索,将这些知识运用到实际问题中,发挥 MATLAB 的强大功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值