MATLAB一些细小点(持续更新中)

 本文集合一些我本人使用matlab中的一些细小点。

目录

1.求极值

2.^的作用范围

3.画椭圆

4.符号表达式替换

5.plot函数

6.fzero函数

附录:一些碎碎念



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.计算的时候一定要注意到乘和点乘,一般都是点乘的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值