声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3569|回复: 15

[编程技巧] 请问如何在已画出图中寻找最大值或最小值?

[复制链接]
发表于 2007-11-8 21:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
如题
最大值.JPG
回复
分享到:

使用道具 举报

发表于 2007-11-8 21:16 | 显示全部楼层
help find
 楼主| 发表于 2007-11-8 21:33 | 显示全部楼层
find似乎都是矩阵操作阿,在上图中,如何找到c使得va最大,请版主说详细点,先谢谢了
发表于 2007-11-8 22:20 | 显示全部楼层
Handle=findobj(gca,'Type','Line');
yData= get(Handle,'yData');
max(yData)
发表于 2007-11-9 15:16 | 显示全部楼层
搜索论坛,已经有过此类讨论贴.
 楼主| 发表于 2007-11-10 21:24 | 显示全部楼层

回复 #4 TurtleRock 的帖子

非常感谢,可是楼上的意思是只能得到图上本身所有的点(我们就是依据这些点作出图像的)的最大值,我要的是这个曲线的最大值。也就说这个函数的最大值。如果这些点的最大值在Workspce中不就可以找到吗?:'(
发表于 2007-11-10 22:33 | 显示全部楼层
如果你的数据够密集就max(Y),便是;
如果不太够密集就:先找max(Y)的点A,然后向两边再各取一个点,三点用ax^2+bx+c拟和,然后再算出最大点就是
如果还不够密集,那就算了,无意义。
发表于 2007-11-11 14:55 | 显示全部楼层
其实LZ的意思是, 既然已经根据已知点做出了曲线,如何能直接读出该曲线的数据呢
contour是可以返回曲线值的

如果LZ的曲线是plot生成的话,线形插值不会生成极值点,矩阵的最值应该就是函数的极值!

[ 本帖最后由 gerry 于 2007-11-11 16:50 编辑 ]
 楼主| 发表于 2007-11-11 19:42 | 显示全部楼层
实际程序如下:
syms va c
n=400;r=0.006;P=0.010;ha=0.002;
theta=atan(P/(pi*(r+r-ha)));
beita=0.2;
gamma=ha/c;
h1=c+ha;
h2=c;
w=2*pi*n/60;
B1=(1-beita)*P*cos(theta);
B2=beita*P*cos(theta);
u1=w*(r-c*gamma)*cos(theta)-va*sin(theta);
w1=w*(r-c*gamma)*sin(theta)-va*cos(theta);
u2=w*r*cos(theta)-va*sin(theta);
w2=w*r*sin(theta)-va*cos(theta);
SB1=(r-c*gamma)*(1-beita);
SB2=r*beita;
S=((r/2*sqrt(r^2+P^2/(4*pi^2))+(P^2/(4*pi^2)/2)*log(r+sqrt(r^2+P^2/(4*pi^2))))-((r-c*gamma)/2*sqrt((r-c*gamma)^2+P^2/(4*pi^2))+(P^2/(4*pi^2)/2)*log((r-c*gamma)+sqrt((r-c*gamma)^2+P^2/(4*pi^2)))))/P;
dp1=(6*w1*w2/c^2)*(beita*gamma/((1-beita)*w1+(1+gamma)^3*w2));
dp2=-(6*w1*w2/c^2)*((1-beita)*gamma/((1-beita)*w1+(1+gamma)^3*w2));
Fx1=(-u1/h1)*SB1;
Fx2=(-u2/h2)*SB2;
Fz1=(-(h1/2)*dp1-w1/h1)*SB1;
Fz2=(-(h2/2)*dp2-w2/h2)*SB2;
Fzz=-dp1*B1*S;
Fa=(Fx1+Fx2)*sin(theta)-(Fz1+Fz2)*cos(theta)-Fzz*cos(theta);

F=Fa;
v=solve(F,'va');
c=linspace(0.0004,0.0006,21);
va=v(2);
va2=v(1);
va=subs(va);
va2=subs(va2);
h0=h1*h2*(B1*w1*h2.^2+B2*w2*h1.^2)./(B1*w1*h2.^3+B2*w2*h1.^3);
h0=subs(h0);
h1=subs(h1);
h2=subs(h2);
if (h2<h0)&(h0<h1)
   va=va;
else va=va2;
end
plot(c,va)
title('va-c')
xlabel('c')
ylabel('va')
由于va是隐函数,所以很求得va的最大值。
其实我要求的是va关于c的函数的最大值。不知道各位有什么好办法
发表于 2007-11-11 19:55 | 显示全部楼层
曲线是根据数据点画出来了,数据点的最大值就可以认为是曲线的最值了。

如果有解析方法求最值当然最好,如果没有解析方法,用数据的最值代替最大值

误差也是可以接受的。应该不会再有什么更精确的方法了
发表于 2007-11-11 19:59 | 显示全部楼层

回复 #9 jsp613 的帖子

max(va);足够了吧。

[ 本帖最后由 donkeyxu 于 2007-11-11 20:32 编辑 ]
1.jpg
发表于 2007-11-11 21:23 | 显示全部楼层
发表于 2007-11-11 21:44 | 显示全部楼层

回复 #12 花如月 的帖子

是啊,我知道你的意思,楼主不知道需要多精确,我看图上很精确了。
 楼主| 发表于 2007-11-12 10:01 | 显示全部楼层

回复 #11 donkeyxu 的帖子

第一个图c的范围是0.0001—0.004,从一个图可看出va的最大值大概在c为0.0004—0.0006之间,因而第二个图c的范围给为0.0004—0.0006。
要想得到解析解,请问各位上述程序如何修改?
发表于 2007-11-12 17:28 | 显示全部楼层

回复 #14 jsp613 的帖子

解析解就是拟合出来的,如果只要最大值完全没有必要得到解析式,而且解析给出来的还没有直接对数据操作得来的最大值好。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 22:33 , Processed in 0.061473 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表