首页 > 其他分享 >MATLAB操作

MATLAB操作

时间:2022-12-01 00:34:12浏览次数:56  
标签:ii cos 函数 syms MATLAB diff 操作 sin

MATLAB

一、基本操作

CSDN文章:基本使用入门

CSDN文章:基本使用拾遗

文件命名规则

matlab的m文件的命名规则:

  • 文件名命名要用英文字符,首字符不能是数字或下划线;
  • 文件名不能与matlab的内部函数名相同。m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成。原因是简单的单词命名容易与matlab内部函数名同名,结果会出现一些莫名其妙的错误;
  • 文件存储路径最好为英文路径。如果用带有中文的路径,某些情况下会出问题。
  • m文件名中不能有空格。若需要用两个或以上单词组合作为文件名,各单词必须直接连接组合(可以把每个单词首字母大写以作区分,或者使用下划线)。如random walk,应该写成RandomWalk或者Random_Walk。

常用命令

帮助类

  • demo :输入demo直接回车可以弹出安装在本地的帮助文档,当然,也可以用浏览器访问在线的帮助文档——Matlab在线帮助文档,善用搜索功能!

  • help :查找具体函数或算法的利器!等同于命令doc,使用方法就是help加上需要查找的内容。类似命令:helpwin (简化版的 help)和helpdesk(单独使用,定位到帮助文档首页)

  • lookfor :在help中搜索关键字(排序原则是将包含搜索内容的按数字母排序)

清除类

  • clc :清除命令窗口的内容(类似于串口终端的清屏功能)
  • clear :清理右边工作区的变量(慎用!注意与clc区分!)
  • clf :清除图像窗口
  • close (all):关闭图像窗口

设置数据格式

  • format :设置数据的格式,如下图所示:

    另外还有format rat表示运算结果用分数表示。

显示变量

  • who :显示当前所有变量的名字

  • whos :显示当前所有变量的详细信息。

其他命令

  • pack :整理工作间的内存
  • load :从文件中导入工作区(一般是mat后缀的文件)
  • save :把工作区的所有变量存入文件中,一般都保存为mat后缀的文件
  • what :显示指定的Matlab文件。
  • which :定位函数或文件
  • path :获取或设置搜索路径
  • echo :命令回显
  • cd :改变当前的工作目录
  • pwd :显示当前的工作目录(这个普适性很强)
  • dir :显示目录内容
  • unix :执行unix命令
  • dos :执行dos命令
  • !:执行操作系统命令
  • computer :显示计算机类型。
  • ver :单独使用,查看MatLab和Windows版本。

常用函数

% 交互函数 input
prompt = 'What is the original value? ';
x = input(prompt) (括号里为说明,不能为空)

% 打印函数
% display(X)
% display(X,'DisplayName')
a = 2
display(a) % 2
display(a,'A') % A = 2
% fprintf(format,data)
例子:
fprintf('x=%d,y=%d,%s=%d\n',1,2,'z',3);

% 阶乘函数
factorial(n) % 返回n的阶乘

定义函数文件

% 保证函数文件在当前路径
function y = FuncDemo(c, t) % 输出变量 = 函数名称(输入变量)
% 具体语句
y=c(1)*exp(c(2)*t);
% 文件名最好与函数名同名

inline函数和匿名函数

% inline函数
% 格式:函数名=inline('函数表达式','变量名1','变量名2',...)
f=inline('sum(1:m)','m');
f(100) % 5050

% 匿名函数
% 格式:函数名=@(变量名1,变量名2,...)函数表达式
f=@(m)sum(1:m);
f(100) % 5050
feval(f, 100) % 5050

循环语句和分支语句

带有步长的for循环

输出1到10之间的奇数和

% 格式
% for 循环变量=数组
% 		函数体
% end
sum = 0;
for ii = 1:2:10
    sum = sum + ii;
end

while重复执行语句,直到表达式为 False

使用 while 循环计算 factorial(10)。

% 格式
% while 条件式
% 		函数体
% end
n = 10;
f = n;
while n > 1
    n = n-1;
    f = f*n;
end

多分支if语句

a=[1,2,3,4,5];
for ii=1:5
    if a(ii)==1
        disp('one');
    elseif a(ii)==2
        disp('two')
    else disp('other')
    end
end

终止当前运算

当你不小心写了一个死循环或者运行了一个庞大的数据文件发现 左下角状态栏 一直显示正忙,想要终止运行又不想关掉软件,可以使用

  • 进程终止操作,Ctrl + C

符号运算

% 定义符号变量
syms x y a b
z=sin(x)+cos(y) % 符号表达式

% 将数字表达式转换为符号表达式
ss=sym('2008+sqrt(2)');

% 计算符号表达式
% 先给符号表达式里的变量赋值
% 或者是求符号表达式的近似解
eval(符号表达式变量名)
vpa(符号表达式变量名, 结果保留的小数位数)

二、矩阵及其运算

矩阵的构建索引

% 初始化
ones(m,n):产生m*n维的全1矩阵;
zeros(m,n):产生m*n维的全0矩阵;

% 输入3行3列的矩阵,分号换行
a=[1,2,3;4,5,6;7,8,9];

% 构造一维等差数列
b=0:3:10;
b=0:5; % 忽略增量1
b=10:-3:0; % 递减等差数列

