声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1615|回复: 6

[综合讨论] 请问 : 如何通过程序在一条曲线中找出最大点

[复制链接]
发表于 2008-12-23 22:39 | 显示全部楼层 |阅读模式

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

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

x
您好,
      我想咨询一个问题,我现在需要对一条时刻变化的曲线进行跟踪,通过编写一个函数找出最大点,也就是最大功率跟踪中要用的,我的问题是 找到最大点以后如何结束程序呢,
      再者,如果条件变化,又如何自己启动程序,找到最大点,多谢,困扰我一周了,我一直没解决。
回复
分享到:

使用道具 举报

发表于 2008-12-23 23:36 | 显示全部楼层
用max不行么?哈哈哈
发表于 2008-12-23 23:58 | 显示全部楼层

回复 沙发 wwbeyondww 的帖子

max只能找到上一时刻的最大值
发表于 2008-12-24 09:32 | 显示全部楼层

回复 楼主 gty3344 的帖子

为何不直接列出楼主大略的程序!? 如此易於知道楼主的实际问题
发表于 2008-12-24 14:31 | 显示全部楼层

回复 楼主 gty3344 的帖子

你的这个问题可以分为两部分,首先是找到最大之后如何停止。找到最大对于已有数据用max就可以,停止程序可以在函数里采用return。
而改变条件之后重新启动程序,我想应该是有循环来随时监听是不是有条件改变,如果条件改变了,就再次调用第一部分的程序就可以了。

评分

1

查看全部评分

 楼主| 发表于 2008-12-24 22:53 | 显示全部楼层
非常感谢大伙的帮助,我之前可能说的不太清楚,因为我对s函数不太很熟,我不知道怎么写,我把我的程序贴出来麻烦大家再帮我看看,看我的问题在哪。

我要寻找的是u(3)的最大值,当u(8)或u(9)发生变化时,我要重新启动程序寻找最大值。
怎样才能算找到最大值呢,有什么标志么,重新启动的话是不是要在后面加一个多路选择是否重新执行这个s函数,还是可以直接在这个函数里面写,谢谢!

function [sys,x0,str,ts] = mppt(t,x,u,flag)
switch flag,
  %%%%%%%%%%%%%%%%%%
  % Initialization %
  %%%%%%%%%%%%%%%%%%
  case 0,
   [sys,x0,str,ts]=mdlInitializeSizes;
  
  %%%%%%%%%%  
  % Update %
  %%%%%%%%%%
  case 2,                                               
    sys = mdlUpdate(t,x,u);
   
  %%%%%%%%%%
  % Output %
  %%%%%%%%%%
  case 3,                                               
    sys = mdlOutputs(t,x,u);   
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);  
  %%%%%%%%%%%%%
  % Terminate %
  %%%%%%%%%%%%%
  case 9,                                               
    sys = [];
  otherwise
    error(['unhandled flag = ',num2str(flag)]);
end
%end sfundsc1
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 3;
sizes.NumOutputs     = 3;
sizes.NumInputs      = 9;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0  = [0;0;0];
str = [];
ts  = [-2 0]; % Inherited sample time
% end mdlInitializeSizes

function sys = mdlUpdate(t,x,u)
   x(1) = max(u(3)) ;如何结束呢?
   我以前是: 判断这个值如果比它前面的大,同时比他后面的大
%if x(3) > (u(3)+10)*(u(7)*(1-u(5)*(exp((u(3)+10-u(1))/(u(4)*u(6)))-1))+u(2)) && x(3) > (u(3)-10)*(u(7)*(1-u(5)*(exp((u(3)-10-u(1))/(u(4)*u(6)))-1))+u(2))
    % x(1) = u(3) ;但是我不知道如何保持输出值一直为最大值?
   x(2)= u(7)*(1-u(5)*(exp((x(1)-u(1))/(u(4)*u(6)))-1))+u(2) ;      %j计算公式
   x(3)= u(3)*(u(7)*(1-u(5)*(exp((u(3)-u(1))/(u(4)*u(6)))-1))+u(2)) ;  %j计算公式
sys=x;
%
%=======================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=======================================================================
%
%end mdlUpdate
%
%=======================================================================
% mdlOutputs
% Return the output vector for the S-function
%=====================================================================

function sys = mdlOutputs(t,x,u)
    sys(1)= x(1);
    sys(2) = x(2) ;
    sys(3) = x(1)*x(2) ;
   
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampletime=0.0001;
sys=t+sampletime;

[ 本帖最后由 gty3344 于 2008-12-24 22:55 编辑 ]
发表于 2008-12-25 14:10 | 显示全部楼层
看看max怎么用 你没有理解他的用法
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-25 05:33 , Processed in 0.061342 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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