本文集合一些我本人使用matlab中的一些细小点。
目录
1.求极值
我的思路是有两种方法,第一种是按照极值的定义,通过导数来判断,好像matlab里没有现成的函数,需要自己编写,第二种方法就是遍历取值区间,然后用查找波峰的函数findpeaks来求出极值。
例题:
设 ,试在区间[-5,5] 上求出函数的零点,极大和极小值
方法一:
方法二:
函数的图像大概如上图。
通过下面这段代码可以求出区间内的极值(求极小值需要把求出来的值翻转一下,另外,区间想要分的更细也可以,但是比较占内存,精读看自己的需求了)
f2=@(x)(exp(1).^(2.*sin(x))).*cos(x)-(exp(1).^(2.*cos(x))).*sin(x);
x=[-5:0.0001:5];
y1=f2(x);
[a]=findpeaks(y1);
f3=@(x)-((exp(1).^(2.*sin(x))).*cos(x)-(exp(1).^(2.*cos(x))).*sin(x));
y2=f3(x);
[b]=findpeaks(y2);
b=-b;
disp('极小值为:');
disp(b);
disp('极大值为:');
disp(a);
对比最上面的函数图,可以发现效果还可以。
2.^的作用范围
比如说像这个函数,,我们敲出来的函数是这样的y=x.^2.*sin(x),这个^会不会被把sin(x)也判定为x的指数呢?
通过我的实践,结论是不会。
代码如下(x的取值为[0,2Π])
clear;
x=0:0.01:2*pi;y5=(x.^2).*sin(x);
plot(x,y5, 'b-');
hold on;
y6=x.^2.*sin(x);
plot(x,y6, 'r-');
hold on;
y7=x.^(2.*sin(x));
plot(x,y7, 'k-');
hold on;
legend({' y5','y6','y7'},'FontSize',12)
那为什么只有两条曲线呢?有两条是完全重合的,结果是y5和y6重合,也就是说明了结论。
3.画椭圆
方法一:
[x, y, z] = ellipsoid(0,0,0,1,2,2*sqrt(3));
surf(x, y, z);
ellipsoid函数说明:
方法二:
4.符号表达式替换
题目:
clear;
syms x a y;
f=@(x)((exp(1)^x)*sin(y)-x*(1+a))/x;
f=subs((exp(x).*sin(y)-x.*(1+a))./x,{'a','y'},{3,x})
f1=subs(f,'x',20);
eval(f1) %将结果表达成数值
因为替换之后的表达式,我不知道咋求值,好像直接令x=20不行,我就只能把x用20来替换,最后结果强制转成数值
5.plot函数
Matlab的plot函数画线无法显示问题解决
在使用matlab中的plot函数画图时,没有任何报错,但是画不出线,却能画出点。在查阅资料后找到问题的原因。
结论:plot的参数应该是一个向量
这里我们使用追击问题图像来进行分析。
经典错误
错误代码如下:
k=0;
A=[0,0];
B=[0,100];
v=1;
dt=1;
d=100;
while d>0.5
plot(A(1),A(2),'r');
hold on
plot(B(1),B(2),'b*');
pause(0.2);
k=k+1;
B=B+[v*dt,0];
e=B-A;
d=norm(e); e0=e/d;
A=A+2.0*v*dt*e0;
fprintf('k=%.0f A(%.2f,%.2f) B(%.2f,100) d=%.2f\n',k ,A(1),A(2),B(1),d);
end
错误代码执行结果:
错误原因:
在这段代码中我们创建了很多个点,然后想要通过plot函数画出
画点效果分析
但是我们把‘r*’选项替换成’r*'这种画点的选项图像正常显示出了点。
%% 画点
syms x
for x = -1:0.1:1
y = x^2;
plot(x,y,'r*','LineWidth',1);
hold on
end
1
2
3
4
5
6
7
画点图像显示结果:
正确代码
plot的正确使用方法是使用向量的形式,使用一个一个点plot函数无法连接相邻点,只能显示点。
正确代码如下:
k=0;
A=[0,0];
B=[0,100];
v=1;
dt=1;
d=100;
while d>0.5
plot(A(1),A(2),'r*');
hold on
plot(B(1),B(2),'b*');
pause(0.2);
k=k+1;
B=B+[v*dt,0];
e=B-A;
d=norm(e); e0=e/d;
A=A+2.0*v*dt*e0;
fprintf('k=%.0f A(%.2f,%.2f) B(%.2f,100) d=%.2f\n',k ,A(1),A(2),B(1),d);
end
正确画图结果:
plot的参数应该是一个向量
6.fzero函数
一个函数可能有多个根,但fzero函数只给出离x0最近的那个根
题目:
f2=@(x)(exp(1).^(2.*sin(x))).*cos(x)-(exp(1).^(2.*cos(x))).*sin(x);
x=[-5:0.01:5];
y=f2(x);
% plot(x,y);
[x1 y]=fzero(f2,-5);
[x2,y]=fzero(f2,-2);
[x3,y]=fzero(f2,0);
[x4,y]=fzero(f2,1);
[x5,y]=fzero(f2,1.3);
[x6,y]=fzero(f2,4);
xx=[x1,x2,x3,x4,x5,x6];
disp('零点为:');
disp(xx);
x=[-5:0.0001:5];
y1=f2(x);
[a]=findpeaks(y1);
f3=@(x)-((exp(1).^(2.*sin(x))).*cos(x)-(exp(1).^(2.*cos(x))).*sin(x));
y2=f3(x);
[b]=findpeaks(y2);
b=-b;
disp('极小值为:');
disp(b);
disp('极大值为:');
disp(a);
附录:一些碎碎念
1.计算的时候一定要注意到乘和点乘,一般都是点乘的。