描述
开 本: 32开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302456797丛书名: 精通MATLAB
本书作为数值计算方法或数学实验的学习用书,可以作为广大在校本科生和研究生基本数学实验的学习用书,也可以作为广大科研人员、学者、工程技术人员的参考用书。
目录
第1章MATLAB R2015b软件编程基础
1.1MATLAB的简概
1.1.1MATLAB发展史
1.1.2MATLAB产品说明
1.1.3MATLAB的特点
1.1.4MATLAB R2015b新功能
1.2MATLAB应用实例
1.3MATLAB工作环境
1.4MATLAB帮助使用
1.5MATLAB语言基本元素
1.5.1变量
1.5.2赋值语句
1.5.3矩阵及其元素表示
1.6矩阵运算
1.6.1矩阵的代数运算
1.6.2矩阵的关系运算
1.6.3矩阵的逻辑运算
1.7MATLAB的程序流程
1.7.1循环控制结构
1.7.2条件选择结构
1.8M文件编写
1.8.1脚本文件
1.8.2函数文件
第2章MATLAB R2015b可视化功能
2.1图形绘制的基本步骤
2.2二维绘图
2.2.1基本二维绘图
2.2.2格栅
2.2.3文字说明
2.2.4坐标轴设置
2.2.5图形迭绘
2.2.6子图绘制
2.2.7交互式绘图
2.2.8双坐标轴绘制
2.2.9函数绘图
2.2.10二维特殊图形
2.3三维绘图
2.3.1曲线图
2.3.2网格图
2.3.3曲面图
2.3.4光照模型
2.3.5等值线
2.3.6三维特殊图形
2.3.7视角设置
2.4四维绘图
2.5图形用户界面
2.5.1图形用户界面控件
2.5.2对话框对象
2.5.3界面菜单
2.6图形用户界面的应用
第3章符号与多项式运算
3.1符号及其运算
3.1.1字符型数据变量的创建
3.1.2符号型数据变量的创建
3.1.3符号计算的运算符与函数
3.1.4寻找符号变量
3.1.5符号精度计算
3.1.6显示符号表达式
3.1.7合并符号表达式
3.1.8展开符号表达式
3.1.9嵌套符号表达式
3.1.10分解符号表达式
3.1.11化简符号表达式
3.1.12替换符号表达式
3.1.13符号函数的操作
3.1.14符号微积分
3.1.15符号积分变换
3.2多项式及其运算
3.2.1多项式的求根
3.2.2多项式的四则运算
3.2.3多项式的导数
3.2.4多项式的积分
3.2.5多项式的估值
3.2.6有理多项式
3.2.7多项式的微分
第4章数据插值
4.1概述
4.2插值函数
4.2.1一维插值
4.2.2二维插值
4.2.3三维插值
4.2.4n维插值
4.2.5栅格数据插值
4.2.6三次样条插值
4.2.7分段三次插值
4.3拉格朗日插值法
4.4牛顿插值
4.5等距节点插值公式
4.6插值中的龙格现象
4.7Hermite插值
4.8艾特肯插值
4.9拉格朗日插值与埃尔米特插值的比较
4.10拉格朗日插值式与三次样条插值的比较
第5章数据逼近
5.1一般提法
5.2Chebshev一致逼近
5.3正交多项式
5.4Legendre多项式
5.5Laguerre多项式
5.6Hermite多项式
5.7Pade逼近
5.8平方逼近
第6章数据估计与拟合
6.1小二乘估计
6.1.1线性小二乘的基本公式
6.1.2小二乘估计的原理
6.1.3超定方程组的小二乘解
6.1.4小二乘法估计的SVD分解
6.1.5小二乘拟合
6.2GaussMarkov估计
6.3正交小二乘拟合
6.4加权小方差拟合
6.5指数拟合
6.6Kalman滤波
6.7人口增长模型
6.7.1Malthus人口模型
6.7.2Logistic人口模型
第7章矩阵分解与线性方程组的求解
7.1矩阵的分解
7.1.1LU分解
7.1.2Cholesky分解
7.1.3QR分解
7.1.4Schur分解
7.1.5奇异值分解
7.1.6特征值分解
7.1.7Hessenberg分解
7.2求逆法求解线性方程组
7.3分解法求解线性方程组
7.3.1LU分解法求解线性方程
7.3.2QR分解法求解线性方程组
7.3.3Cholesky分解法求解线性方程组
7.3.4SVD分解法求解线性方程组
7.4消去法求解线性方程组
7.4.1高斯消元法
7.4.2高斯列消去法
7.5迭代法求解线性方程组
7.5.1Jacobi迭代法
7.5.2GaussSeidel迭代法
7.5.3SOR迭代法
7.6梯度法
7.6.1共轭梯度法
7.6.2双共轭梯度法
7.6.3稳定双共轭梯度法
7.6.4共轭梯度的LSQR法
7.6.5复共轭梯度法
7.7残差法
7.7.1小残差法
7.7.2标准小残差法
7.7.3广义小残差法
7.8综合实例分析
第8章非线性方程与非线性方程组求解
8.1MATLAB内置函数求解非线性方程
8.1.1roots函数求解非线性方程
8.1.2fzero函数求解非线性方程
8.1.3fsolve函数求解非线性方程组
8.1.4solve函数求解非线性方程
8.2数值法求解非线性方程
8.2.1二分法
8.2.2不动点迭代
8.2.3Aitken加速法
8.2.4Steffensen迭代法
8.2.5牛顿迭代法
8.2.6重根法
8.2.7割线法
8.2.8Halley迭代法
8.2.9抛物线法
8.3数值法求解非线性方程组
8.3.1高斯塞德尔迭代法
8.3.2不动点迭代法
8.3.3牛顿迭代法
8.3.4简化牛顿迭代法
8.3.5拟牛顿法
8.3.6速下降法
8.3.7松弛迭代法
第9章数值积分
9.1中点公式
9.2插值型求积公式
9.3梯形求积公式
9.3.1梯形求积公式
9.3.2复合梯形公式
9.4Simpson公式
9.4.1Simpson求积公式
9.4.2复合Simpson公式
9.5NewtonCotes求积分公式
9.6复合抛物线求积公式
9.7自适应步长公式
9.7.1自适应步长梯形公式
9.7.2自适应步长Simpson公式
9.7.3Romberg求积公式
9.8高精度求积公式
9.8.1高斯型求积公式
9.8.2Lobatto求积公式
9.9曲线与曲面积分
9.9.1型曲线积分
9.9.2第二型曲线积分
9.9.3型曲面积分
9.9.4第二曲面积分
9.10数值积分的MATLAB实现
第10章微分方程
10.1微分方程的概述
10.2常微分方程
10.2.1单步法
10.2.2RungeKutta法
10.2.3单步法的收敛性
10.2.4单步法的稳定性
10.3线性多步法
10.3.1Adams外推公式
10.3.2Adams内插法
10.4微分方程的数值计算
10.4.1一阶微分方程组
10.4.2刚性方程组
10.4.3阻尼振动方程
10.4.4打靶法
10.5常微分方程的符号解法
10.6常微分方程的数值解
10.6.1初值问题求解
10.6.2延迟微分方程的求解
10.6.3常微分方程的边界问题
10.7偏微分方程
10.7.1定解问题
10.7.2差分解法
10.8偏微分方程的数值解
10.8.1求解偏微分方程组
10.8.2边界条件及网格化
10.8.3二阶偏微分方程
参考文献
前言
在信息时代,科学技术出现了前所未有的发展,其中数学应用的广泛性和深入性是现代科技发展的重要特征。数学与科学计算、理论研究、科学实验成为科学研究的三大支柱,计算机成为不可或缺的工具。现代数学是自然科学的基本语言,既是应用模式探讨现实世界的主要手段,也是现代工业技术和工程必不可少的工具。数学的学习对于人的素质的培养,至少应该在以下四个方面发挥作用。(1) 创造。数学能激发人的创造本能,它使人敢于突破常规,不迷信书本、权威; (2) 归纳。从众多的事物和现象中找出共同性,发掘体现本质内涵的抽象化的思想; (3) 演绎。从已知的事理中推知新的事实的逻辑性思想; (4) 数学建模。对现象和过程进行合理的抽象和量化,然后运用数学运算来进行模拟(包括计算机模拟)和验证的一种模式化思维。早在1959年,著名的数学家华罗庚教授就曾形象地概述了数学的各种应用: “宇宙之大,粒子之微,火箭之速,化工之巧,地球之变,生物之谜,日用之繁等各个方面,无处不有数学的重要贡献。”时至今日,计算机计算速度的快速发展使得许多过去无法解决的问题有了解决的可能,大量新兴的数学方法正在被有效地采用,数学的应用范围急剧扩大。近年来,计算机技术的突破、计算机的日益普及、优秀数学应用软件的开发、应用数学方法的发展,使数学已经成为一种能够普通实施的技术。这使得在大学数学教学中对学生广泛进行数学建模能力的培养成为可能。在大学数学教学中,要培养学生的创造与数学实验能力,必须在尽可能少的学时条件下,结合已学过的数学知识,使学生掌握计算技术和应用数学方法。MATLAB作为当今秀的科技应用软件之一,以强大的科学计算与可视化功能、简单易用和开放式的扩展环境,特别是所附带的30多种面向不同领域的工具箱支持,在许多科学领域中成为计算机辅助设计和分析、算法研究和应用开发的基本工具和平台。可以说,MATLAB不仅是一种编程语言,而且在广义上是一种语言开发系统。21世纪培养的各类专业技术人才,应具有将带有专业背景的实际问题建立数学模型的能力,这样才能在实际工作中发挥更大的创新性。将MATLAB与数学应用实践结合起来,探索大学数学教学对学生创造能力和数学建模能力的培养,是本书编写的主要目的。为了满足数学实验发展的需要,结合MATLAB的功能特点编写了本书,本书在以下几个方面做了努力: 由浅入深,详略得当。本书系统地介绍MATLAB编程基础、数学实验、数学实验应用领域等内容,着重介绍怎样利用MATLAB求数学实验等问题。 结构紧凑,分析全面。本书首先介绍MATLAB的使用,然后逐次深入介绍利用MATLAB解决数学实验问题,根据读者的学习习惯和内容的梯度合理安排,非常适合读者学习。 内容翔实,实用性强。书中每介绍一个概念或函数都给出相应的用法及实例进行说明,使读者能快速掌握MATLAB及MATLAB在数学实验中的应用。 图文并茂。对于程序的运行结果,本书给出大量的图形。本书不仅注重基础知识,而且非常注重实践,让读者能迅速掌握MATLAB在数学实验中的应用。通过本书的学习,读者不仅可以全面掌握MATLAB编程和开发技术,还可以快速提高分析和解决实际问题的能力,从而能够在短的时间内,以好的效率解决实际数学建模上遇到的问题,提升工作效率。全书分为10章,其各章内容概述如下。第1章介绍MATLAB R2015b软件编程基础,主要包括MATLAB R2015b的特点与安装、MATLAB工作环境、编程基础等内容。第2章介绍MATLAB的可视化功能,主要包括绘制二维图形、三维图形、四维图形及图形用户界面等内容。第3章介绍符号与多项式运算,主要包括符号及其运算、多项式及其运算等内容。第4章介绍数据插值,主要MATLAB的插值函数、拉格朗日插值法和牛顿插值等内容。第5章介绍MATLAB的数据逼近,主要包括Chebshev一致逼近、Pade逼近、平方逼近等内容。第6章介绍数据估计与拟合,主要包括小二乘估计、GaussMarkov估计、正交小二乘拟合等内容。第7章介绍矩阵分解与线性方程组的求解,主要包括矩阵的分解、线性方程组的求解等内容。第8章介绍非线性方程与非线性方程组求解,主要包括非线性方程的求解、非线性方程组的求解等内容。第9章介绍数值积分,主要包括中点公式、插值型求积公式、梯形求积公式、Simpson公式等内容。第10章介绍微分方程,主要包括常微分方程、微分方程的数值计算、常微分方程的符号解法、常微分方程的数值解等内容。本书主要由张德丰编写,此外参加编写的还有栾颖、周品、曾虹雁、邓俊辉、邓秀乾、邓耀隆、高泳崇、李嘉乐、李旭波、梁朗星、梁志成、刘超、刘泳、卢佳华、张棣华、张金林、钟东山、詹锦超、叶利辉、杨平和许兴杰。本书可以作为数值计算方法或数学实验的学习用书、广大在校本科生和研究生的基本实验数学内容的学习用书,也可以作为广大科研人员、学者、工程技术人员的参考用书。由于时间仓促,加之作者水平有限,错误和疏漏之处在所难免。在此诚恳地期望得到各领域的专家和广大读者的批评指正。作者2016年12月
在解决工程技术问题时,通常首先要建立问题的数学模型,然后设计合理的算法,并通过计算机计算得到的问题解。MATLAB提供了丰富的用于数值计算和处理的函数,并且具有良好的数值稳定性,计算速度快、精度高、效率高。3.1符号及其运算MATLAB中提供了强大的符号运算功能,可以按照推理解析的方法进行运算。MATLAB的符号运算的功能是建立在数学计算软件Maple基础上的。值得注意的是,在符号运算的整个计算过程中,所有的运算均是以符号进行的,即使以数字形式出现的量也是字符量。3.1.1字符型数据变量的创建在MATLAB工作空间中,字符型数据变量同数值型变量一样是以矩阵形式进行保存的。它的语法格式为
var=’expression’
【例31】字符型数据变量的创建。其MATLAB代码编程如下:
>> C=’China’
C =
China
>> A=’a b-c-d’
A =
a b-c-d
>> B=’MATLAB Mathwork’
B =
MATLAB Mathwork
>> Z=’1 sin(2)/3′
Z =
1 sin(2)/3
应用size函数可以检查前面几个字符变量的大小:
>> S=size(C)
S =
15
>> S2=size(A)
S2 =
17
>> S3=size(B)
S3 =
115
>> S4=size(Z)
S4 =
110
上例的结果充分说明了字符型变量是以矩阵的形式存储在MATLAB的工作空间内的。3.1.2符号型数据变量的创建作为符号对象的符号常量、符号变量、符号函数及符号表达式,可以使用sym及syms函数规定和创建,利用class函数可以测试建立的操作对象为何种操作对象类型及是否为符号对象类型。1. sym函数sym函数可以生成单个的符号变量,其调用格式为var = sym(‘var’): 创建一个符号变量var。var = sym(‘var’,set): 创建一个符号变量var,并设置符号对象的格式。 ‘positive’: 限定var表示正的实型符号变量。 ‘real’: 限定var为实型符号变量。 ‘unreal’: 限定var为非实型符号变量。sym(‘var’,’clear’): 清除先前设置的符号变量var。Num = sym(Num): 将一个数值转换为符号形式。Num = sym(Num,flag): 将一个数值转换为符号形式。输入参数flag为转换的符合对象应该符合的格式类型,flag可以有如下选择。 ‘r’: 接近有理表示,为系数默认设置。 ‘e’: 带估计误差的有理表示。 ‘f’: 十六进制浮点表示。 ‘d’: 接近的十进制浮点精确表示。A = sym(‘A’,dim): 创建一个矢量或矩阵的符号变量。A = sym(A,set): 创建一个符号矩阵,set用于设置矩阵的维数。sym(A,’clear’): 清除前面已创建的符号矩阵A。f(arg1,…,argN)= sym(‘f(arg1,…,argN)’): 根据f指定的输入参数arg1,…,argN创建符号对象f(arg1,…,argN)。【例32】利用sym函数创建符号对象。其MATLAB代码编程如下:
>> sqrt(3)
ans =
1.7321
>> a=sqrt(sym(3))
a =
3^(1/2)
>> double(a)
ans =
1.7321
>> sym(3)/sym(5)
ans =
3/5
>> 3/5 6/7
ans =
1.4571
>> sym(3)/sym(5) sym(6)/sym(7)
ans =
51/35
以上可以看出字符型变量与其他数据类型的区别。2. syms函数syms函数的功能比sym函数要更为强大,它可以一次创建任意多个符号变量。而且syms函数的使用格式也很简单,其调用格式为syms var1…varN: 创建符号变量var1…varN。syms var1…varN set: 创建符号变量var1…varN,并指定符号对象的格式。 ‘positive’: 限定var表示正的实型符号变量。 ‘real’: 限定var为实型符号变量。syms var1…varN clear: 清除前面已指定的符号对象var1…varN。syms f(arg1,…,argN): 创建符号函数f,函数中包含符号变量arg1,…,argN。【例33】利用syms函数创建符号表达式。其MATLAB代码编程如下:
>> syms s(t) f(x,y)
>> f(x,y) = x 2*y
f(x, y) =
x 2*y
>> f(1,2)
ans =
5
>> whos
NameSizeBytes ClassAttributes
A1x714 char
B1x1530 char
C1x510 char
S1x216 double
S21x216 double
S31x216 double
S41x216 double
Z1x1020 char
a1x160 sym
ans1x160 sym
f1x160 symfun
s1x160 symfun
t1x160 sym
x1x160 sym
y1x160 sym
此外,利用sym及syms函数也可以创建符号矩阵。【例34】创建符号矩阵。其MATLAB代码编程如下:
>>clear all;
>> m1=[1,2 x,1;3-x,1,4 y;1,2 y,0]
m1 =
[1, x 2,1]
[ 3 – x,1, y 4]
[1, y 2,0]
>> m2=sym(‘[[1,2 x,1;3-x,1,4 y;1,2 y,0]]’)
m2 =
[ [1, x 2, 1], [3 – x, 1, y 4], [1, y 2, 0]]
>> f(x) = [x x^3; x^2 x^4]
f(x) =
[x, x^3]
[ x^2, x^4]
>> f(2)
ans =
[ 2,8]
[ 4, 16]
>> y = f([1 2 3; 4 5 6])
y =
[2×3 sym][2×3 sym]
[2×3 sym][2×3 sym]
>> y{1}
ans =
[ 1, 2, 3]
[ 4, 5, 6]
>> y{2}
ans =
[1,4,9]
[ 16, 25, 36]
>> y{3}
ans =
[1,8,27]
[ 64,125,216]
3.1.3符号计算的运算符与函数MATLAB采用全新的数据结构、面向对象编程和重载技术,使得符号计算和数值计算在形式和风格上浑然统一,符号计算表达式的运算符和基本函数,无论在形状、名称上,还是在使用方法上,都与数值计算中的运算符和基本函数近乎相同。1. 算术运算符号(1) 运算符号“ ”、“-”、“*”、“\”、“/”、“^”分别实现符号矩阵的加法、减法、乘法、左除、右除和求幂运算。【例35】符号的算术运算。其MATLAB代码编程如下:
>> clear all;
>> A=sym(‘[x^2 3; 4*x cos(x)]’);
>> B=sym(‘[1/x^2 2*x;3 x^2 x]’);
>> C=A B%符号矩阵的加法运算
C =
[ 1/x^2 x^2,2*x 3]
[4*x 3, x cos(x) x^2]
>> D=A-B%符号矩阵的减法运算
D =
[ x^2 – 1/x^2,3 – 2*x]
[4*x – 3, cos(x) – x – x^2]
>> E=A*B%符号矩阵的乘法运算
E =
[10,2*x^3 3*x^2 3*x]
[ 3*cos(x) 4/x, 8*x^2 cos(x)*(x^2 x)]
>> F=A/B%符号矩阵的右除运算
F =
[(x*(x^4 x^3 – 9))/(- 6*x^2 x 1),-(2*x^5 – 3)/(x*(- 6*x^2 x 1))]
[ (4*x^3 – 3*x*cos(x) 4*x^4)/(- 6*x^2 x 1), (cos(x) – 8*x^4)/(x*(- 6*x^2 x 1))]
>> J=A\B%符号矩阵的左除运算
J =
[ (cos(x) – 9*x^2)/(x^4*cos(x) – 12*x^3), -(3*x – 2*cos(x) 3)/(x*cos(x) – 12)]
[(3*x^3 – 4)/(x^3*cos(x) – 12*x^2),(x*(x^2 x – 8))/(x*cos(x) – 12)]
>> K=A^2%符号矩阵的幂运算
K =
[x^4 12*x, 3*cos(x) 3*x^2]
[ 4*x*cos(x) 4*x^3,cos(x)^2 12*x]
>> M=exp(B)%符号的指数运算
M =
[ exp(1/x^2),exp(2*x)]
[exp(3), exp(x^2 x)]
(2) 运算符号“.*”、“.\”、“./”、“.^”分别实现“元素对元素”的数组乘法、左除、右除和求幂运算。【例36】符号矩阵的点乘也点除运算。其MATLAB代码编程如下:
>> clear all;
>> syms a b c d e f g h;
>> A=sym(‘[a,b;c,d]’)
A =
[ a, b]
[ c, d]
>> B=sym(‘[e,f;g,h]’)
B =
[ e, f]
[ g, h]
>> R=A*B
R =
[ a*e b*g, a*f b*h]
[ c*e d*g, c*f d*h]
>> R2=A.*B
R2 =
[ a*e, b*f]
[ c*g, d*h]
>> R3=A./B
R3 =
[ a/e, b/f]
[ c/g, d/h]
>> R4=A.\B
R4 =
[ e/a, f/b]
[ g/c, h/d]
(3) 运算符号“’”、“.’”分别实现符号矩阵的共轭转置和非共轭转置。【例37】符号矩阵的转置运算。其MATLAB代码编程如下:
>> syms a b c d;
>> A=sym(‘[a b;c d]’);
>> R1=A’
R1 =
[ conj(a), conj(c)]
[ conj(b), conj(d)]
>> R2=A.’
R2 =
[ a, c]
[ b, d]
2. 关系运算符号与数值计算中的关系运算符号相区别的是,符号计算中的关系运算符只有以下两种。(1) 运算符号“==”表示对运算符两边的符号对象进行“相等”的比较,返回值为“1”表示相等,返回值为“0”表示不相等。(2) 运算符号“~=”表示对运算符号两边的符号对象进行“不相等”的比较,返回值为“1”表示不相等,返回值为“0”表示相等。3. 复数函数复数函数包括复数的共轭(conj)、实部(real)、虚部(imag)和模(abs)函数,在数值计算和符号计算中用法都是一样的。4. 矩阵代数函数在符号计算中,常用的矩阵代数函数包括: diag函数、triu函数、tril函数、inv函数、det函数、rank函数、rref函数、null函数、colspace函数、poly函数、expm函数、eig函数和svd函数。除了svd函数的使用方法有所不同外,其余函数的用法与数值计算一致。【例38】符号矩阵的SVD分解。其MATLAB代码编程如下:
>> clear all;
>> f=sym(‘[1 2 1;2 3 5;1 7 9]’)
f =
[ 1, 2, 1]
[ 2, 3, 5]
[ 1, 7, 9]
>> [U,S,V]=svd(f)
U =
[ 0.16282766200529790566464473003047, 0.36344034057570734984922459430431, 0.91727764135407896387284636832453]
[ 0.46068074153566191523968894576701, 0.79411905473576600135312190977843, -0.39641919893431769076779069408513]
[ 0.87250238215379167379020797827246, -0.4871201553495680712962919278634, 0.038125416563908403817930647866644]
S =
[ 13.091328222514682899973119408907, 0, 0]
[ 0, 1.4959270998972672350546531909101, 0]
[0, 0, 1.1744477349731254100487373117268]
V =
[ 0.14946470625228561177821440226895,0.9790305254836614659283923986005, 0.13841796038124413606394471745808]
[ 0.59697641758407588719014824902336, -0.2009477882370790108765833185168, 0.77668471289906891033206501338361]
[ 0.7882128255956008130632759591861, -0.033454694346410448946610710523496, -0.61449273794959304507931576957863]
>> syms x y u v;
>> A=sym(‘[x,y;u,v]’)
A =
[ x, y]
[ u, v]
>> [U,S,V]=svd(A)
错误使用 sym/svd (line 84)
Input arguments must be convertible to floating-point numbers.
提示: 符号工具箱仅支持元素为符号常量的符号矩阵的SVD分解。3.1.4寻找符号变量MATLAB中的符号对象可以表示符号常量和符号变量。findsym函数可以帮助用户查找一个符号表达式中的符号变量。函数的调用格式为findsym(s): 寻找符号表达式s中所有的符号变量。findsym(s,n): 寻找符号表达式中n个在字母表中与x接近的变量。【例39】利用findsym寻找符号表达式中的变量。其MATLAB代码编程如下:
>> clear all;
>> syms a b x y;
>> f=a^2 6*b cos(x-2) log(5 y) 4-5i%符号表达式
f =
6*b cos(x – 2) log(y 5) a^2 4 – 5*i
>> findsym(f) %查找符号变量
ans =
a,b,x,y
>> findsym(f,2)
ans =
x,y
>> findsym(f,3)
ans =
x,y,b
>> findsym(f,4)
ans =
x,y,b,a
3.1.5符号精度计算符号计算的一个非常显著的特点是: 由于计算过程中不会出现舍入误差,从而可以得到任意精度的数值解。如果希望计算结果精确,那么就可以牺牲计算时间和存储空间,用符号计算来获得足够高的计算精度。在符号运算工具箱中有3种不同类型的算术运算。 数值类型: MATLAB的浮点算术运算。 有理数类型: Maple的精度符号计算。 VPA类型: Maple的任意精度算术运算。这3种运算各有利弊,在计算时应根据计算精度、时间、存储空间的要求进行合理的选择。浮点运算是快的运算,需要的计算机内存小,但是结果不精确。MATLAB双精度数输出的数字位数由format函数控制,但它内部采用的是由计算机硬件提供的8位浮点数的表示方法。符号运算中的有理数算术运算所需要的时间和内存开销都是很大的。只要有足够的内存和足够长的计算时间,总能产生精确的结果。一般符号计算的结果都是字符串,特别是一些符号计算结果从形式上来看是数值,但从变量类型上看,它们仍然是字符串。要从精确解中获得任意精度的解,并改变默认精度,把任意精度符号解变成“真正的”数值解,就如下几个函数。(1) digits函数digits函数用于设定所用数值的精度。函数的调用格式为digits(d): 符号对象的近似解的精度变为d位有效数字,参数d的默认值为32位。d = digits: 得到当前采用的数值计算的精度。【例310】利用digits函数进行精度控制。其MATLAB代码编程如下:
>> clear all;
>> digits %默认精度
Digits = 32
>> a1=sym(1.6,’d’)
a1 =
1.6000000000000000888178419700125
>> digits(42) %设置精度为42
>> digits
Digits = 42
>> a2=sym(1.6,’d’)
a2 =
1.60000000000000008881784197001252323389053
在程序中,利用digits函数进行数值精度的设置。系统默认值为32位,程序中将其改为42位,并进行输出。(2) vpa函数vpa函数用于进行可控精度运算。函数的调用格式为R = vpa(A): 计算符号矩阵A的近似解,精度为函数digits(d)指定的有效位数。R = vpa(A,d): 计算符号矩阵A的近似解,有效位数由参数d指定。【例311】利用函数vpa进行精度控制。其MATLAB代码编程如下:
>> clear all;
>> a=vpa(hilb(2)) %系统默认
a =
[ 1.0, 0.5]
[ 0.5, 0.33333333333333333333333333333333]
>> b=vpa(hilb(3),6) %设置为6位
b =
[ 1.0, 0.5, 0.333333]
[ 0.5, 0.333333,0.25]
[ 0.333333, 0.25,0.2]
>> c=vpa(pi) %默认
c =
3.1415926535897932384626433832795
>> c=vpa(pi,88) %设置为88位
c =
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628035
3.1.6显示符号表达式在符号表达式的显示过程中,默认采用MATLAB式的显示。除了默认的显示方式外,MATLAB符号工具箱中提供了显示函数pretty,允许用户将符号表达式显示为符合一般数学表达习惯的数学表达式。pretty(X): 将符号表达式用书写方式显示出来,使用默认的宽。【例312】利用pretty函数显示符号表达式。其MATLAB代码编程如下:
>> syms x
s = solve(x^4 2*x 1, x,’MaxDegree’,3);
pretty(s)
/-1\
||
|21|
|#2—– -|
|9 #23|
||
|1#21 |
|—–#1— – |
| 9 #223 |
||
|1#21 |
| #1 ——- -|
\9 #223 /
where
/2\
sqrt(3)|—- #2|1i
\9#2/
#1==—————-
2
/sqrt(11)sqrt(27)17\1/3
#2 == | ———–|
\2727 /
3.1.7合并符号表达式在MATLAB中,提供了collect函数用于实现将符号表达式中的同类项进行合并。函数的调用格式为R = collect(S): 将表达式S中相同的次幂的项合并,系统默认为按照x的相同次幂项进行合并。R = collect(S,v): 将表达式S按照v的相同次幂项进行合并。输入参数S可以是一个表达式,也可以是一个符号矩阵。【例313】利用collect函数对符号表达式进行合并同类项。其MATLAB代码编程如下:
>> syms x y
>> collect((exp(x) x)*(x 2))
ans =
x^2 (exp(x) 2)*x 2*exp(x)
>> collect(x^2*y y*x – x^2 – 2*x, x)
ans =
(y – 1)*x^2 (y – 2)*x
>> collect(x^2*y y*x – x^2 – 2*x, y)
ans =
(x^2 x)*y – x^2 – 2*x
>> collect(2*x*i – 3*i*y, i)
ans =
(2*x – 3*y)*1i
>> collect(x*pi*(pi – y) x*(pi i) 3*pi*y, pi)
ans =
x*pi^2 (x 3*y – x*y)*pi x*1i
3.1.8展开符号表达式在MATLAB中,提供了expand函数用于实现将符号表达式展开。函数的调用格式为expand(S): 表达式S中如果包含函数,MATLAB会利用恒等式变形将其写成相应的形式。这个展开函数主要用于多项式、三角函数、指数函数和对数函数。默认x为变量。expand(S,Name,Value): 设置展开式的参数名Name及其对应的参数值Value。【例314】利用expand函数对符号表达式进行展开。其MATLAB代码编程如下:
>> syms x y a b c t
>> expand((x – 2)*(x – 4))
ans =
x^2 – 6*x 8
>> expand(cos(x y))
ans =
cos(x)*cos(y) – sin(x)*sin(y)
>> expand(exp((a b)^2))
ans =
exp(a^2)*exp(b^2)*exp(2*a*b)
>> expand([sin(2*t), cos(2*t)])
ans =
[ 2*cos(t)*sin(t), 2*cos(t)^2 – 1]
>> expand((sin(3*x) – 1)^2, ‘ArithmeticOnly’, true)
ans =
sin(3*x)^2 – 2*sin(3*x) 1
>> expand(log((a*b/c)^2))
ans =
log((a^2*b^2)/c^2)
>> expand(log((a*b/c)^2), ‘IgnoreAnalyticConstraints’, true)
ans =
2*log(a) 2*log(b) – 2*log(c)
3.1.9嵌套符号表达式在MATLAB中,提供了horner函数实现对符号表达式进行嵌套。函数的调用格式为R=horner(P): P为待嵌套的符号表达式,R为嵌套后的符号表达式。【例315】利用horner函数实现符号表达式的嵌套。其MATLAB代码编程如下:
>> syms x y
>> horner(x^3 – 6*x^2 11*x – 6)
ans =
x*(x*(x – 6) 11) – 6
>> horner([x^2 x; y^3 – 2*y])
ans =
x*(x 1)
y*(y^2 – 2)
3.1.10分解符号表达式在MATLAB中,提供了factor函数用于实现符号表达式的分解。函数的调用格式为factor(X): X为多项式或多项式矩阵,系数是有理数,MATLAB会将表达式X表示成为有理数的低阶多项式相乘的形式; 如果多项式X不能进行在有理数范围内因式分解,则会返回X本身。【例316】利用factor对符号表达式进行分解。其MATLAB代码编程如下:
>> syms x y
factor(x^3-y^3)
ans =
(x – y)*(x^2 x*y y^2)
>> syms a b
factor([a^2 – b^2, a^3 b^3])’
ans =
(conj(a) – conj(b))*(conj(a) conj(b))
(conj(a) conj(b))*(conj(a)^2 conj(b)^2 – conj(a)*conj(b))
>> factor(sym(‘12345678901234567890’))
ans =
2*3^2*5*101*3541*3607*3803*27961
在程序中,利用factor函数进行符号多项式的因式分解,系数按照从小到大的顺序进行排列。3.1.11化简符号表达式MATLAB根据一定的规则对符号表达式进行简化,简化的函数为simplify。函数的调用格式为simplify(S): 输入参数S为符号表达式或符号矩阵。simplify(S,Name,Value): 指定一个符号表达式的属性名及对应的属性值,并对表达式或矩阵进行化简。【例317】利用simplify函数对符号表达式或矩阵进行化简。其MATLAB代码编程如下:
>> clear all;
%对符号表达式进行化简
syms x a b c
simplify(sin(x)^2 cos(x)^2)
ans =
1
>> simplify(exp(c*log(sqrt(a b))))
ans =
(a b)^(c/2)
>> %对符号矩阵进行化简
simplify([(x^2 5*x 6)/(x 2), sin(x)*sin(2*x) cos(x)*cos(2*x);(exp(-x*i)*i)/2 – (exp(x*i)*i)/2, sqrt(16)])
ans =
[ x 3, cos(x)]
[ sin(x),4]
>> %使用IgnoreAnalyticConstraints规则对符号表达式进行化简
s = (log(x^2 2*x 1) – log(x 1))*sqrt(x^2);
simplify(s)
ans =
-(log(x 1) – log((x 1)^2))*(x^2)^(1/2)
>> simplify(s, ‘IgnoreAnalyticConstraints’, true)
ans =
x*log(x 1)
>> f = ((exp(-x*i)*i)/2 – (exp(x*i)*i)/2)/(exp(-x*i)/2 exp(x*i)/2);
simplify(f)
ans =
-(exp(x*2*i)*i – i)/(exp(x*2*i) 1)
f = (exp(x exp(-x*i)/2 – exp(x*i)/2)*i)/2 – (exp(- x – exp(-x*i)/2 exp(x*i)/2)*i)/2;
simplify(f, ‘Criterion’,’preferReal’, ‘Steps’, 100)%化简100步
ans =
cos(sin(x))*sinh(x)*i sin(sin(x))*cosh(x)
3.1.12替换符号表达式在处理一些结构较为复杂、变量较多的数学模型时,引入一些新的变量进行代换,以简化其结果,从而达到解决问题的目的,这种方法称为变量代换法。例如,求不定积分∫1t(t7 2)dt,设x=1t,则
∫1t(t7 2)dt=-∫x61 2x7dx=-114ln|1 2t7| c
=-114ln|2 t7| 12ln|t| c
变量代换法是一种非常有效的解题方法,尤其是处理一些复杂的不等式问题时,效果明显。合理代换往往能简化题目的信息,凸显隐含条件,沟通量与量之间的关系,对发现解题思路、优化解题过程有着重要的作用。MATLAB提供了subs函数和subexpr函数进行变量代换或者叫作符号表达式的替换。subs函数利用符号变量或符号表达式替换目标符号表达中的符号变量(包括符号常量); subexpr函数利用符号变量替换目标符号表达式的某个子符号表达式。1. subs函数subs函数可以用指定符号替换符号表达式中的某一特定符号。函数的调用格式为R = subs(S): 用函数中的值或MATLAB工作区间的值替代符号表达式S中的所有变量,如果没有指定某符号变量的值,则返回值中的该符号变量不被替换。R = subs(S, new): 用新的符号变量new代替原来的符号表达式S中的默认变量。R = subs(S, old, new): 用新的符号变量new替换原来符号表达式S中的变量old,当new是数值形式的符号时,实际上用数值替换原来的符号计算表达式的值,结果仍为字符串形式。【例318】利用subs函数对符号表达式进行替换。其MATLAB代码编程如下:
>> syms a b;
subs(a b, a, 4)
ans =
b 4
>> syms a b;
subs(cos(a) sin(b), {a, b}, {sym(‘alpha’), 2})
ans =
sin(2) cos(alpha)
>> syms t;
subs(exp(a*t), ‘a’, -magic(2))
ans =
[ 1/exp(t), 1/exp(3*t)]
[ 1/exp(4*t), 1/exp(2*t)]
>> syms x y;
subs(x*y, {x, y}, {[0 1; -1 0], [1 -1; -2 1]})
ans =
0-1
20
2. subexpr函数subexpr函数将表达式中重复出现的字符串用变量代换。函数的调用格式为[Y,SIGMA] = subexpr(X,SIGMA): 指定用变量SIGMA的值,来代替符号表达式中重复出现的字符串。进行符号替换后,函数的返回值为Y,被替换的符号变量由SIGMA返回。[Y,SIGMA] = subexpr(X,’SIGMA’): 函数中输入参数SIGMA为字符或字符串,用来替换符号表达式中重复出现的字符串。进行符号替换返回值为Y,被替换的符号变量由SIGMA返回。【例319】利用subexpr函数对符号表达式进行替换。
>> syms a b c d x
solutions = solve(a*x^3 b*x^2 c*x d == 0, x, ‘MaxDegree’, 3);
>> [r, sigma] = subexpr(solutions)
r = sigma^(1/3) – b/(3*a) – (- b^2/(9*a^2) c/(3*a))/sigma^(1/3)
(- b^2/(9*a^2) c/(3*a))/(2*sigma^(1/3)) – sigma^(1/3)/2 – (3^(1/2)*(sigma^(1/3) (- b^2/(9*a^2) c/(3*a))/sigma^(1/3))*1i)/2 – b/(3*a)
(- b^2/(9*a^2) c/(3*a))/(2*sigma^(1/3)) – sigma^(1/3)/2 (3^(1/2)*(sigma^(1/3) (- b^2/(9*a^2) c/(3*a))/sigma^(1/3))*1i)/2 – b/(3*a)
sigma =
((d/(2*a) b^3/(27*a^3) – (b*c)/(6*a^2))^2 (- b^2/(9*a^2) c/(3*a))^3)^(1/2) – b^3/(27*a^3) – d/(2*a) (b*c)/(6*a^2)
>> solutions = solve(a*x^2 b*x c == 0, x)
solutions =
-(b (b^2 – 4*a*c)^(1/2))/(2*a)
-(b – (b^2 – 4*a*c)^(1/2))/(2*a)
>> [abbrSolutions,s] = subexpr(solutions,s)
abbrSolutions =
-(b s)/(2*a)
-(b – s)/(2*a)
s =
(b^2 – 4*a*c)^(1/2)
3.1.13符号函数的操作MATLAB具有对符号表达式执行更高级运算的功能。MATLAB提供了把两个符号函数复合成一个符号函数的功能函数,同时也提供了对符号函数求函数表达式的逆功能函数等。1. compose函数在MATLAB中,提供了compose函数用于将符号表达式的复合函数运算。函数的调用格式为compose(f,g): 返回函数当f=f(x)和g=g(y)时的复合函数f(g(y))。其中,x为由函数findsym确定的f的符号变量,y为由函数findsym确定的g的符号变量。compose(f,g,z): 返回f=f(x)和g=g(y)时的复合函数f(g(z)),返回的函数以z为自变量。例如,如果f=sin(x/t),那么函数compose(f,g,z)将返回sin(g(z)/f)。compose(f,g,x,z): 返回复合函数f(g(z)),x为函数f的独立变量。例如,如果f=sin(x/t),那么函数compose(f,g,t,z)将返回sin(g(z)/f),并且函数compose(f,g,t,z)将返回sin(x/g(z))。compose(f,g,x,y,z): 返回复合函数f(g(z)),并且x为函数f的独立变量,y为函数g的独立变量。例如,如果y=sin(x/t),并且g=cos(y/u),那么函数compose(f,g,x,y,z)将返回sin(cos(z/u)/t),并且函数compose(f,g,x,u,z)将返回sin(cos(y/z)/t)。【例320】利用compose函数对符号表达式进行复合操作。其MATLAB代码编程如下:
>> clear all;
>> syms x y z t u
f = 1/(1 x^2);
g = sin(y);
h = x^t;
p = exp(-y/u);
>> a = compose(f,g)
a =
1/(sin(y)^2 1)
>> b = compose(f,g,t)
b =
1/(sin(t)^2 1)
>> c = compose(h,g,x,z)
c =
sin(z)^t
>> d = compose(h,g,t,z)
d =
x^sin(z)
>> e = compose(h,p,x,y,z)
e =
exp(-z/u)^t
>> f = compose(h,p,t,u,z)
f =
x^exp(-y/z)
2. finverse函数在MATLAB中,提供了finverse函数用于实现符号表达式的反函数操作。函数的调用格式为g = finverse(f): 将会计算输入参数f的反函数,其中f为符号表达式,以默认的变量为自变量。函数的返回值g也是一个符号表达式,如果默认的变量为x,则满足g(f(x))=x。g = finverse(f,var): 输入参数var为一个符号变量,是函数f中的变量,且该函数的返回值g是以var为自变量。符号表达式g必须满足g(f(var))=var。【例321】利用finverse函数求符号表达式的反函数。其MATLAB代码编程如下:
>> clear all;
>> syms t x
>> f1=finverse(log(t))%反函数,以默认x为自变量
f1 =
exp(t)
>> f2=finverse(cos(2*t) 1)
f2 =
acos(t – 1)/2
>> f3=finverse(exp(t-2*x),t) %以t为自变量
f3 =
2*x log(t)
>> f4=finverse(exp(x – 2*t), x)
f4 =
2*t log(x)
提示: 当函数finverse求得的解不时,MATLAB会给出警告信息。
3.1.14符号微积分微积分运算在数学计算中的重要性是不言而喻的,整个高等数学就是建立在微积分运算的基础上的。在符号数学工具箱中提供了一些常用的函数来支持具有重要基础意义的微积分运算,涉及微分、求极限、积分、级数求和泰勒级数等。1. 符号表达式的极限求微分的基本思想是当自变量趋近某个值时,求函数值的变化。“无穷逼近”是微积分的一个基本思想,求极限是非常普遍的。事实上,导数就是由极限给出的:
f′(x)=limh→0f(x h)-f(x)h
在MATLAB中,用limit函数来求表达式的极限。函数的调用格式为limit(expr, x, a): 求符号函数expr(x)的极限值。即计算当变量x趋近于常数a时,expr(x)函数的极限值。limit(expr, a): 求符号函数expr(x)的极限值。由于没有指定符号函数expr(x)的自变量,则使用该格式时,符号函数expr(x)的变量为函数findsym(expr)确定的默认自变量,即变量x趋近于a。limit(expr): 求符号函数expr(x)的极限值。符号函数expr(x)的变量为函数findsym(expr)确定的默认变量; 没有指定变量的目标值时,系统默认变量趋近于0,即a=0的情况。limit(expr, x, a, ‘left’): 求符号函数expr的极限值。left表示变量x从左边趋近于a。limit(expr, x, a, ‘right’): 求符号函数expr的极限值。right表示变量x从右边趋近于a。函数limit要求个输入变量为符号函数,limit不支持符号函数的句柄,但是对符号函数句柄f,可以将f(x)作为输入变量。【例322】利用limit函数求符号表达式的极限。其MATLAB代码编程如下:
>> clear all;
>> syms x;
>> f1=sym((cos(x) sin(x)-x)/x)
f1 =
(cos(x) – x sin(x))/x
>> limit(f1,x,inf)
ans =
-1
>> limit(f1,x,-inf)
ans =
-1
>> limit(f1,x,0)
ans =
NaN
>> f2=sym(‘(sin(x)-x)/x’)
f2 =
-(x – sin(x))/x
>> limit(f2,x,0,’right’)
ans =
0
>> limit(f2,x,0,’left’)
ans =
0
2. 符号表达式的微分MATLAB提供的函数可以完成一元及多元符号表达式函数的各阶微分,功能函数diff可以完成一元或多元函数的任意阶数的微分。对于自变量的个数多于一个的符号矩阵,微分为Jocabian矩阵,采用jacobian函数实现微分。(1) diff函数当创建符号表达式后,就可以利用diff对其进行微分运算了。函数的调用格式为diff(expr): 没有指定变量和导数阶数,则系统按findsym函数指示的默认变量对符号表达式expr求一阶导数。diff(expr,v): 指定符号表达式的变量为v。diff(expr, sym(‘v’)): 计算符号表达式expr的一阶导数,以符号变量v为自变量。diff(expr,n): 对符号表达式expr求n阶导数。diff(expr,v,n): 计算符号表达式expr的n阶导数,以符号变量v为自变量。【例323】求函数f(x)=e-2xcos(3x)的4阶导数。其MATLAB代码编程如下:
>> syms x
f=exp(-2*x)*cos(3*x^0.5)
g=diff(f,4) %求复合函数的3阶导数
运行程序,输出如下:
f =
exp(-2*x)*cos(3*x^(1/2))
g =
16*exp(-2*x)*cos(3*x^(1/2)) 48*exp(-2*x)*sin(3*x^(1/2))/x^(1/2)-54*exp(-2*x)*cos(3*x^(1/2))/x-9*exp(-2*x)*sin(3*x^(1/2))/x^(3/2)-351/16*exp(-2*x)*cos(3*x^(1/2))/x^2-9/8*exp(-2*x)*sin(3*x^(1/2))/x^(5/2)-135/16*exp(-2*x)*cos(3*x^(1/2))/x^3 45/16*exp(-2*x)*sin(3*x^(1/2))/x^(7/2)
再执行以下代码:
>> pretty(g)
运行程序,输出如下:
1/2
1/2 exp(-2 x) sin(3 x)
16 exp(-2 x) cos(3 x) 48 ———————
1/2
x
1/21/2
exp(-2 x) cos(3 x)exp(-2 x) sin(3 x)
– 54 ——————— – 9 ———————
x3/2
x
1/21/2
351 exp(-2 x) cos(3 x)exp(-2 x) sin(3 x)
————————–9/8———————
1625/2
xx
1/21/2
135 exp(-2 x) cos(3 x) 45 exp(-2 x) sin(3 x)
————————- ————————
163 167/2
xx
(2) jacobian函数在MATLAB中,提供了jacobian函数用于求多元函数的导数。函数的调用格式为jacobian(f,v): 计算数量或向量f对于向量v的Jacobian矩阵。函数的返回值第i行第j列的数为df(i)/dv(j)。当f为数量时,该函数返回f的梯度。此外,参数v可以是数量,jacobian(f,v)等价于diff(f,v)。【例324】利用jacobian函数求多元函数的导数。其MATLAB代码编程如下:
>> syms x y z
f = [x*y*z; y; x z];
v = [x, y, z];
R = jacobian(f, v)
R =
[ y*z, x*z, x*y]
[0,1,0]
[1,0,1]
>> b = jacobian(x z, v)
b =
[ 1, 0, 1]
3. 符号表达式的积分数学中,积分和微分是一对互逆的运算。符号数学工具箱中提供了int函数来求符号表达式的积分,函数的调用格式为int(f): 没有指定积分变量和积分阶数时,系统按findsym函数指示的默认变量对被积函数或符号表达式f求不定积分。int(f,v): 以v为自变量,对被积函数或符号表达式f求不定积分。int(f, a, b): 符号表达式采用默认变量,该函数求默认变量从a到b时符号表达式f的定积分数值。如果f为符号矩阵,则积分对各个元素分别进行积分。int(f, v, a, b): a、b分别表示定积分的下限和上限。该函数求被积函数f在区间[a, b]上的定积分。a和b可以是两个具体的数,也可以是一个符号表达式,还可以是无穷(inf)。当函数f关于变量x在闭区间[a, b]上可积时,函数返回一个定积分结果。当a、b中有一个是inf时,函数返回一个广义积分。当a,b中有一个是符号表达式时,函数返回一个符号函数。【例325】利用int函数对符号表达式进行积分运算。其MATLAB代码编程如下:
>> syms a x t z
>> int(-2*x/(1 x^2)^2)
ans =
1/(x^2 1)
>> int(x/(1 z^2), x)
ans =
x^2/(2*(z^2 1))
>> int(x/(1 z^2), z)
ans =
x*atan(z)
>> int(x*log(1 x), 0, 1)
ans =
1/4
>> int(2*x, [sin(t), 1])
ans =
cos(t)^2
>> int([exp(t), exp(a*t); sin(t), cos(t)])
ans =
[ exp(t), exp(a*t)/a]
[ -cos(t), sin(t)]
4. 级数求和在MATLAB中提供了symsum函数用于求符号表达式的和。其调用格式为:F = symsum(f,k,a,b): 求符号表达式f中变量k从a变到b时的有限和。F = symsum(f,k): 计算符号表达式f中指定变量为k的有限项和。【例326】利用symsum函数对符号表达式进行级数求和。其MATLAB代码编程如下:
>> syms k x
S1 = symsum(k^2, k, 0, 10)
S2 = symsum(1/k^2, k, 1, Inf)
S3 = symsum(x^k/factorial(k), k, 0, Inf)
S1 =
385
S2 =
pi^2/6
S3 =
exp(x)
>> S4=symsum(k, k)
S5=symsum(1/k^2, k)
S4 =
k^2/2 – k/2
S5 =
-psi(1, k)
5. 泰勒级数在MATLAB中,提供了taylor函数用于求符号表达式的泰勒级数展开式。函数的调用格式为taylor(f,var): 指定符号变量为var,求Maclaurin多项式。taylor(f,var,a): 返回符号表达式f中的指定符号自变量var(若表达式f中有多个变量时)的n-1阶的Maclaurin多项式(即在零点附近v=0)近似式,其中var可以是字符串或符号变量。taylor(,Name,Value): 指定一个或多个属性名及其属性值,实现对符号表达式进行求泰勒级数。【例327】利用taylor函数对符号表达式进行泰勒级展开式。其MATLAB代码编程如下:
>> syms x
taylor(exp(x))
taylor(sin(x))
taylor(cos(x))
ans =
x^5/120 x^4/24 x^3/6 x^2/2 x 1
ans =
x^5/120 – x^3/6 x
ans =
x^4/24 – x^2/2 1
>> taylor(log(x), x, ‘ExpansionPoint’, 1)
ans =
x – (x – 1)^2/2 (x – 1)^3/3 – (x – 1)^4/4 (x – 1)^5/5 – 1
>> taylor(acot(x), x, 1)
ans =
pi/4 – x/2 (x – 1)^2/4 – (x – 1)^3/12 (x – 1)^5/40 1/2
>> taylor(1/(exp(x)) – exp(x) 2*x, x, ‘Order’, 5)
ans =
-x^3/3
>> taylor(1/(exp(x)) – exp(x) 2*x, x, ‘Order’, 5, ‘OrderMode’, ‘relative’)
ans =
– x^7/2520 – x^5/60 – x^3/3
3.1.15符号积分变换在数学中,为了把较复杂的运算转换为比较简单的运算,经常采用一种变换手段。例如数量的乘积或商可以变换成对数的和或差,然后再取反对数即可求得原来数量的乘积或商。这一变换方法的目的就是把比较复杂的乘除运算通过对数变换转换为简单的加减运算。
所谓积分变换,就是通过积分运算,把一类函数A变换成另一类函数B,函数B一般是含有参量α的积分: ∫baf(t)K(t,α)dt。这一变换的目的就是把某函数类A中的函数f(t)通过积分运算变换成另一类函数B中的函数F(α)。这里K(t,α)是一个确定的二元函数,叫作积分变换的核。当选取不同的积分区间与变换核时,就成为不同的积分变换。f(t)叫作原函数,F(α)叫作象函数。在一定条件下,原函数与象函数两者一一对应,成为一个积分变换对。变换是可逆的,由原函数求象函数叫作正变换,反之则是逆变换。
积分变换的理论与方法,在自然科学与工程技术的各个领域中都有着极广泛的应用,成为不可缺少的运算工具。变换的使用,会极大地简化计算,有的变换则为开创新的学科奠定了基础。1. 傅里叶变换及反变换时域中的f(t)与它在频域中的Fourier变换F(ω)之间存在如下关系:
F(ω)=∫∞-∞f(t)e-jωtdt
f(t)=12π∫∞-∞F(ω)ejωtdω
由计算机完成这种变换的途径有两条: 一是直接调用fourier和ifourier进行; 二是根据上面的定义,利用积分函数int实现。fourier和ifourier函数的调用格式为Fw=fourier(f, t, w): 求时域上函数f的傅里叶变换Fw,其中f是以t为自变量的时域函数,Fw是以圆频率w为自变量的频域函数。f=ifourier(Fw,w,t): 求频域上函数Fw的傅里叶反变换f,其中f是以t为自变量的时域函数,Fw是以圆频率w为自变量的频域函数。【例328】实现傅里叶变换及其反变换。其MATLAB代码编程如下:
%傅里叶变换
>> syms w x y z a b c d t
>> f = exp(-x^2);
fourier(f, x, y)
ans =
pi^(1/2)*exp(-y^2/4)
>> f2 = exp(-x^2)*exp(-t^2);
fourier(f2, y)
ans =
pi^(1/2)*exp(-t^2)*exp(-y^2/4)
>> fourier(f2)
ans =
pi^(1/2)*exp(-t^2)*exp(-w^2/4)
>> fourier(t^3, t, w)
ans =
-pi*dirac(3, w)*2i
fourier(x,[x, w; y, z],[a, b; c, d])
ans =
[ pi*dirac(1, a)*2i, 2*pi*x*dirac(b)]
[ 2*pi*x*dirac(c), 2*pi*x*dirac(d)]
%傅里叶反变换
F = sqrt(sym(pi))*exp(-y^2/4);
ifourier(F, y, x)
ans =
exp(-x^2)
F = exp(-w^2/(4*a^2));
ifourier(F, t)
ans =
exp(-a^2*t^2)/(2*pi^(1/2)*(1/(4*a^2))^(1/2))
ifourier([exp(x), 1; sin(y), i*z],[w, x; y, z],[a, b; c, d])
ans =
[ exp(x)*dirac(a),dirac(b)]
[ (dirac(c – 1)*1i)/2 – (dirac(c 1)*1i)/2, dirac(1, d)]
2. 拉普拉斯变换及反变换Laplace变换及其反变换的定义为
F(s)=∫∞0f(t)e-stdt
f(t)=12πj∫c ∞c-∞F(s)estds
与Fourier变换相似,Laplace变换与反变换的实现也有两条途径: 直接调用laplace和ilaplace函数; 或者根据上面的定义,利用积分函数int实现。比较而言,直接使用laplace和ilaplace函数实现变换较为简单。函数的调用格式为Fs=laplace(f,trans_var,eval_point): 求时域上函数f的拉普拉斯变换Fs,其中f是以trans_var为自变量的时域函数,Fs是以复频率eval_point为自变量的频域函数。f=ilaplace(Fs,trans_var,eval_point): 求频域上函数Fs的拉普拉斯反变换f,其中f是以trans_var为自变量的时域函数,Fs是以复频率eval_point)为自变量的频域函数。【例329】实现拉普拉斯变换及其反变换。其MATLAB代码编程如下:
%Laplace变换
>> syms a b c d w x y z t s
>> f = 1/sqrt(x);
laplace(f, x, y)
ans =
pi^(1/2)/y^(1/2)
>> f = exp(-a*t);
laplace(f, y)
ans =
1/(a y)
>> laplace(dirac(t – 3), t, s)
ans =
exp(-3*s)
>> laplace([exp(x), 1; sin(y), i*z],[w, x; y, z],[a, b; c, d])
ans =
[ exp(x)/a, 1/b]
[ 1/(c^2 1), 1i/d^2]
%Laplace反变换
>> F = 1/y^2;
ilaplace(F, y, x)
ans =
x
>> F = 1/(s – a)^2;
ilaplace(F, x)
ans =
x*exp(a*x)
>> ilaplace(1, s, t)
ans =
dirac(t)
>> ilaplace(exp(-2*s)/(s^2 1) s/(s^3 1), s, t)
ans =
heaviside(t – 2)*sin(t – 2) – exp(-t)/3 (exp(t/2)*(cos((3^(1/2)*t)/2) 3^(1/2)*sin((3^(1/2)*t)/2)))/3
>> ilaplace([exp(x), 1; sin(y), i*z],[w, x; y, z],[a, b; c, d])
ans =
[exp(x)*dirac(a), dirac(b)]
[ ilaplace(sin(y), y, c), dirac(1, d)*1i]
3. Z变换及其反变换一个离散因果序列的Z变换及其反变换定义为
F(z)=∑∞n=0f(n)z-n
f(n)=Z-1{F(z)}
涉及Z变换具体计算的方法常见的有3种,分别是幂级数展开法、部分分式展开法和围线积分法。MATLAB的符号数学工具箱中采用围线积分法设计求Z反变换的iztrans函数,相应的数学表达式为
f(n)=12πj∫F(z)zn-1dz
函数的调用格式如下。Fz=ztrans(f,trans_index,eval_point): 求时域函数f的Z变换Fz,f是以trans_index为自变量的时域序列,Fz是以复频率eval_point为自变量的频域函数。f=iztrans(Fz,trans_index,eval_point): 求频域函数Fz的Z逆变换f,f是以trans_index为自变量的时域序列,Fz是以复频率eval_point为自变量的频域函数。【例330】Z变换及其反变换。其MATLAB代码编程如下:
%Z变换
>> syms a b c d w x y z k t n
>> f = sin(k);
ztrans(f, k, x)
ans =
(x*sin(1))/(x^2 – 2*cos(1)*x 1)
>> ztrans(heaviside(n – 3), n, z)
ans =
(1/(z – 1) 1/2)/z^3
>> ztrans(nchoosek(n, 2)*heaviside(5 – n), n, z)
ans =
z/(z – 1)^3 5/z^5 (6*z – z^6/(z – 1)^3 3*z^2 z^3)/z^5
>> ztrans([exp(x), 1; sin(y), i*z],[w, x; y, z],[a, b; c, d])
ans =
[(a*exp(x))/(a – 1),b/(b – 1)]
[ (c*sin(1))/(c^2 – 2*cos(1)*c 1), (d*1i)/(d – 1)^2]
%Z反变换
>> F = 2*x/(x – 2)^2;
iztrans(F, x, k)
ans =
2^k 2^k*(k – 1)
>> iztrans(1/z, z, n)
ans =
kroneckerDelta(n – 1, 0)
>> iztrans((z^3 3*z^2 6*z 5)/z^5, z, n)
ans =
kroneckerDelta(n – 2, 0) 3*kroneckerDelta(n – 3, 0) 6*kroneckerDelta(n – 4, 0) 5*kroneckerDelta(n – 5, 0)
>> iztrans([exp(x), 1; sin(y), i*z],[w, x; y, z],[a, b; c, d])
ans =
[ exp(x)*kroneckerDelta(a, 0), kroneckerDelta(b, 0)]
[ iztrans(sin(y), y, c),iztrans(z, z, d)*1i]
3.2多项式及其运算在数学上,多项式是一类基本的数学函数,因为它简单且可组成完备函数基,因此在很多研究中用它来作为复杂函数的近似形式。多项式一般可表示为以下形式:
f(x)=a0xn a1xn-1 … an-1x an
对于这种表示形式,很容易用它的系数向量来表示,即
p=[a0,a1,…,an-1,an]
在MATLAB中,提供了poly2sym函数实现多项式的构造,其调用格式如下。r = poly2sym(c): c为多项式的系数向量。r = poly2sym(c, v): c为多项式的系数向量,v为其变量。【例331】利用poly2sym函数创建多项式。其MATLAB代码编程如下:
>> poly2sym([1 3 2]) %默认创建多项式变量为 x
ans =
x^2 3*x 2
>> poly2sym([.694228, .333, 6.2832]) %默认创建多项式变量为 x
ans =
(6253049924220329*x^2)/9007199254740992 (333*x)/1000 3927/625
>> poly2sym([1 0 1 -1 2],’y’) %指定多项式变量为y
ans =
y^4 y^2 – y 2
3.2.1多项式的求根1. 多项式的根
找出多项式的根,即使多项式为0的值,可能是许多学科共同的问题。MATLAB能求解这个问题,并提供了特定的函数roots求解一个多项式的根。函数的调用格式为r = roots(c): 其中c为多项式的系数向量,r为求解多项式的根。【例332】利用roots函数求多项式x4-12×3 25x 116。其MATLAB代码编程如下:
>> clear all;
p=[1 -12 0 25 116]
r=roots(p)
p =
1-12025116
r =
11.7473 0.0000i
2.7028 0.0000i
-1.2251 1.4672i
-1.2251 – 1.4672i
注意: 必须包括具有零系数的项。除非特别地辨认,MATLAB无法知道哪一项为零。2. 由根创建多项式因为在MATLAB中,无论是一个多项式,还是多项式的根都是向量,MATLAB按惯例规定,多项式是行向量,根是列向量。给出一个多项式的根,也可以构造相应的多项式。在MATLAB中,poly函数可以实现,函数的调用格式为p = poly(A): 如果A为方阵,则多项式p为该方阵的特征多项式; 如果A为向量,则A的元素为该多项式p的根。n阶方阵的特征多项式存放在行向量中,并且特征多项式次数的系数一定为1。接上例,代码为
>> pp=poly(r)
pp =
1.0000-12.0000-0.000025.0000116.0000
3.2.2多项式的四则运算1. 多项式的加法
对多项式的加法,MATLAB并未提供一个特别的函数。如果两个多项式向量大小相同,那么多项式相加时就与标准的数组加法相同。【例333】计算给定多项式的和与差。其MATLAB代码编程如下:
>> clear all;
p1=[5 40 6 21 9 3];
p2=[4 0 3 72 1 8];
p3=p1 p2 %多项式的和
p3 =
9 40 9 93 10 11
>> r1=poly2str(p3,’x’) %显示多项式
r1 =
9 x^5 40 x^4 9 x^3 93 x^2 10 x 11
>> p4=p1-p2 %多项式的差
p4 =
1403-518-5
>> r2=poly2str(p4,’x’) %显示多项式
r2 =
x^5 40 x^4 3 x^3 – 51 x^2 8 x – 5
注意: 当两个多项式阶次不同时,低阶的多项式用首零填补,使其与高阶多项式有同样的阶次。要求首零而不是尾零,是因为相关的系数像x幂次一样,必须整齐。2. 多项式的乘法在MATLAB中提供了conv函数用于实现多项式的乘运算,提供了deconv函数实现多项式的除运算。它们调用格式如下。c = conv(a,b): 执行a,b两个向量的卷积运算。c = conv(a,b,’shape’): 按形参’shape’返回卷积运算,shape的取值如下。 full: 为返回完整的卷积,其为默认值。 same: 为返回部分卷积,其大小与向量a大小相等。 valid: 只返回无填充零部分的卷积,此时输出向量c的值为max(length(a)-max(0,length(b)-1), 0)。【例334】利用conv函数求多项式f(x)=x4 4×3-2×2 7x 11和g(x)=9×4-11×3 5×2 8的乘法运算。其MATLAB代码编程如下:
>> clear all;
f=[1 4 -2 7 11];
g=[9 -11 5 0 8];
c=conv(f,g)
运行程序,输出如下:
c =
925-5710520-54395688
提示: conv函数只能进行两个多项式的乘法,两个以上的多项式的乘法需要重复使用conv。在一些特殊情况下,一个多项式需要除以另一个多项式。在MATLAB中,这是由函数deconv完成的。函数的调用格式为[q,r] = deconv(v,u): 求多项式v,u的除法运算,其中q为返回多项式v除以u的商式,r为返回v除以u的余式。返回的q与r仍为多项式系数向量。【例335】多项式的除法运算。其MATLAB代码编程如下:
>> clear all;
>>c=[1 5 15 35 69 100 118 110 72];
>> b=[1 2 3 6 8];
>> [a,r]=deconv(c,b)
运行程序,输出如下:
a =
13689
r =
00000-2-5-80
a是多项式c除以多项式b的商,余式为r。本例中r为零多项式,因为多项式b和多项式a的乘积恰好是c。3.2.3多项式的导数在MATLAB中提供了polyder函数用于多项式的求导。其调用格式如下。k = polyder(p): 求多项式p的导函数多项式。k = polyder(a,b): 求多项式a与多项式b乘积的导函数多项式。[q,d] = polyder(b,a): 求多项式b与多项式a相除的导函数,导函数的分子存入q,分母存入d中。其中,参数p,a与b是多项式的系数向量,返回结果q,d,k也是多项式的系数向量。【例336】多项式p(x)=(3×2 6x 9)(x2 2x)的求导运算。其MATLAB代码编程如下:
>> clear all;
a = [3 6 9];
b = [1 2 0];
k = polyder(a,b)
k =
12364218
>> K=poly2str(k,’x’)
K =
12 x^3 36 x^2 42 x 18
>> [q,d] = polyder(b,a)
q =
1818
d =
9369010881
3.2.4多项式的积分在MATLAB中,提供了polyint函数用于对多项式进行积分。函数的调用格式为polyint(p,k): 返回以向量p为系数的多项式的积分,积分的常数项为k。polyint(p): 返回以向量p为系数多项式的积分,积分的常数项为默认值0。【例337】已知多项式x2-x 2,求F(x)=∫p(x)dx,且F(0)=1/2。其MATLAB代码编程如下:
>> p=[1 -1 2]; %原多项式
>> k=1/2; %常数项k
>> F=polyint(p,k) %求多项式的积分
F =
0.3333-0.50002.00000.5000
>> df=poly2sym(F)
df =
x^3/3 – x^2/2 2*x 1/2
所以F(x)=13×3-12×2 2x 12。3.2.5多项式的估值在MATLAB中提供了polyval函数与polyvalm函数用于求多项式p(x)在x=a的取值。polyval的输入可以是标量或矩阵。其调用格式为y = polyval(p,x): p为多项式的系数向量,x为矩阵,它是按数组运算规则来求多项式的值。[y,delta] = polyval(p,x,S): 使用可选的结构数组S产生由polyfit函数输出的估计参数值; delta是预测未来的观测估算的误差标准偏差。y = polyval(p,x,[],mu)或[y,delta] = polyval(p,x,S,mu): 使x^=(x-μ1)/μ2替代x,在等式中,μ1=mean(x),μ2=std(x),其中心点与坐标值mu=[μ1,μ2]可由polyfit函数计算得出。polyvalm函数的输入参数只能是N阶方阵,这时可以将多项式看作矩阵函数。其调用格式为Y = polyvalm(p,X): p为多项式的系数向量,X为方阵,其是按矩阵运算规则来求多项式的值。【例338】多项式的求值。其MATLAB代码编程如下:
>> clear all;
X = pascal(4) %建立四阶pascal矩阵
X =
1111
1234
136 10
141020
>> p = poly(X)
p =
1.0000 -29.0000 72.0000 -29.0000 1.0000
>> P=poly2str(p,’x’)
P =
x^4 – 29 x^3 72 x^2 – 29 x 1
>> y=polyval(p,X) %利用polyval求解多项式的值
y =
1.0e 004 *
0.00160.00160.00160.0016
0.00160.0015-0.0140-0.0563
0.0016-0.0140-0.2549-1.2089
0.0016-0.0563-1.2089-4.3779
>> Y=polyvalm(p,X) %利用polyvalm求解多项式的值
Y =
1.0e-010 *
-0.0013-0.0063-0.0104-0.0242
-0.0048-0.0218-0.0360-0.0798
-0.0115-0.0512-0.0822-0.1812
-0.0229-0.0973-0.1560-0.3410
3.2.6有理多项式在许多应用中,例如傅里叶(Fourier)、拉普拉斯(Laplace)和Z变换中,出现了两个多项式之比。在MATLAB中,有理多项式由它们的分子多项式和分母多项式表示。对有理多项式进行运算的两个函数是residue和polyder。函数residue执行部分分式展开的运算。函数的调用格式为[r,p,k] = residue(b,a): b, a分别为分子和分母多项式系数的行向量,r为留数行向量。其中,
b(s)a(s)=b1sm b2sm-1 … bm 1a1sn a2sn-1 … an 1
[b,a] = residue(r,p,k): p为极点行向量,k为直项行向量。其中,
b(s)a(s)=r1s-p1 r2s-p2 … rns-pn k(s)
【例339】求表达式f(x)b(s)a(s)=5s3 3s2-2s 7-4s3 8s 3的部分分式展开式子。其MATLAB代码编程如下:
>> b = [ 5 3 -2 7]; %分子系数向量
a = [-4 0 8 3]; %分母系数向量
[r, p, k] = residue(b,a)
r =
-1.4167
-0.6653
1.3320
p =
1.5737
-1.1644
-0.4093
k =
-1.2500
>> [b,a] = residue(r,p,k)
b =
-1.2500-0.75000.5000-1.7500
a =
1.0000-0.0000-2.0000-0.7500
所以,其部分分式展开表达式为f(x)=b(s)a(s)=-1.25s3-0.75s2 0.5s-1.75s3-2s-0.75。3.2.7多项式的微分多项式微分的概念是显然的,对n阶多项式p(x)=anxn an-1xn-1,其微分为n-1阶多项式,即为dp(x)=nanxn-1 (n-1)an-1xn-2 … a1。原多项式及其微分多项式的多项式表示分别为P=[an,an-1,…,a0],dp=[nan,(n-1)an-1,…,a1]。在MATLAB中提供了polyder函数用于求多项式的微分,其调用格式为k = polyder(p): p,k分别为原多项式及微分多项式的多项式表示。k = polyder(a,b): 求多项式a与多项式b乘积的导函数多项式。[q,d] = polyder(b,a): 求多项式b与多项式a相除的导函数,导函数的分子存入q,分母存入d。其中,参数a和b是多项式的系数向量,返回结果q和d与是多项式的系数向量。【例340】多项式p(x)=(3×2 6x 9)(x2 2x)的微分运算。
>> clear all;
a = [3 6 9];
b = [1 2 0];
k = polyder(a,b)
k =
12364218
>> K=poly2str(k,’x’)
K =
12 x^3 36 x^2 42 x 18
>> [q,d] = polyder(b,a)
q =
1818
d =
9369010881
评论
还没有评论。