Matlab 用复杂的表达式求解

Matlab solve with complex expressions

我有以下 Matlab 表达式(传递函数):

H(w) = 0.1/(1 - 0.9exp(-jw))

其中 w 是符号变量 (omega)。

我正在尝试为 w 求解以下表达式:

|H(w)| == 1/sqrt(2)

手工求解我认为答案应该是0.105,但我得不到这个答案。我已经尝试添加假设 w 是真实的并且 w>0

我试过以下命令:

solve(abs(H)==1/sqrt(2),w)

solve(H^2==1/2,w)  

运气不好。如有任何帮助,我们将不胜感激。

谢谢!

我第一次尝试解决这个问题似乎给我的值与您提供的值不同。借助 MATLAB 的符号求解器,我找到了解决您问题的假想方法。

H = 0.1/(1 - 0.9*exp(-j*w))
solve(abs(H)==1/sqrt(2),w)
% ans = log(2^(1/2)/9 + 10/9)*i
eval(ans)
% ans = 0.2376i

将其代入 abs(H) 的表达式表明它实际上等于 1/sqrt(2),因此它是一个有效的解决方案。

测试您的手算也会在 1/sqrt(2) 附近产生 abs(H) 的值,因此它可能也是一个有效的解决方案。

为了证实这一点,我尝试了 MATLAB 的数值求解器 fsolve

fsolve(@(w) abs(0.1/(1 - 0.9*exp(-j*w)))-1/sqrt(2), 0.1)
% ans = 0.1055

看来你的方程有多个解。这两个值似乎都满足等式。

首先,w为实数的假设很重要,在复数域中,方程有无限多个解。对于真正的 w 有两个,因为 H(-w) = conj(H(w)) 因此 abs(H(-w))=H(w) (实际上不止两个,因为 H(w) 是 2pi-periodic,请参阅回复末尾的编辑) .

这就是有趣的地方。如果你只声明 w 是真实的,它就可以正常工作:

>> syms w real;
>> H = 0.1/(1-0.9*exp(-j*w));
>> solve(abs(H)==1/sqrt(2),w)

  ans =

    -atan(359^(1/2)/179)

>> eval(ans)

  ans = 

    -0.1055

从上面我们知道 +0.1055 也是一个解决方案。

然而,如果我们另外要求 w 为正数(例如,assumeAlso(w>=0)),就会发生一些奇怪的事情,我们会得到一个带有两个参数的结果,一个整数 k(给出2 pi k 的倍数)和一个带有某些条件的标量 z(z 上的至少一个条件确实给出了 0.1055 的正确值,但我真的很想知道 2 pi k 的倍数)。我不确定为什么会这样。也许其他人可以澄清。

edit:正如 Jonathan 所指出的,由于 exp(-j*(w+2*pi)) = exp(-j*w) 并且因此 H(w) 是 2pi 周期性的,所以 2 pi k 的倍数实际上是预期的。当我们假设 w 实数和多解时,Matlab returns 一个解当我们另外假设 w non-negative.

时仍然很奇怪