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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |