符号计算
sym函数
用于建立单个符号对象
符号对象名=sym(A)
其中,A可以是一个数值常量、数值矩阵、数值表达式(不加单引号)
此时符号对象为一个符号常量
A也可以是一个变量名(加单引号),
这时符号对象为一个符号变量
%%%%%%%符号常量%%%%%%%%
t=sym(2);
>> t
t =
2
>> t+1/2
ans =
5/2
%%%另一例%%%
>> sin(sym(pi/3))ans =3^(1/2)/2
%%%%%%%%%%%而%%%%%%%%%%
>> sin(pi/3)ans =0.8660
%%%%%%%%%%%%符号变量%%%%%%%%%%%%%%
>> a=5;b=-8;x=sym('a'); %%%%%%%记得加单引号y=sym('b');
w=(a+b)*(a-b)
w =-39
>> s=(x+y)*(x-y)s =
(a + b)*(a - b)
%%%%%%%%%因为本例中a,b已经赋值
所以要计算符号表达式的值
可以用eval(s)将符号表达式的值
转换成数学结果%%%%%%%%%%%%%%%%%
符号计算的结果是一个精确的数学表达式
数值计算的结果是一个数值
sym函数一次只能定义单个符号对象
-----------------------//------------------------------
syms函数
用于一次定义多个符号变量
syms 符号变量名1 符号变量名2 … 符号变量名n
其中,变量名不能加单引号,相互之间用空格隔开。
---------------------//-----------------------------------
在进行符号对象的运算前,可用 assume函数对符号对象设置值域,函数调用格式为:
assume(condition)
assume(expr,set)
第一种格式指定变量满足条件 condition,第二种格式指定表达式expr属集合set
----------------//-----------------------------------------
(1)四则运算
(2)关系运算
(3)逻辑运算
(4)因式分解与展开运算
MATLAB提供了对符号表达式进行因式分解、展开、合并的函数,函数的调用格式为:
1 factor(s):对符号表达式s分解因式。
2 expands):对符号表达式s进行展开。
3 collect(s):对符号表达式s合并同类项。
4 collect(s,v):对符号表达式s按变量v合并同类项。
>> syms a b;
>> s=a^3-b^3;
>> factor(s)
ans =[ a - b, a^2 + a*b + b^2]>> factor(12)
ans =2 2 3>> factor(24)
ans =2 2 2 3
(5)其他运算
1 提取有理分式的分子分母:[n,d]=numden(s)
2 提取符号表达式的系数:c=coeffs(s,x)
3 符号表达式化简: simplify(s)
(例如:将sin2+cos2化简为1)
4 符号多项式与多项式系数向量之间的转换:
符号多项式转换为多项式系数向量:p=sym2poly(s)
多项式系数向量转换为符号多项式:s=poly2sym( p)
求方程ax2+bx+c=0的解
syms a b c x;
f=a*x^2+b*x+c;
g=coeffs(f,x) %%提取符号表达式的系数
g=g(end:-1:1) %%降序排列
roots(g)
%%%%%%%%结果%%%%%%%%%%
g =[ c, b, a]g =[ a, b, c]ans = -(b + (b^2 - 4*a*c)^(1/2))/(2*a)-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
(6)符号运算中变量的确定
①如果没有明确指定自变量,MATLAB将按以下原则确定主变量并对其进行相应运算:
1.寻找除i、j之外,在字母顺序上最接近x的小写字母。
2.若表达式中有两个符号变量与x的距离相等,则ASCII码大者优先。
②symvar( )函数可以用于查找一个符号表达式中的符号变量 ,函数的调用格式为:
symvar(s,n)
函数返回符号表达式s中的n个符号变量。因此,可以用symvar(s,1)查找表达式s的主变量。
当λ取何值时,以下齐次线性方程组有非0解
syms lamda;
A=[1-lamda -2 4;2 3-lamda 1;1 1 1-lamda];
D=det(A);
factor(D)
%%%%%%%%%%%%%%结果%%%%%%%%%%%%
ans =[ -1, lamda, lamda - 2, lamda - 3]
故当lamda为0,2,3时,该方程组有非零解
这里重温一下矩阵常用的几个函数
1.
det(A):求方阵A的行列式
2.
D = diag(v) 返回主对角线上为向量 v 的元素的对角矩阵。
D = diag(v,k) 将向量 v 的元素放置在第 k 条对角线上。k=0 表 示主对角线,k>0 位于主对角线上方,k<0 位于主对角线下方。
x = diag(A) 返回 矩阵A 的主对角线元素的列向量。
x = diag(A,k) 返回矩阵 A 的第 k 条对角线上元素的列向量。
3.
inv(X) 计算方阵X的逆矩阵
4.
求解线性方程组一般用反斜杠法而非inv(A)*b,反斜杠法计算速度更快而且误差更小
5.
k = rank(A) 返回矩阵 A 的秩。
6.
trace(A) 计算矩阵 A 的对角线元素之和
Taylor
%%%%%%%%求指数函数、正弦函数和余弦函数
五阶的麦克劳林级数展开式。
syms x
T1 = taylor(exp(x))
T2 = taylor(sin(x))
T3 = taylor(cos(x))
%%%%%%%输出结果%%%%%%%%
T1 =
x^5/120 + x^4/24 + x^3/6 + x^2/2 + x + 1
T2 =
x^5/120 - x^3/6 + x
T3 =
x^4/24 - x^2/2 + 1
%%%%%%%%%%按升序显示多项式%%%%%%%
sympref('PolynomialDisplayStyle','ascend');
%%%%%%%%%%指定扩展点%%%%%%%%
taylor(acot(x), x, 1) %%%% 在1这点展开
%%%%%%展开到8阶%%%%%%%%
syms x
f = sin(x)/x;
T8 = taylor(f, x, 'Order', 8);%%使用Order控制截断顺序
syms x
fplot([sin(x) cos(x)])
结果:
b = mod(a,m) 返回 a 除以 m 后的余数,其中 a 是被除数,m 是除数
randn:正态分布的随机数
常微分方程数值求解
微分方程:
函数及其导数的关系式。未知函数是一元函数的微分方程称作常微分方程,未知函数是多元函数的微分方程称作偏微分方程。
对函数求导
对于数值计算,diff是求微分
对于符号计算
syms x
f(x)=asin(x)+x^2;
diff(f(x))
diff(f(x),3) %求三阶导数
diff(f(x),x) %求对x的偏导数
%%%%%%来看一下结果%%%%%%
ans =2*x + 1/(1 - x^2)^(1/2)
ans =(3*x^2)/(1 - x^2)^(5/2) + 1/(1 - x^2)^(3/2)
ans =2*x + 1/(1 - x^2)^(1/2)
Matlab函数求导教程
dsolve函数
求解 微分方程:dy/dt=a*y
%%%%%%%求解一阶微分方程%%%%%%%
syms y(t) a %%%这里注意一定要定义成y(t)的形式
%%%%%%%%%%不要分开定义y t%%%%%%
eqn = diff(y,t) == a*y;
S = dsolve(eqn)
%%%%%%结果%%%%%%%
S =
C1*exp(a*t)
求解 微分方程:d2y/d t2=a*y
%%%%%%%求解二阶微分方程%%%%%%%
syms y(t) a
eqn = diff(y,t,2) == a*y;
ySol(t) = dsolve(eqn)
%%%%%%%%结果%%%%%%%%%
ySol(t) =
C2*exp(a^(1/2)*t) + C3*exp(-a^(1/2)*t)