c - 如何用更少的迭代找到最大值

标签 c interpolation binary-search polar-coordinates

我将信号的相位从 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) 后获得最大值(电压),因为对于每个读取操作,我的设备都需要 100 毫秒的延迟。这太大了,我无法更改硬件,因此我想通过优化软件在 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 .

关于c - 如何用更少的迭代找到最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13271494/

相关文章:

arrays - 采访问题: How to find the most popular number in a sorted array

c - 求最长公共(public)子串问题的最小空间复杂度是多少?

C - 链接字符并将其放入变量中

c - 尝试使用c语言使用swap语句对两个数字进行降序排序

python - 3d 空间中直线曲线的样条插值系数

java - 插入排序与二进制搜索?

perl - 如何在 Perl 中实现二分查找?

c - 简单的碰撞检测?

python - 3D 数组的快速插值

javascript - 在谷歌图中插入空值