MATLAB--符号与数值

%符号表达式的整理
%% 化简 
syms a b
y=(cot(a/2)-tan(a/2)*(1+tan(a)*tan(a/2)));
y=simplify(y);
%y=simple(y) 已经删除
%% 因式分解 
syms m n x
y=-24*m^2*x-16*n^2*x;
y=factor(y);
y1=m^3-n^3;
y1=factor(y1);
y2=factor(104);
%% 展开
syms a x
y=a*(x^2-a)^2+(x-2);
y=expand(y)
%% 合并 
syms x y
z=(x+y)^2*y+5*y*x-2*x^3;
z=collect(z)
z=collect(z,y)
%% 计算分子和分母 
syms x y
z=1/x*y+x/(x^2-2*y)
[z1,z2]=numden(z)%z1分子,z2分母
%有理数
[z1,z2]=numden(sym(4.57))
%% pretty
%mupad
syms a b c
M1=[cos(a) sin(b);
    -sin(c) cos(b);];
M2=[1/2*a+b c/b^2;
    (a+b)/c   c;];
M=M1*M2;
M=M(1)*M(2)*M(3)*M(4);
pretty(M)
%% 反函数 
syms x y
z=x+y
z1=finverse(z,x)
z2=finverse(z,y)
%% 函数复合 
syms x y z g h
z=x^2+y-2*x;
g=cos(h)
z=compose(z,g,'x','h')%指出z中的变量是x,g中的是h
z=x^2+2/x;
g=sin(h)
z=compose(z,g)%均为单变量
%% 嵌套 
syms x y
y=2*x^6-3*x^3-5*x^2+12;
y=horner(y)

%% 符号微分
syms x1 x2 x3
y=x1^4-5*x1^2+6;
dy=diff(y);%求一阶导数
d2y=diff(y,2);%求二阶导数

y1=x1^5*x2+x2*x3-x1^2*x3;
py1=diff(y1,x1,1);%先指明对哪个求偏导
py2=diff(y1,x1,2);
%symvar(y1)   该函数可查看未指明时求导的顺序[ x1, x2, x3]
%% 混合偏导
syms a b x y 
u=exp(a*x)*cos(b*y);
duxy=diff(u,x,y);
duyx=diff(u,y,x);

w=x*sin(x*y);
dwx=diff(w,x,3);
dwy=diff(dwx,y);
dw3xy=diff(w,x,x,x,y);%与上式等价
%% 差分
A=[4 5 6 3 2 1];
a=diff(A);
A=[4 5 6;7 4 2;5 6 2];
A1=diff(A);
A2=diff(A,2);%二阶差分,默认是按行差分即A2=diff(A,2,1)

%% 积分 int
syms x x1
y=1/x^2+x1;
y1=x^2/(1+x^2);
Iy=int(y,x1);
Iy1=int(y1);
%% 定积分
syms x
y=sin(x)*cos(x)^3%0 pi/2
y1=x*atan(x);%0 1
a=int(y,x,0,pi/2)
b=int(y1,x,0,1)
% 上下限也可以是符号变量
syms t1 t2
a=int(y,x,t1,t2)
b=int(y1,x,t1,t2)
% 无穷
syms x
y=(1+x^2)/(1+x^4)
a=int(y,x,-inf,inf)
%转具体数值
%a=double(y,x,-inf,inf)%vpa(a,8)
%% 二重积分
syms x y
w=sin(pi*x/(2*y))
IIW=int(int(w,y,sqrt(x),x),x,1,2)+int(int(w,y,sqrt(x),2),x,2,4);
IIW=simplify(IIW);
%% 三重积分
syms  x y z rho
rho=(x+y+z);
W=int(int(int(rho,z,0,1),y,0,1),x,0,1);

%% 数值积分
syms x
y=(x*asin(x))/sqrt(1-x^2);
A=int(y,x,0,0.5);%无法实现,用下面的方式
%% trapz
% x=0:0.001:0.5;
% format long
% y=(x.*asin(x))/sqrt(1-x.^2);
% A=trapz(x,y)  %未实现
%% 自适应辛普森 quad 在以后的版本中会移除
% 第一种 Q=quad(fun,a,b)
y=@(x) (x.*asin(x))./sqrt(1-x.^2);
a=quad(y,0,0.5)
y=@(x) sin(x).cos(x).^3;
q=quad(y,0,pi/2,1e-18)
% 保存成.m函数
y='sin(x).*cos(x).^3';
fid=fopen('myfun.m','w')
fprintf(fid,'%s\r\n','function y=myfun(x)');
fprintf(fid,'%s','y=');
fprintf(fid,'%s',y);
fprintf(fid,'%s',';');
fclose(fid);
a=quad(@myfun,0,pi/2)

% quadl quadv dblquad triplequad
% integral integral2 integral3
%% integral

y=@(x) 1./(sqrt(4-x.^2));
q=integral(y,0,2-eps);
y=@(x) (1+x.^2)./(1+x.^4);
q=integral(y,-inf,inf);
%函数可带参数
y=@(x,c) (1+x.^2)./(c+x.^4);
q=integral(@(x) y(x,5),-inf,inf) 
%向量积分
y=@(x) (1:6)*x;
q=integral(y,0,1,'ArrayValued',true)
%设置误差
y=@(x) log(x);
q=integral(y,0,1)
q1=integral(y,0,1,'RelTol',1e-19,'AbsTol',1e-15)
%% 二重积分 integral2
w=@(x,y) sin(pi*x./(2.*y));
ymin=@(x) sqrt(x);
ymax=@(x) x;
q=integral2(w,1,2,ymin,ymax)%1 2是最外部分的积分范围
a=2
w=@(x,y) a*sin(pi*x./(2.*y));
ymin=@(x) sqrt(x);
ymax=@(x) x;
q=integral2(w,1,2,ymin,ymax)%1 2是最外部分的积分范围
%还有RelTol、AbsTol均可设置
% 积分方法选择  tiled用于有限区间  iterated  可用于无限区间
f=@(x,y) exp(-(x.^2+y.^2));
a=integral2(f,-inf,inf,-inf,inf,'method','iterated')%默认的是tiled
%% 三重积分
rho=@(x,y,z)(x+y+z);
W=integral3(rho,0,1,0,1,0,1)
w=@(x,y,z) z;
ymin=@(x) -sqrt(1-x.^2);
ymax=@(x) sqrt(1-x.^2);
zmin=@(x,y) x.^2+y.^2;
zmax=@(x,y) sqrt(2-x.^2-y.^2);
q=integral3(w,-1,1,ymin,ymax,zmin,zmax)

%% 符号极限
syms x b
y=(sin(pi/2+x)-1)/x
a=limit(y,0)%x趋近于0
a1=limit(y,b)
a2=limit(y,x,0)%指明对哪个参数求极限,对x
a3=limit(y,x,0,'left')%求左极限
a4=limit(y,x,0,'right')

syms h x
y=(sin(pi/2+x+h)-1)/x;
a=limit(y,h,0)

y=[1/x,x]%同时求解1/x和x的极限
a=limit(y,x,inf)

%% 工具 funtool
%% 多项式及其运算(1) 多项式计算是科学计算中我们常见的简单的数学表达式,那么在MATLAB中是如何创建多项式的计算的
%n次多项式的表示形式一般如下:P=。。。。。a3*x^3+a2*x^2+a1*x+a0
%在MATLAB中,将其系数从最高阶到0阶依次组合,写成向量的形式
%即P0=【。。。。a3 a2 a1 a0】在系数为0的地方,一定要用0,不能空着不写

%
p=[1 4 5];%这就可以代表一个多项式,如果想看他的具体形式,就用破了poly2sym这个函数
syms a b c t x
%poly2sym
y=poly2sym(p);%默认变量是x
y1=poly2sym(p,t);
y2=subs(y1,t,(x+1))%将t替换成x+1
y3=subs(y1,t,exp(x+1))
% 加法
p1=[a b c]
p2=p1+p%必须同阶才行
y4=poly2sym(p2)
%减法 也需同阶
p3=p1-p;
y5=poly2sym(p3)
%点乘
p4=p1.*p;
y6=poly2sym(p4)
%乘法需要conv这个函数,这是计算卷积的函数,也可以计算多项式乘法
p=[1 4 5]
p1=[5 3 2 5]
p5=conv(p,p1)
p5=poly2sym(p5)
%除法 deconv,p5是p与p1的乘积,让p5加上一个数再除以p
p5=p5-3*x+10%这个是符号表达式,无法进行相除操作
p5=sym2poly(p5)%用这个函数转换一下
[p6,p7]=deconv(p5,p)%p7是余数
pp=conv(p6,p)+p7
%% 多项式及其运算(2)
%求值运算 polyval 拟合用的比较多
p=[5 6 2 3];%已知多项式的系数
y=polyval(p,2)%可以求单坐标处的y值,即x=2时
y=polyval(p,linspace(0,5,10))

扫描二维码关注公众号,回复: 3729539 查看本文章