% 将区间[a, b]等分成c-1份
b=linspace(a, b, c);

% 查询一维数组长度
length(b);

% 查询二维数组尺寸(行、列)
size(a);

% 矩阵索引 
a=[1,2,3;4,5,6;7,8,9]; % 列优先储存(下标从1开始)
a(8) % 6
a([1 3 5]) % 1 7 5
a([1 3; 1 3]) % [1 7; 1 7]
a(3, 2) % 8(第三行第二列)
a([1 3], [1 3]) % [(1, 1), (1, 3); (3, 1), (3, 3)] = [1, 3; 7, 9]
a(:) % [1;4;7;2;5;8;3;6;9] (a中所有元素按列优先顺序排成列向量)
a(2, 1:3) % 返回a的第二行的1至3列
a(2,:) % 返回a的整个第二行

% 矩阵拼接
e=[a;d] 

% 修改矩阵元素
e(3, 4) = 15 % 索引+赋值

矩阵的运算

特殊矩阵的构建

zeros(m, n) % m*n的0矩阵
ones(m,n) % m*n的全1矩阵
eye(n) % n*n的单位矩阵
v=[1,2,3,4]; diag(v); // 对角线元素是v的对角矩阵
rand(m, n) % 随机矩阵
randn(n) % 返回一个n*n的随机项的矩阵(符合正态分布)
magic(n) % 魔术矩阵
hilb(n) % Hilbert matrix h(i,j) = 1 / (i + j - 1)
invhilb(n) % Hilbert matrix的逆矩阵
v=[1,2,3,4]; vander(v) % 范德蒙德矩阵 

三、绘制图像基础

二维曲线绘图函数

注意:'fun'即可以是符号表达式,可以是syms定义的符号变量,也可以是匿名函数

绘制表达式

x 的默认区间 [-5 5] 绘制 sin(x)

fplot(@(x)sin(x))

绘制参数曲线

绘制参数化曲线

\[\left\{ \begin{array}{c} x=cos(3t)\\ y=sin(2t)\\ \end{array} \right. \]

xt = @(t) cos(3*t);
yt = @(t) sin(2*t);
fplot(xt,yt)

绘制线图

x 创建为由 0 和 2π 之间的线性间隔值组成的向量。在各值之间使用递增量 π/100。将 y 创建为 x 的正弦值。创建数据的线图。

x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)

三维曲线函数函数

绘制三维螺旋图

t 定义为由介于 0 和 10π 之间的值组成的向量。将 stct 定义为正弦和余弦值向量。然后绘制 stctt

t = 0:pi/50:10*pi;
st = sin(t);
ct = cos(t);
plot3(st,ct,t)

绘制三维参数化线条

绘制三维参数化线条

