数值计算的通用函数
符号计算基础
创建符号对象
sym
符号变量名=sym('符号字符串')
例一:符号运算解方程
clear;clc;
a=sym('a');b=sym('b');x=sym('x');y=sym('y');
[x,y]=solve(a*x-b*y-1,a*x+b*y-4);%这里要把等式右边都换成零
x
y
syms
syms 符号变量名1 符号变量名2 …… 符号变量名n
使用方法和sym函数类似
但是现在已经过时了,被替换成了str2sym
运算符和运算
常用运算
提取分子和分母
%提取分子和分母
clear;clc;
syms x y;
f=x/2*y+2*y/x;
[n,d]=numden(f)
变量替换
%变量替换
clear;clc;
syms x x1 x2 x3;
y=1+2*x+3^x;
subs(y,'x','x1+2*x2+3*x3')
这样会报错,MATLAB虽好用,但有时候报错莫名其妙的。所以选参考书一定要选最新的,不然很多函数都被抛弃了。
报错内容:
Error using sym>convertChar (line 1448)
Character vectors and strings in the first argument can only specify a variable or number. To evaluate
character vectors and strings representing symbolic expressions, use ‘str2sym’.
Error in sym>tomupad (line 1214)
S = convertChar(x);
Error in sym (line 211)
S.s = tomupad(x);
需要这样改:
%变量替换
clear;clc;
syms x x1 x2 x3;
y=sym(1+2*x+3^x);
subs(y,'x',sym(x1+2*x2+3*x3))
也就是不能用字符串符号计算,需要使用符号计算函数才行。
因式分解和展开
函数 | 说明 |
---|---|
factor(s) | 对s分解因式 |
horner(s) | 将多项式s转换成嵌套形式 |
expand(s) | 对s进行展开 |
%因式分解和展开
clear;clc;
syms x y;
y1=x^2+2*x+1;
y2=x^3+2*x^2+4;
y3=(x+2*y)^3;
factor(y1)
horner(y2)
expand(y3)
化简
函数 | 说明 |
---|---|
simplify(s) | 化简,s可以是多项式也可以是符号表达式矩阵 |
%化简
syms x;
y=2*sin(x)*cos(x);
%直接化简得最终表达式
simplify(y)
符号矩阵运算函数
代数运算函数
符号矩阵的立方和指数
%符号矩阵的立方和指数
a=sym([1 2 3;4 5 6;7 8 9]);
a^3
exp(a)
矩阵求逆、行列式、秩、列空间的基和转置
%矩阵求逆、行列式、秩、列空间的基和转置
a=magic(3);
a=sym(a);
%逆
inv=inv(a)
%行列式
det=det(a)
%秩
rank=rank(a)
%列空间的基
col=colspace(a)
%转置
tran=transpose(a)
取矩阵对角线、上三角、下三角
b=hilb(5);
b=sym(b);
%求矩阵的第二条对角线
diag(b,2);
%求矩阵c 上三角
c=triu(b,1);
%求矩阵d 下三角
d=tril(a);
a,b,c,d
rref函数
求符号矩阵的简化行阶梯矩阵(高斯-若尔当消元法)
%简化行阶梯矩阵
a=rand(4);
a=sym(a);
x=rref(a);
a,x
null函数
零空间正交基
%零空间正交基
a=[1 2 3;4 5 6;7 8 9];
a=sym(a);
n=null(a);
n
eig函数
特征值和特征向量
%特征值和特征向量
a=magic(4);
e=eig(a);
[V,D]=eig(a);
a,e,V,D
jordan函数
将矩阵变换为若尔当形式并求特征值和特征向量
%将矩阵变换为若尔当形式并求特征值和特征向量
a=magic(4);
a=sym(a);
[b,c]=jordan(a);
a,b,c
svd函数
%矩阵的奇异值分解
x=[1 2 3 4 ;5 6 7 8 ;9 10 11 12; 13 14 15 16];
digits(30);%设置运算精度
[a b c]=svd(x);
x,a,b,c
科学运算函数
极限
函数 | 说明 |
---|---|
limit(f,x,a) | 当变量x趋于a时,计算f(x)的极限 |
limit(f,a) | 当变量x趋于a时,计算f(x)的极限 |
limit(f) | 当变量x趋于0时,计算f(x)的极限 |
limit(f,a,x,‘right’) | 当变量x从右边趋于a时,计算f(x)的极限 |
limit(f,a,x,‘left’) | 当变量x从左边趋于a时,计算f(x)的极限 |
%算极限
syms x;
f=(x^2-x+1)/(x-1)^2;
limit(f,x,1)
微分
diff函数
调用格式 | 参数说明 |
---|---|
diff(s) | 求s的一阶微分 |
diff(s,‘a’) | 指定以a为变量,求s的一阶微分 |
diff(s,n) | 求s的n阶微分 |
diff(s,‘a’,n) | 指定以a为变量,求s的n阶微分 |
%微分
y=sym((x^2+3*x+1)/4*x^2);
dy=diff(y);
dyy=diff(y,2);
dy,dyy
%偏微分
clear;clc;
syms x y;
z=sym(5+4*x*(y^3)+3*(x^2)*(y^2)+2*(x^3)*y+(x^4));%指数运算优先级不够
dzx=diff(z,'x');
dzy=diff(z,'y');
dzxx=diff(z,'x',2);
dzyy=diff(z,'y',2);
dzx,dzy,dzxx,dzyy
积分
int函数
调用方式 | 说明 |
---|---|
int(f) | 使用默认变量进行不定积分运算(感觉不太安全) |
int(f,a) | 以a为自变量对f求不定积分 |
int(f,a,b) | 对f求a到b的定积分,a<b |
int(f,v,a,b) | 求以v为自变量的,a到b的定积分 |
%求积分
f=sym(x^4/(1+x^2));
int(f)
级数求和
symsum函数,调用方法和int函数很像
调用方式 | 说明 |
---|---|
symsum(f) | 自变量默认为k,计算表达式f从0到k-1的和 |
symsum(f,v) | 计算表达式f从0到v-1的和 |
symsum(f,a,b) | 在默认变量的情况下,计算表达式f从a到b的和 |
symsum(f,v,a,b) | 以v为变量,计算表达式f从a到b的和 |
%级数求和
clear;clc;
syms a b x;
f=a*x^2+2*b*x;
symsum(f,1,10)%默认变量是x
symsum(f,a,1,10)