加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何以较少的迭代次数查找最大值

发布时间:2020-12-16 05:02:11 所属栏目:百科 来源:网络整理
导读:我将信号的相位从0度改变到360度,以获得最大电压值.因为如果我改变信号的相位,电压也会改变.我有找到最大值的代码. void Maxphase(float *max,unsigned int *index) {*max = 0.0;float value;unsigned int i,data;for (i=0;i=360;i++) { phaseset(i); delay_
我将信号的相位从0度改变到360度,以获得最大电压值.因为如果我改变信号的相位,电压也会改变.我有找到最大值的代码.
void Maxphase(float *max,unsigned int *index) 
{
*max = 0.0;
float value;
unsigned int i,data;
for (i=0;i<=360;i++) 
{              
    phaseset(i); 
    delay_ms(100);
    data = readvalue(); 
    value = voltage(mux1);    
    if(value > *max)   //find max value 
    { 
        *max = value;    //max voltage 
        *index = i;   
    }  
}                           
}

从上面的代码我得到38秒(360 * 100)后的最大值(电压),因为对于每次读取操作,我的设备需要100ms延迟.这太大了,我无法改变硬件因此我希望通过优化软件在2到3秒内获得最大值.
然后我尝试了以下代码.

void Maxphase(float *max1,unsigned int *index1) 
{
  max = 0.0;
  float value;
  unsigned int i,j,data;
  for (i=0;i<=360;i+=10) 
   {              
    phaseset(i); 
    delay_ms(100);
    data = readvalue(); 
    value = voltage(mux1);    
    if(value > max)   //find max value 
    { 
        max = value;    //max voltage 
        index = i;   
    }  
   }    
   *max1=max;
   *index1=index;
   for (i=*index1-9;i<=*index1+9;i+=1) 
     {       
     j=i;       
    phaseset(j); 
    delay_ms(100);
    data = readvalue(); 
    value = voltage(mux1);    
    if(value > *max1)   //find max value 
    { 
        *max1 = value;    //max voltage 
        *index1 = i;   
    }  
    }                         
}

我把时间从45秒减少到7秒.我将迭代次数减少到了360到54(54 * 100).我希望将其缩短7秒到2秒.

任何人都可以用更好的算法帮助我,我可以在2秒内从(0到360)获得最大值.

我通过改变相位使用范围测量了电压值.我在下面写了它如何随相位变化电压.

Phase (degree)     voltage(max)
  0             0.9mv

 45             9.5mv

 90             9.0mv

135             0.9mv

180             292mv

225             601mv

270             555mv

315             230mv

360             0.9mv

我是C编程的新手.任何人都可以提供最佳算法的示例代码.

解决方法

Golden section search可能就是你追求的目标.它很有效,但仍然非常简单.

如果你想要更快更复杂的东西,你可以使用Brent’s method.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读