你的例子
eq1=0.2*cos(2pi*t*3+phase1)+vertical offset1
eq2=0.7*cos(2pi*t*9+phase2)+vertical offset2
eq3=0.8*cos(2pi*t*5+phase3)+vertical offset3
eq_total=eq1+eq2+eq3
其中最大幅度应小于 0.8,则有无穷多个解。除非您有其他想要实现的目标,否则我建议您修改问题,以便找到最大振幅正好为0.8(或 0.79)的相角组合,这样您就可以保证低于)。
此外,三个相角中只有两个是独立的;如果你全部增加,比如说,,pi/3
解决方案仍然成立。因此,您在 中只有两个未知数eq_total
。
您可以使用例如FMINSEARCH解决非线性优化问题。你制定的问题max(abs(eq_total(phase1,phase2)))
应该等于 0.79。
因此:
%# define the vector t, verticalOffset here
%# objectiveFunction is (eq_total-0.79)^2, so the phase shifts 1 and 2 that
%# satisfy this (approximately) should guarantee that signal never exceeds 0.8
objectiveFunction = @(phase)(max(abs(0.2*cos(2*pi*t+phase(1))+0.7*cos(2*pi*t*9+phase(2))+0.8*cos(2*pi*t*5)+verticalOffset)) - 0.79)^2;
%# search for optimal phase shift, starting at no shift
solution = fminsearch(objectiveFunction,[0;0]);
编辑
不幸的是,当我尝试此代码并绘制结果时,最大幅度不是 0.79,它超过了 1。我做错了什么吗?见下面的代码 t=linspace(0,1,8000); 垂直偏移=0;目标函数 = @(相位)(最大值(abs(0.2*cos(2*pi*t+phase(1))+0.7*cos(2*pi*t*9+phase(2)))+0.8*cos(2 *pi*t*5)+verticalOffset)) - 0.79)^2; s1 = fminsearch(objectiveFunction,[0;0]) eqt=0.2*cos(2*pi*t+s1(1))+0.7*cos(2*pi*t*9+s1(2))+0.8* cos(2*pi*t*5)+verticalOffset; 情节(当量)
fminsearch
将找到目标函数的最小值。该解决方案是否满足您的所有条件是您必须测试的。在这种情况下,fminsearch
用起始值[0;0]
给出的解给出的最大值约为 1.3,这显然不够好。但是,当您绘制从 0 到 2pi 的相角范围的最大值时,您会看到 `fminsearch 并没有陷入糟糕的局部最小值。相反,根本没有好的解决方案(z轴是最大值)。