我将信号的相位从 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/