Matlab符号表达式的用法(2)
(2009-12-08 17:22:29)
标签:
杂谈 |
分类: MatlabStudy |
感谢xiaohu0628的整理 http://xiaohu0628.bokee.com/viewdiary.13530825.html
符号表达式的化简和替换
化简
数学表达式有各种不同的形式,对于具体问题,他们各具特点:例如对于多项式有普通的降幂排列x的幂的多项式,也可以写成因子乘积,还可以写成嵌套形式。工具箱应用各种代数的和三角法恒等式把一个函数的表达式转换成另外一种等价的表达式。
collect(f) 把f看成一个变量为x多项式,然后进行计算得到所有关于x幂的系数。也可以指定变量得到指定变量的降幂系数形式。
Expand(f) 将表达式展开成每项最简单函数的表达式,合并相同项,不限于多项式
Horner(f) 将符号多项式表达式变换成嵌套使得表达式 例如f=x^3-6*x^2+11*x-6
factor(f) 如果f是一个有理数多项式,返回表达式的低次幂的有理数多项式因子乘积,如果找不到返回f,f可以是符号表达式矩阵
simplify(f) 利用大量的代数恒等式包括求和、整数幂、开方、分数幂以及大量的函数恒等式包括三角函数、指数函数、对数函数、贝塞尔函数、超几何分布函数、伽马函数来对表达式进行化简
simple(f) 也是一种化简的函数,但他是一个非数学目的的化简,仅仅是找到包含最小字符数的表达式,但这种化简也是在其他化简的基础上进行,所以也可以得到比较满意的结果。
替换
pretty(s) 用来对符号表达式显示为正常可读性的形式
一般Matlab为了表达形式的简单,通常会用大%n,n为整数型数字来表达一个子表达式,这个子表达式会在结果中多次出现,所以用%n可以简化。
subexpr(s) 将表达式s中的子表达式以符号表达式形式存储在列向量sigma中
v = subexpr(v,'S') Matlab会将V表达式中多次出现的长的表达式用S来替换
subs(S,{a,b,c},{10,2,10}) 替换符号表达式中a,b,c为相应的数值
subs还可以用一个列向量数值来替换S中的一个变量得到结果是列向量,如果结果是数值的话,可以用double将其转换
变精度算符
Matlab中有三种算符操作
Numeric 浮点数算术
Rational 准确地符号算术
VPA 可变精度算术
例如:
format long 1/2+1/3 返回长整型的数值计算结果
sym(1/2)+1/3 返回一个有理符号计算结果
digits(25) vpa('1/2+1/3') 返回精度为25的数值计算结果
浮点数数值计算是这三个运算中最快的,而且要求的内存也最少,但是结果不是最精确的。
一般他的输出由format 定义。
符号有理运算是最耗时间和内存的,但结果最为精确。
符号表达式的线性代数运算
基本的矩阵运算和数值运算中一致
H=hilb(3) 产生一个3*3的Hilbert矩阵,H = sym(H) 可以对H进行任意的矩阵运算了
同时如果H是符号表达式
Inv 求逆,det求行列式,null求H的零空间,colspace求H的列空间
Eig求矩阵H的特征值和特征向量
Poly 计算H的特征多项是
[V,J] = jordan(A) 通过相似变换得到A的Jordan矩阵
[U,S,V] = svd(A); 奇异值分解只能针对可变精度和浮点数据
符号表达式求解代数方程
solve(S) 求S=0的解
s = solve('cos(2*x)+sin(x)=1') 也可以是方程形式
[x,y] = solve(x^2*y^2, x-y/2-alpha) 也可以求代数方程组
dsolve('Dy=1+y^2') 计算普通微分方程的符号解,通过字母D来表示微分D2,D3,Dn表示n阶微分。默认的自变量是t,这个自变量可以改变,同时还可以给出初始条件。因变量紧跟在D的后边。
y = dsolve('Dy=1+y^2','y(0)=1') 给出初始条件
y = dsolve('D2y=cos(2*x)-y','y(0)=1','Dy(0)=0', 'x');给出自变量
S = dsolve('Df = 3*f+4*g', 'Dg = -4*f+3*g') 可以求解微分方程组
特殊的数学函数
超过50个常用的数学函数可以在这个工具箱中获得。这些函数通过M文件获得,他们都只能数值计算给定参数的函数值。
help mfunlist 用来查询工具箱中的这些可用的函数,从显示列表中,例如可以找到双曲余弦积分被定义为Chi,带有复参数。
Mhelp Chi 获得更加详细的帮助
z = [2+i 0 4.5];
w = mfun('Chi',z) 其调用过程
mfun中能调用的这些特殊函数有:
Airy Functions
Binomial Coefficients
Riemann Zeta Functions
Bernoulli Numbers and Polynomials
Euler Numbers and Polynomials
Harmonic Function
Exponential Integrals
Logarithmic Integral
Sine and Cosine Integrals
Hyperbolic Sine and Cosine Integrals
Shifted Sine Integral
Fresnel Sine and Cosine Integral
Dawson's Integral Error Function
Complementary Error Function and its Iterated Integrals
Gamma Function Logarithm of the Gamma Function
Incomplete Gamma Function
Digamma Function
Polygamma Function
Generalized Hypergeometric Function
Bessel Functions
Incomplete Elliptic Integrals
Complete Elliptic Integrals
Complete Elliptic Integrals with Complementary
Modulus Beta Function
Dilogarithm Integral
Lambert's W Function
Dirac Delta Function (distribution)
Heaviside Function (distribution)
工具箱扩充的正交多项式
Gegenbauer
Hermite
Laguerre
Generalized Laguerre
Legendre
acobi
Chebyshev of the First and Second Kind
如何使用Maple函数
Maple 可以让你直接访问Maple函数。这个函数以符号对象、字符串、double作为输入,输出和输入相应的结果。还可以使用maple函数编译你所编写的符号数学程序。
例如maple('gcd(14, 21)') 用maple调用maple内核中的gcd来求两个证书的最大公因数
maple('gcd(x^2-y^2,x^3-y^3)') 求最大公因子
如果你想用maple命令在matlab环境下的任何地方使用gcd,你可以编制一个M文件来表示它。例如
function g = gcd(a, b)
g = maple('gcd',a, b);
江这个文件保存到目录toolbox/symbolic/@sym下,就可以随意调用gcd了
对于矩阵的处理可以如下
function y = sin1(x)
for k = 1: prod(size(x))
end
y = reshape(y,size(x));
效率更高的方法,只访问一次maple
function y = sin2(x)
if
% scalar case
else
% array case
end
Maple命令提供了两种编译设备:跟踪方式(trace mode)和状态输出参数(Status Output Argument)
maple traceon
a = sym('a');
exp(2*a)
状态输出参数
[result, status] = maple('discrim', a*x^2+b*x+c)
扩展的符号数学工具箱
扩展的符号数学工具箱允许访问所有的非图形化Maple包、Maple编程特性和Maple程序。
Maple编程特性包含了循环和条件表达。
也可以通过扩展符号数学工具箱使用特别的程序库或者程序包。
mhelp index[packages] 同过它来获得Maple包的名字
mhelp orthopoly 获得orthopoly的信息
用maple来装载这个函数包,这样就在Maple空间中装载了这些函数,然后就可以正常使用了
Access To Maple
Maple Access Maple kernel
Mapleinit Initialize Maple
Mfun Numeric uation of Maple functions
Mhelp Maple help
Mfunlist List of functions for mfun
Procread Install a Maple procedure