MATLAB学习笔记------第一章
运动的例子
解析解
符号函数求解:dsolve函数
通常使用help('函数名')或者doc 函数名来查找帮助文档
1、微分方程的建立与求解
matlab
% 求解微分方程的解
syms v(t) Cd g m
eqn = diff(v,t) = g - Cd*v^2/m; % 微分方程式
cond = v(0) == 0; % 初始条件
S = dsolve(eqn,cond)
2、代入具体值求解
subs函数:用于变量代入计算
matlab
subs(a+b,a,4) % 第一个变量a+b是要求的式子,第二个变量是需要替换的变量,第三个变量是数值4
注意:
每次只能代入一个变量的数值,要有多个数值需要代入,可以进行嵌套或者分条代入
matlab
vt = subs(S,'m',68.1);
vt1=subs(vt,'g',9.81);
vt2=subs(vt1,'Cd',0.25); % 分条计算
vt3=subs(subs(subs(S,'m',68.1),'g',9.81),'Cd',0.25) % 嵌套计算
3、求前12s的速度值
利用循环语句进行求解
double函数是用于将复杂的计算式变为小数型的函数
matlab
i=1;
for ti=0:11
vtt(i)=subs(vt3,'t',ti);
i=i+1;
end
double(vtt) % 将复杂式子转为数值型(小数型)
4、对0-12s的速度进行画图
matlab
plot(0:20,double(vtt),'r-o','LineWidth',2)
title('0-20s的速度曲线图');
xlabel('时间t')
ylabel('速度vt')
grid on % 加网格
5、求极限速度
matlab
limS = double(limit(vt3,'t',inf));
数值解
创建bungee函数,用于计算速度值
matlab
function vt = bungeeS(m,cd,th,tend)
% m表示运动员质量,cd是阻力系数,th是时间步长,tend表示时间tend秒之前
i=1;
g = 9.81;
vbefore = 0; % v(ti)
vnext = 0; % v(t(i+1))
for ti = 0:th:tend
vnext = vbefore + (g - cd/m*vbefore^2)*th; % 迭代公式
vt(i,1) = ti;
vt(i,2) = vbefore; % 存储每时刻的速度值
i = i+1;
vbefore = vnext; % 速度值得迭代
end
plot(vt(:,1),vt(:,2),'b--','linewidth',2)
end
主文件:
matlab
% 数值解的求解
vt = bungeeS(68.1,0.25,1,20)
hold on % 保持图窗不变,在上边添加元素
plot(0:20,double(vtt),'r-o','LineWidth',1)
legend('数值解','解析解','Location','best') % 创建图例,第一个值是第一副图的
legend('boxoff') % 取消图例的黑色边框
grid on
hold off
常用命令
cd:显示目录或者改变目录
clf:清除图形窗口
disp:显示变量或文字内容
hold:图形保持命令
save:保存内存变量
strcat:字符串拼接函数
num2str:数值转字符串函数
matlab
outstr = strcat('极限是:',num2str(limS));
复数
matlab
z = complex(3,4); % 复数定义 3+4i
real(z); % 提取复数实部
imag(z); % 提取复数虚部
abs(z); % 提取复数的模
angle(z); % 提取复数的角度(以弧度为单位)
conj(z); % 共轭复数 3-4i
matlab
x = 0:0.01:2*pi;
y = x + i*x.*sin(x); % 点乘是一一对应的乘的
% 直角坐标
subplot(2,1,1)
plot(x,y)
title('直角坐标系绘图')
% 极坐标
subplot(2,1,2)
theta = angle(y);
rho = abs(y);
polarplot(theta,rho)
title('极坐标图')
简单公式计算
例1
matlab
a = 5.67; b = 7.8;
e11 = exp(a+b)/log10(a+b);
e12 = log(b-a);
e13 = a^b;
例2
matlab
x = -3.5*pi/180;
y = 6.7*pi/180;
e2 = sin(abs(x)+abs(y))/sqrt(cos(abs(x+y)));
例3
matlab
x = [2, 1+2i; -0.45, 5];
y = 0.5*log(x + sqrt(1+x^2));
例4
matlab
a = -3.0:0.1:3.0;
y = (exp(0.3*a) - exp(-0.3*a))*sin(a+0.3)/2;
q0=10; R=60; C=0.00005; t=linspace(0,0.8,100);
% Qt:第一行时间,第二行L=3,第三行L=6,第四行L=9,第五行L=12
Qt(1,:)=t;
i=2;
colors = ['r','b','g','r--'];
for L=3:3:12
qt=q0*exp(-R*t/2/L).*cos(sqrt(1/L/C-(R/2/L)^2)*t); % 公式
Qt(i,:)=qt;
plot(t,Qt(i,:),colors[i-1])
hold on
i = i+1;
end
legend('L=3','L=6','L=9','L=12')
hold off
逻辑运算符
matlab
% x表示x1,y表示x2
[x,y]=meshgrid(-1:0.05:1,-2:0.05:2);
p= 0.5457*exp(-0.75*y.^2-3.75*x.^2-1.5*x).*(x+y>1)+ ... % ... 表示续航运算符
0.7575*exp(-y.^2-6*x.^2).*((x+y>-1)&(x+y<=1)) + ... % & 运算符表示并且
0.5457*exp(-0.75*y.^2-3.75*x.^2+1.5*x).*(x+y<=-1);
% surf画三维网格图
surf(x,y,p)
shading flat % 取消图形上的线条