%多项式求根 roots
p=[1 0 -1]%x^2-1 实根
y=roots(p)
p=[1 0 1]%复根
y=roots(p)
%已知根求多项式
P1=poly2sym(poly(y))

%多项式微积分
%微分

a=[2 3 5 6];
b=[5 2 6];
aa=poly2sym(a)
bb=poly2sym(b)
da=poly2sym(polyder(a))
dab=poly2sym(polyder(a,b))%求a*b的微分
ab=poly2sym(conv(a,b))
%有理分式的导函数 导函数分子为q,分母为r
[q,r]=polyder(a,b)%求a乘b的微分,结果为q/r
%积分 polyint
p=polyint(sym2poly(da))%常数项为0
p=polyint(sym2poly(da),6)%加上常数项

%% 数据分析
%最大最小

A=[4 5 6 9 8]
Amax=max(A) %一个向量,列向量也可以
A=[4 5 6;8 5 2;4 2 1];%A是一个矩阵,计算每一列的最大值
Amax=max(A)
[Amax1,I]=max(A,[],1)%求列的最大值,Amax是值,I是每一列的位置
Amax2=max(A,[],2)%求行最大
Amax3=max(max(A))%求最大
%如果想找矩阵中最大值的坐标可以这样弄
[Amax1,I]=max(A(:));
[r,c]=ind2sub([3,3],I)
%求最小用法是一样的,函数是min
%排序 sort
A=[4 5 8 7 1]
b=sort(A)%升序排序
b1=sort(A,'descend')%降序排序
A=[4 5 6 2 1;7 8 2 5 1]
b=sort(A)%每一列进行升序排列,横着
b1=sort(A,2)%每一行进行升序排列,竖直
%也可以对字符串排序
name={'Jone','Bale','Abel','Kate'};
name1=sort(name)%不支持dim和descend ascend
%求和 sum
A=[7 8 4 5];
a=sum(A)%求和
A=[4 2 3;7 1 8];
a=sum(A,1)%求每一列的和
a=sum(A,2)%求每一行的和
c=sum(sum(A))%求和
%累计求和 cumsum Cumulative sum
A=[7 8 4 5];
a=cumsum(A)%结果是第一个数是A第一个数,第二个数是A的前两个数和,第三个数是A前三个数的和
A=[4 2 3;7 1 8];
a1=cumsum(A,1)%按列进行
a2=cumsum(A,2)%按行
%求积 
A=[4 5 6 2 1;7 8 2 5 1]
a=prod(A,1)%每一列求积
a1=prod(A)%每一列求积
a2=prod(A,2)%求每一行求积
a3=prod(prod(A))
%累积求积 cumprod
A=[7 8 4 5];
a=cumprod(A);
A=[4 2 3;7 1 8];
a1=cumprod(A,1)%按列进行
a2=cumprod(A,2)%按行
%平均值
A=[1 2 3]
a=mean(A)
A=[1 2 3;4 5 6];
a=mean(A,1)%按列
a=mean(A,2)%按行
%三维数组
A(:,:,1)=[1 2 3;4 5 6];
A(:,:,2)=[3 1 9;4 4 2];
a=mean(A)%先计算第一页,按列,在计算第二页,按行
a=mean(A,2)%先计算第一页,按行,在计算第二页,按列
A=[1 0 0 1 NaN 1 NaN 0];
M=mean(A,'omitnan')%消除NaN includedan
%中位数 
A=[1 2 3 4 5 6 2]
a=median(A)
A=[1 2 3 4 5 6 2 4]
a=median(A)
a=median(A,2)%每一列的中位数
%方差
A=[4 5 2 3 6]
a=var(A)  % 1/(n-1)
A=[4 -7 3; 1 4 -2;10 7 9];%矩阵,按列计算 ,1/(n-1)*【】
a=var(A)  % 1/(n-1)
a=var(A,1)%默认是0,1/(n)
a=var(A,0,1)%按列计算 
a=var(A,0,2)%按行计算 
%如果包含NaN元素,可以去掉
A=[4 5 6 1 NaN]
a=var(A,'omitnan')
%标准差 std 用法和var一样
A=[4 5 2 3 6]
a=sqrt(var(A))
a1=std(A)
A=[4 -7 3; 1 4 -2;10 7 9];%矩阵,按列计算 ,1/(n-1)*【】
a=sqrt(var(A))
a1=std(A)
a=sqrt(var(A,1))  % 1/(n-1)
a=std(A,1)%默认是0,1/(n)

猜你喜欢

转载自blog.csdn.net/weixin_42107106/article/details/82935225