\[\left\{ \begin{array}{c} x=sin(t)\\ y=cos(t)\\ z=t \end{array} \right. \]

在参数范围 [-5 20] 内。

(默认参数范围是 [-5 5] 。)

xt = @(t) sin(t);
yt = @(t) cos(t);
zt = @(t) t;
fplot3(xt,yt,zt,[-5 20])

图形的说明和定制

例子:由参数方程绘制空间曲线

clear; close;
t=0:0.1:20;
r=exp(-0.1*t);
x=r.*cos(t);
y=r.*sin(t);
z=sqrt(t);
subplot(1,2,1)
plot3(x,y,z);
title('螺旋线');
text(x(end),y(end),z(end),'end')
xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴');
subplot(1,2,2);
plot3(x,y,z);
grid on

四、 数学基础

预定义的变量

sum(x)求和

在已知一个具体数字组成的向量或矩阵时,可以直接使用sum(x)的指令来进行求和

  • 如果x为一个向量,那么所求出的结果为向量所有元素之和;
  • 如果x为一个矩阵,那么求出的结果为一个向量,且向量元素的数量为矩阵x的列数,即每个元素为矩阵x一列元素之和。

例1

创建一个向量并计算各个元素的总和

A = 1:10;
S = sum(A)

例2

创建一个矩阵并计算每列中元素的总和

A = [1 3 2; 4 2 5; 6 1 4]
S = sum(A)

prod(x)求积

如果x是向量,则返回x的元素之积;如果x是矩阵,则返回矩阵各列之积

% 求100!的值
prod(1:100);

solve解方程(组)

方程解有两类

​ 1.数值解 -- 近似解

​ 2.符号解 -- 精确解

% 用solve解单个方程,将方程移项f=0
% 匿名函数写法
solve(@(变量列表)f)
例子:solve(@(x,a,b,c)a*x^2+b*x+c)
% 符号变量写法
syms a b c x;
f = a*x^2+b*x+c;
solve(f,x)

% 用solve解方程组
% 将方程移项得到f1=0, f2=0, 要用矩阵接收返回的结果
% 匿名函数写法
solve(@(变量列表)f1, @(变量列表)f2, ……)
例子:[x,y]=solve(@(x, y)x+y-3, @(x,y)x-y-1)
% 符号变量写法
syms x y
f1=x+y-3;
f2=x-y-1;
[x,y]=solve(f1,f2,x,y);

求代数方程f(x) = 0的根,可以使用MATLAB中的命令solve(f, x),输出结果即为f(x) = 0的所有符号解或精确解。
  如果需要求方程组的解,如

\[\left\{ \begin{array}{c} f(x,y)=0\\ g(x,y)=0\\ \end{array} \right. \]

可以使用指令[x, y] = solve(f, g, x, y)求出。

需要注意:这个solve指令可能求出的并不是唯一解,也有可能不是精确解,需要自己根据实际情况判断选择。

例1

求解

\[\left\{ \begin{array}{c} 3x^2+5y=0\\ 2x-3y=6\\ \end{array} \right. \]

syms x y;
f1 = 3*x^2+5*y;
f2 = 2*x-3*y-6;
[x,y] = solve(f1,f2,x,y)

可以再用

y=double(y);

将所得结果强制转换成double类型

例2

求解

\[ax^2+bx+c = 0 \]

syms a b c x;
f = a*x^2+b*x+c;
solve(f,x)

fzero求函数零点

MATLAB中求函数零点的方法都是使用牛顿迭代法求出的近似解

需要注意:如果使用的命令不同,或者选择的初始点不同,那求出的结果也会有差异。

% 法一:f为匿名函数
fzero(@(x)-4/x^5-(1/16-1),[1,2])
% 法二: f为inline函数
f=inline('-4/x^5-(1/16-1)','x');
fzero(f,[1,2])
% 法三:f为符号表达式
fzero('-4/x^5-(1/16-1)',[1,2])
% 法四
syms x
f=-4/x^5-(1/16-1);
fzero(char(f),[1,2])

只能求区间里面的一个零点,并且要求在给定区间端点函数值异号,所以使用之前应该先作图,得出单个零点分布的区间,然后使用该函数求零点.若有多个零点,则需多次使用该函数.

如需求上例中的全部零点,先作图

plot(@(x)x.^2-3*x-4,[-10,10]);

得知两个零点的分布区间,然后两次使用fzero函数求对应区间的零点.

x1 = fzero(@(x)x.^2-3*x-4,[-2,0]);

x2 = fzero(@(x)x.^2-3*x-4,[2,6]);

roots()用于多项式方程的求根

roots(A):表示在复数范围内求多项式方程

\[a_nx^n+a_{n-1}x^n-1 +...+a_1 x+a_0 =0 \]

的所有根,其中

\[A=[a_n ,a_{n-1} ,…,a_1 ,a_0 ] \]

例子:

​ 求解方程

\[x^6 +5x^4 -x^3 -6x^2 -5x+8=0 \]

​ 的所有根

A =[1,0,5,-1,-6,-5,8];
roots(A)

fminbnd()求一元函数极小值

注意:这里求出的是局部范围内的最值,相当于求极值的函数,如果需要求最值需要再根据实际情况判断一下。

  • 函数fminbnd的算法基于黄金分割法和二次插值法,要求目标函数必须是连续函数。

  • fminbnd 只能给出局部解。

  • 除非左端点 x1 非常靠近右端点 x2,否则 fminbnd 从不计算 fun 在端点处的值,因此只需要为 x 在区间 x1 < x < x2 中定义 fun

  • 如果最小值实际上出现在 x1 或 x2 处,则 fminbnd 返回区间 (x1,x2) 内部靠近极小值的点 x

  • fminbnd是求函数-f(x)的极小值,若要求极大值,只需求-f(x)的极小值再取相反数即可。

% fun可以是匿名函数、符号表达式(带单引号),char(符号变量)
x=fminbnd(fun,x1,x2)
[x,y]=fmidbnd(fun,x1,x2)

sin(x) 函数在 0<x<2π 范围内的最小值的点。

% 法一:fun为匿名函数
[x,y]=fminbnd(@(x)sin(x),0,2*pi)
% 法二:fun为符号表达式
[x,y]=fminbnd('sin(x)',0,2*pi)

sin(x) 函数在 0<x<2π 范围内的最大值的点。

% 法一
[x, y]=fmidbnd(@(x)-sin(x),0,2*pi);
y=-y;
% 法二
syms x
f=sin(x);
[x,y]=fminbnd(char(-f),0,2*pi);
y=-y;

表达式化简

​ 在计算积分的解析解时,我们常常会得到一个非常复杂的表达式,可读性较差,因此化简表达式就显得很有必要。下面总结一些常用是化简表达式的指令【MATLAB 2019版本适用

  • pretty(f) —— 将符号表达式化简成与高等数学课本上显示符号表达式形式类似(大大提升表达式可读性!

  • collect(f) —— 合并符号表达式的同类项

  • horner(f) —— 将一般的符号表达式转换成嵌套形式的符号表达式

  • factor(f) —— 对符号表达式进行因式分解

  • expand(f) —— 对符号表达式进行展开

  • simplify(f) —— 对符号表达式进行化简,它利用各种类型的代数恒等式,包括求和、积分、三角函数、指数函数以及 Bessel 函数等来化简符号表达式。【这个指令应该是simple的更新版,目前simple指令不能用了

五、微积分

参考文章

CSDN文章:MATLAB在高等数学中的应用

知乎文章:matlab拯救高数

一元函数的图形

利用一般方程

% 法一
x=a:t:b;
y1=f(x);
y2=g(x);
plot(x,y1,':',x,y2,'-');

% 法二
ezplot(符号表达式/符号变量,[a,b]);
例子:
syms x;
f=x*sin(x)^2;
ezplot(f,[0,pi])

% 技巧:
sin cos 在[-2*pi,2*pi]
tan cot 在[0,3*pi]
asin acos [-1, 1]

利用参数方程

% x,y为含t的参数方程,x y可以是符号表达式或者符号变量,[a,b]为t的范围
ezplot(x,y,[a,b]);

利用极坐标方程

% 法一:利用polar(theta,rho), theta为极角范围矩阵,rho为将极角带入极坐标方程后得到的极径的范围矩阵
例子:
theta=0:0.1:2*pi;
rho=3*cos(3*theta);
polar(theta,rho)
% 法二:ezpolar
例子:
ezpolar('3*cos(3*t)');
或者
syms t
f=3*cos(3*t);
ezpolar(f);

利用隐函数

% ezplot('f(x,y)',[xmin,xmax,ymin,ymax]),其中f(x,y)是移项的结果,会画出f(x,y)=0在范围内的图形
例子:
ezplot('(x^2+y^2)^2-x^2+y^2',[-1,1,-0.5,0.5]);

利用分段函数

% 写法一
clear 
close
x=-10:0.1:10;
y=zeros(1,length(x));
for ii=1:length(x)
    if x(ii)<=0
        y(ii)=cos(x(ii));
    else 
        y(ii)=exp(x(ii));
    end
end
plot(x,y)
% 写法二
clear 
close
y=[];
for x=-10:0.01:10
	if x<=0
		y=[y,cos(x)];
	else 
		y=[y, exp(x)];
	end
end
x=-10:0.01:10;
plot(x,y)

求极限

在MATLAB中,求函数极限的命令是limit,其中的参数比较简单,参见下表。

需要注意:并不是所有的极限都可以使用limit指令来求出,部分极限求不出来,会得到NaN的输出。

步骤

  1. 定义符号变量
  2. 使用limit函数
syms x
limit(f(x),x,a);
limit(f(x),x,a,'right');
limit(f(x),x,a,'left');
limit(f(x),x,inf);
limit(f(x),x,-inf);

例1

求极限

\[lim(1+2t/x)^{3x}\quad (x\to\infty) \]

syms x t;
f=(1+2*t/x)^(3*x);
limit(f,x,inf)

例2

求重要极限

\[sin(x)/x\quad (x\to0) \]

syms x ;
limit(sin(x)/x,x,0)

求一元函数导数

步骤

  1. 定义符号变量
  2. 调用diff函数
syms x y % 重要
diff(f(x));
diff(f(x),n);
diff(f(x,y),x);
diff(f(x,y),x,n);

隐函数求导

公式

由方程f(x,y)=0确定的隐函数的导数为:

令z=f(x,y),则dy/dx=-(dz/dx)/(dz/y);dx/dy=-(dz/dy)/(dz/dx)

例子

syms x y
z=2*x^2-2*x*y+y^2+x+2*y+1;
dy_dx=-diff(z,x)/diff(z,y);

参数方程求导

公式

一阶导:dy/dx=dy/dt * dt/dx = (dy/dt) / (dx/dt)

二阶导:d2 y/dx2 =(dy/dx)/dt / (dx/dt)

例子

syms t
x=exp(t)*cos(t);
y=exp(t)*sin(t);
dy_dx=diff(y,t)/diff(x,t)
d2y_dx2=diff(dy_dx,t)/diff(x,t)

画出一元函数及其某一点切线的图形

% 求出切线的斜率和该点的函数值
syms x
f=2*x^3+3*x^2-12*x+7;
df=diff(f,x);
x=-1;
k=eval(df);
y0=eval(f);

% 求出k和y0后,点斜式写方程
x=-4:0.1:3;
y=2*x.^3+3*x.^2-12*x+7;
y1=20-12*(x+1);

% plot画图
plot(x,y,'b',x,y1,'r');

求解x为非数值时的函数值

syms x a b
df=diff(sin(a*x)*cos(b*x),x);
x=1/(a+b); % 非数值
dfx=eval(df) % eval求解即可

求函数的单调区间

步骤

  1. 求一阶导
  2. 画函数图像
  3. 求一阶导零点
  4. 求各区间的导数值正负

例子 求y=x^3-2*x+1的单调区间

% 求一阶导
syms x
f=x^3-2*x+1;
dy_dx=diff(f,x);
% 求一阶导零点
x0=solve(dy_dx,x);
double(x0);
% 求各区间的导数值正负
f=inline(char(dy_dx),'x');
f(-1)
f(0)
f(1)

求函数极值

% 法一
% 画函数图像确定极值点范围
% 求极小值
syms x
f=x/(1+x^2);
[xmin,ymin]=fminbnd(char(f),-10,10);
f1=-f;
[xmax,ymax]=fminbnd(char(f1),-10,10);
ymax=-ymax

% 法二
clear 
close
syms x
f=@(x)x/(1+x^2);
dy_dx=diff(f,x);
x0=solve(dy_dx,x);
for ii=1:length(x0)
    display(x0(ii),'x')
    display(f(x0(ii)),'y')
end

求函数的凹凸区间和拐点

定义:二阶导为正,函数凹;二阶导为负,函数凸;拐点为二阶导零点

例子:求y=1/(1+2*x^2)的凹凸区间和拐点

syms x
f=1/(1+2*x^2);
erjiedao=diff(diff(f,x),x);
x0=solve(erjiedao,x);
x0=double(x0)
% 转成inline函数,方便求值
erjiedao=inline(char(erjiedao),'x');
erjiedao(-0.5)
erjiedao(0)
erjiedao(0.5)
% 画图
ezplot(char(f),[-3,3])

证明函数不等式

移项构造F(x),求其最值

步骤:

  1. 画函数图像观察
ezplot('atan(x)+1/x',[-1,10])
% 画直线(两点式)
plot([x1,x2],[y1,y2]);
  1. 求最值(fminbnd)

求一元函数积分

使用int()求积分

int()求不定积分时,不自动添加积分常数C

f(x)是关于syms定义的符号变量

例1

求一元表达式的不定积分

syms x
expr = -2*x/(1+x^2)^2;
F = int(expr)

例2

求多元表达式关于变量xz的不定积分

syms x z
f = x/(1+z^2);
Fx = int(f,x)
Fz = int(f,z)
F = int(f)  %如果不指定积分变量,则int使用第一个变量作为积分变量

使用quad()求数值积分

  • 辛普森法(Simpson)
     梯形法是将积分区间分解为一个个等距的小梯形,然后将所有梯形的面积求和,即得到该函数在设定区间上的积分,这种积分方法存在一个问题,那就是当曲线波动较大时,梯形的斜边拟合曲线误差较大,因此又提出了将斜边换为曲线的方法,而抛物线作为最简单的曲线成为首选。即将积分单元从梯形改为曲边梯形,且曲边为抛物线,此即辛普森法(Simpson)。

  • 自适应辛普森法(Adaptive Simpson)
      使用辛普森法相比于梯形积分法确实误差减小了很多,但是计算量也增加了不少。其中最为主要的影响因素就是采样点的多少,即各个子区间的大小。当子区间越小,积分计算结果的精度越高,但计算量也越大。据此人们又提出了自适应辛普森法(Adaptive Simpson)。即当曲线变化不均匀时,选择在波动剧烈的曲线段增加采样点,减小采样间距;在波动较为平缓的曲线段减少采样点,增大采样间距。这样可以在保证精度的同时尽量减少计算量。因此该方法应用最为广泛。

  • 对于标量值问题,函数 y = fun(x) 必须接受向量参数 x 并返回向量结果 y,其中 y 是被积函数在 x 的每个元素处的计算结果。此要求通常意味着 fun 必须使用数组运算符(.^.* 等)而不是矩阵运算符(^* 等)。

% 法一:f(x)为匿名函数
quad(@(x)sin(x.^2),0,1)
% 法二:f(x)为符号表达式
quad('sin(x.^2)',0,1)
% 法三:f为syms定义的符号变量
syms x
f=sin(x.^2);
quad(inline(f,'x'),0,1)

例1

计算积分

\[\int_0^3\frac 1{x^3−2x−5 } \]

myfun = @(x) 1./(x.^3-2.*x-5);   %首先,创建一个计算被积函数的匿名函数 myfun。
q = quad(myfun,0,2)

对于重积分,自适应辛普森方法也有对应的指令:

求变上限积分函数及其导数

% 求变上限积分并求其导数
syms x t % 注意被积函数和上限函数要用不同的符号变量
f=sin(t)+cos(t);
i=int(f,t,x,2*x) % 得到变上限积分
s=diff(i,x) % 得到其导数
% 计算抽象被积函数的变上限积分函数的导数
syms x t
diff(int('w(t)',t,0,(cos(x))^2),x)

定积分求体积(元素法)

% 求旋转体体积
% 原理1:若绕x轴或y轴旋转的图形为类圆柱形,dv=(pi*(f(x))^2)dx
例子:
syms x
f=x*(sin(x))^2;
v=int(pi*f^2,x,0,pi)
% 原理2:若绕特定直线旋转,用柱壳法,dv=(2*pi*x*f(x))dx
syms x
f=x*(sin(x))^2;
v=int(2*pi*x*f,x,0,pi)

使用integral()求数值积分

  • q = integral(fun,xmin,xmax) 使用全局自适应积分和默认误差容限在 xminxmax 间以数值形式为函数 fun 求积分。

例1

计算积分

\[\int_0^3\frac 1{x^3−2x−5 } \]

myfun = @(x) 1./(x.^3-2.*x-5);   %首先,创建一个计算被积函数的匿名函数 myfun。
q = integral(myfun,0,2)

绘制空间图形

空间曲线的绘制

% 下面的x y z都是参数t的函数,即参数方程
% 法一
plot3(x,y,z) % x y z为相同长度的向量
plot3(x1,y1,z1,x2,y2,z2) % 同时绘制多条空间曲线

% 法二 
ezplot3(x,y,z,[a,b]); % x, y, z是符号表达式(加单引号)或者由syms定义的符号变量(不加单引号)或者匿名函数,[a,b]为t范围

% 法三
fplot3(x,y,z,[a,b]); % x, y, z可以是由syms定义的符号变量(不加单引号)或者匿名函数,[a,b]为t范围

使用plot3()绘制三维点或线图

plot3(X,Y,Z) 绘制三维空间中的坐标。

  • 要绘制由线段连接的一组坐标,请将 XYZ 指定为相同长度的向量。

  • 要在同一组坐标轴上绘制多组坐标,请将 XYz 中的至少一个指定为矩阵,其他指定为向量。

例1

绘制螺旋线

\[\left\{\begin{array}{c} x=sint+t\cdot cost\\ y=cost-t\cdot sint \\ z=t \end{array}\right. (0\leqslant t\leqslant 10) \]

t = linspace(0,14*pi,200);
x = sin(t)+t.*cos(t);
y = cos(t)-t.*sin(t);
z = t;

subplot(1,2,1)
plot3(x,y,z)    %有200个数据点,曲线较光滑
grid on

subplot(1,2,2)
plot3(x(1:3:200),y(1:3:200),z(1:3:200))   %有67个数据点,曲线较粗糙
grid on

例2

创建两组 xyz 坐标,绘制多个线条

t = 0:pi/500:pi;
xt1 = sin(t).*cos(10*t);
yt1 = sin(t).*sin(10*t);
zt1 = cos(t);

xt2 = sin(t).*cos(12*t);
yt2 = sin(t).*sin(12*t);
zt2 = cos(t);

plot3(xt1,yt1,zt1,xt2,yt2,zt2)

使用 fplot3()三维参数化曲线绘图

  • fplot3(funx,funy,funz) 在默认区间 [-5,5](对于 t)绘制由 x = funx(t)y = funy(t)z = funz(t) 定义的参数化曲线。

例1

绘制三维参数化线条

\[\left\{ \begin{array}{c} x=sin(t)\\ y=cos(t)\\ z=t \end{array} \right. \]

在参数范围 [-5 20] 内。

(默认参数范围是 [-5 5] 。)

xt = @(t) sin(t);
yt = @(t) cos(t);
zt = @(t) t;
fplot3(xt,yt,zt,[-5 20])

空间曲面的绘制

% 法一
% 已知x,y范围和曲面方程,画出曲面图
x=a1:b1:c1;
y=a2:b2:c2;
[x,y] = meshgrid(x,y);
z=f(x,y); % 注意要用'.'运算
mesh(x,y,z); % 绘制网面图
surf(x,y,z); % 绘制曲面图

% 如果要绘制z在一定范围的图形,可以这样做
i1=find(z>b); % 括号中填z的范围
i2=find(z<a);
z(i1)=NaN;
z(i2)=NaN;
mesh(x,y,z); % z的范围就是[a,b]了

% 如果已知x,y,z的参数方程,只需创建参数的二维网络坐标,再用参数矩阵算出x,y,z,然后画图即可
t=a1:b1:c1;
r=a1:b2:c2;
[r,t]=meshgrid(r,t);
x=f(r,t);
y=f(r,t);
z=f(r,t);
mesh(x,y,z);

% 法二
% 使用ezmesh和ezsurf作图
ezmesh(f(x,y), [a,b,u,v]) % f(x,y)可以是符号表达式(加单引号),也可以是syms定义的符号变量,[a,b]为x的范围,[u,v]为y的范围
ezsurf(f(x,y), [a,b,u,v]) % 同上

% 如果是参数方程,可以这样做
syms t r
x=2*sin(t)*cos(r);
y=2*sin(t)*sin(r);
z=2*cos(t);
ezmesh(x,y,z,[0,pi,0,pi]) % [a,b,u,v], [a,b]为r的范围,[u,v]为t的范围 (字典序)
ezmesh(x,y,z,[0,pi,0,2*pi])

二次曲面的参数方程

% 这个文件汇集书上画二次曲面的代码
%%
% 椭球面
% x^2/a^2+y^2/b^2+z^2/c^2=1
% 球坐标描述的参数方程为x=a*sin(u)*cos(v), y=b*sin(u)*sin(v), z=c*cos(u)
% 设曲面上一点M, OM与z轴正向夹角为u, OM在xoy平面上的投影与x轴正向的夹角为v
% 可以一个标准的椭球面0<=u<=pi, 0<=v<=2*pi
% 代码: a=2, b=3, c=1
u=0:0.1:pi; 
v=0:0.1:2*pi;
[u,v]=meshgrid(u,v);
x=2*sin(u).*cos(v);
y=3*sin(u).*sin(v);
z=cos(u);
mesh(x,y,z);

%%
% 单叶双曲面
% x^2/a^2+y^2/b^2-z^2/c^2=1
% 参数方程:x=a*sec(u)*sin(v), y=b*sec(u)*cos(v), z=c*tan(u)
% -pi/4<u<pi/4, 0<=v<=2*pi
u=-pi/4:0.1:pi/4;
v=0:0.1:2*pi;
[u,v]=meshgrid(u,v);
x=sec(u).*sin(v);
y=2*sec(u).*cos(v);
z=3*tan(u);
mesh(x,y,z);

%%
% 双叶双曲面
% x^2/a^2+y^2/b^2-z^2/c^2=-1
% 参数方程:x=a*cot(u)*cos(v), y=b*cot(u)*sin(v), z=c*csc(u)
% 上叶:0<u<=pi/2, -pi<v<pi;
% 下叶:-pi/2<=u<0, -pi<v<pi
u=pi/1000:0.1:pi/2;
v=-pi:0.1:pi;
[u,v]=meshgrid(u,v);
x=1.5*cot(u).*cos(v);
y=1.4*cot(u).*sin(v);
z=1.3*csc(u);
mesh(x,y,z);
hold on
mesh(-x,-y,-z);

%%
% 球面
% (x-a)^2+(y-b)^2+(z-c)^2=R^2
% 参数方程: x=r*sin(u).*cos(v)+a, y=r*sin(u).*sin(v)+b, z=r*cos(u)+c
% r为球半径,u为球面上的点M与(a,b,c)构成的向量与过球心A(a,b,c)且平行于z轴的直线的正向的夹角
% v为AM在xoy平面上的投影与过A(a,b,c)且平行于x轴的直线的正向的夹角
u=0:0.1:pi;
v=0:0.1:2*pi;
[u,v]=meshgrid(u,v);
x=2*sin(u).*cos(v);
y=2*sin(u).*sin(v);
z=2*cos(u);
mesh(x,y,z)

%%
% 柱面
% (x-a)^2+(y-b)^2=1
% 参数方程:x=cos(u)+a, y=sin(u)+b, z=v;
% 柱面在xoy平面上的投影为圆
% u为圆上的点与过圆心A(a,b)且平行于x轴的直线的正向的夹角 一般为[0,2*pi]
% v为柱面在z轴方向上的高度向量
u=0:0.1:2*pi;
v=-3:0.1:3;
[u,v]=meshgrid(u,v);
x=cos(u)+1;
y=sin(u);
z=v;
mesh(x,y,z);

%%
% 锥面
% (x-a)^2+(y-b)^2=z^2
% 参数方程:x=v.*cos(u), y=v.*sin(u), z=v;
% 锥面在xoy平面上的投影为圆
% u为圆上的点与过圆心A(a,b)且平行于x轴的直线的正向的夹角 一般为[0,2*pi]
% v为锥面在z轴方向上的高度向量
u=0:0.1:2*pi;
v=-3:0.1:3;
[u,v]=meshgrid(u,v);
x=v.*cos(u);
y=v.*sin(u);
z=v;
mesh(x,y,z)

求多元函数微分

求偏导数

%% 格式:diff(多元函数符号变量,自变量) 可嵌套
syms x y z
diff(f(x,y,z),x)
diff(f(x,y,z),y)
diff(f(x,y,z),x,2) % 求对x的二阶偏导数
diff(diff(f(x,y,z),x),y) % 求二阶混合偏导数

一般例子

例子:
syms x y z
z=sin(x*y)+(cos(x*y))^2;
Zx=diff(z,x)
Zy=diff(z,y)
Zxx=diff(z,x,2)
Zxy=diff(dz_dx,y)

求含有常数的函数的偏导数

% 求含有常数的函数的偏导数
% 例子:z=(a+x*y)^2 a是常数
syms x y a % 直接将a定义成符号变量即可,因为求偏导数时非自变量都是固定的,相当于常数
z=(a+x*y)^2;
diff(z,x)
diff(z,y)

求隐函数的偏导数

一个方程

% 例子: 设x^2+y^2+z^2-4*z=0  求z对x的二阶偏导数
syms x y z
F=x^2+y^2+z^2-4*z;
Fx=diff(F,x);
Fxx=diff(Fx,x);
Fz=diff(F,z);
Fxz=diff(Fx,z);
Fzz=diff(Fz,z);
Zxx=-(Fxx*Fz^2-2*Fxz*Fx*Fz+Fzz*Fx^2)/Fz^3

方程组

% 例子:已知方程组x=exp(u)+u*sin(v), y=exp(u)-u*cos(v), 求Ux,Uy,Vx,Vy
clear
close all
syms u v x y
F=x-exp(u)+u*sin(v);
G=y-exp(u)-u*cos(v);
Fx=diff(F,x);
Fv=diff(F,v);
Gx=diff(G,x);
Gv=diff(G,v);
Fu=diff(F,u);
Fy=diff(F,y);
Gu=diff(G,u);
Gy=diff(G,y);
A=[Fx,Fv;Gx,Gv];
B=[Fu,Fx;Gu,Gx];
C=[Fy,Fv;Gy,Gv];
D=[Fu,Fy;Gu,Gy];
E=[Fu,Fv;Gu,Gv];
Ux=-det(A)/det(E)
Vx=-det(B)/det(E)
Uy=-det(C)/det(E)
Vy=-det(D)/det(E)

画曲面的切平面

% 点法式
% x的范围是[-1,1] y的范围是[-1,1]
clear
close all
syms x y z
ezmesh(4/(x^2+y^2+1),[-1,1,-1,1]); % 画曲面方程
hold on
F=4/(x^2+y^2+1)-z; % 构造F(x,y,z)
Fx=diff(F,x);
Fy=diff(F,y);
Fz=diff(F,z);
x=1/4;
y=1/2;
z=64/21;
Fx=eval(Fx);
Fy=eval(Fy);
Fz=eval(Fz);
syms p q r
ezmesh((-Fx*(p-x)-Fy*(q-y))/Fz+z,[-1,1,-1,1]) % 切平面方程变形

求多元函数极值

% 例子:求f=x^3-y^3+3*x^2+3*y^2-9*x的极值
clear
clc
close all
syms x y z
f=x^3-y^3+3*x^2+3*y^2-9*x;
fx=diff(f,x);
fy=diff(f,y);
s=solve(fx,fy,x,y); % 求驻点
A=diff(f,x,2);
B=diff(fx,y);
C=diff(f,y,2);
E=A*C-B^2;
E=inline(char(E),'x','y'); % 转化成inline,方便代入数值
A=inline(char(A),'x','y');
f=inline(char(f),'x','y');
for ii=1:length(s.x)
    a=E(s.x(ii),s.y(ii));
    b=A(s.x(ii),s.y(ii));
    if a > 0
        if b > 0
            fprintf('x=%d,y=%d,极小值=%d\n',s.x(ii),s.y(ii),f(s.x(ii),s.y(ii)));
        else 
            fprintf('x=%d,y=%d,极大值=%d\n',s.x(ii),s.y(ii),f(s.x(ii),s.y(ii)));
        end
    elseif a < 0
        fprintf('x=%d,y=%d,无极值\n',s.x(ii),s.y(ii));
    else 
        fprintf('x=%d,y=%d,不确定',s.x(ii),s.y(ii));
    end
end

条件极值(拉格朗日乘数法)

% 例子:求z=x^2+y^2在条件x^2+y^2+x+y-1=0下的极值
clear
clc
close all
syms x y r
f=x^2+y^2;
g=x^2+y^2+x+y-1;
la=f+r*g; % 作拉格朗日函数
lx=diff(la,x);
ly=diff(la,y);
s=solve(lx,ly,g,x,y,r);
f=inline(char(f),'x','y');
% 输出可能的极值点和极值
for ii=1:length(s.x)
    fprintf('x=%s, y=%s, z=%f\n',s.x(ii),s.y(ii),f(s.x(ii),s.y(ii)));
end
% 画图判断,函数和条件的图像相切的点是极值点
[x,y]=meshgrid(-2:0.1:2,-2:0.1:2);
z=x.^2+y.^2;
contour(x,y,z,30,'ShowText','on')
hold on
ezplot('x^2+y^2+x+y-1',[-2,2,-2,2])

画二元函数等高线

% 使用contour
x=-2:0.1:2;
y=-2:0.1:2;
[x,y]=meshgrid(x,y);
z=x.^2-y.^2+0.5;
contour(x,y,z,20) % 参数20为等高线数量
contour(x,y,z,20,'ShowText','on') % 显示数值

无穷级数

级数求和

% 例子:
syms n
f=1/(4*n^2+8*n+3);
s=symsum(f,n,1,inf);

求收敛域及和函数

% 求4^(2*n)*(x-3)^n/(n+1) 0<=n<inf的收敛域及和函数
syms n x
symsum(4^(2*n)*(x-3)^n/(n+1),n,0,inf)
% piecewise([49/16 <= x, Inf], [x ~= 49/16 & abs(16*x - 48) <= 1, -log(49 - 16*x)/(16*x - 48)])
% 解读:x>=49/16时,发散;x!=49/16 && |16x-48|<=1,即47/16<=x<49/16时收敛,和函数为-log(49 - 16*x)/(16*x - 48)

将函数展开为幂级数(泰勒级数展开)

% 例子
% 求cos(x)的6阶麦克劳林展开式
syms x 
serl=taylor(cos(x),x,'ExpansionPoint',0,'Order',7);
% 作图对比
ezplot(cos(x),[-pi,pi])
hold on
ezplot(serl,[-pi,pi])

傅里叶级数

常微分方程

dsolve求符号解函数

% dsolve解常微分方程(组)

% 1.符号表达式写法
% 在符号表达式中,等号写‘=’。在方程表达式中,大写字母D表示对自变量(默认为t)的微分算子:
% D=d/dt,D2=d^2/dt^2,...。算子D后面的字母表示因变量,即待求解的未知函数。
% 如果方程得不到解析解,返回警告
dsolve('方程1,方程2,方程3,...','初始条件1,初始条件2,...','x'); % x为自己指定的自变量名
例子:
1.1 解微分方程
w=dsolve('D3w=-a*w','w(0)=1,Dw(0)=0,D2w(0)=0')
1.2 解微分方程组
[f,g]=dsolve('Df=f+g,Dg=-f+g','f(0)=1,g(0)=2')
或者 s=dsolve('Df=f+g,Dg=-f+g','f(0)=1,g(0)=2') % s.f, s.g

% 2. 符号变量写法
% 在该写法中,,等号为‘==’,不需要单引号,D不可以使用,需要自己求出,自己指定自变量仍要写'x'
例子:
2.1 解微分方程
syms w(t) a % w为符号函数,自变量是t
D3w=diff(w,3);
Dw=diff(w);
D2w=diff(w,2);
w=dsolve(D3w==-a*w,W(0)==1,Dw(0)==0,D2w(0)==0)
2.2 解微分方程组
syms f(t) g(t)
Df=diff(f);
Dg=diff(g);
[f,g]=dsolve(Df==f+g,Dg==-f+g,f(0)==1,g(0)==2)

欧拉折线法

标签:ii,cos,函数,syms,MATLAB,diff,操作,sin
From: https://www.cnblogs.com/zhengzirui/p/16940240.html

相关文章