Matlab用复杂的表达式解决

时间:2017-02-03 03:38:34

标签: matlab frequency toolkit

我有以下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)  
没有运气。非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,w为真实的假设很重要,在复杂域中,等式具有无限多个解。对于实际w,有两个,因为H(-w) = conj(H(w))因此abs(H(-w))=H(w)(实际上超过两个,因为H(w)是2pi周期,请参阅回复末尾的编辑) 。

这是有趣的地方。如果你只说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倍数)。我不确定为什么会这样。也许其他人可以澄清。

编辑:正如Jonathan所指出的,自exp(-j*(w+2*pi)) = exp(-j*w)以来实际预期的2 pi k倍数,因此H(w)是2pi周期性的。当我们假设w实数和多个解时我们另外假设w非负数时,Matlab返回一个解决方案仍然很奇怪。

答案 1 :(得分:0)

我对此问题的第一次尝试似乎给了我一个与你提供的值不同的值。使用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),因此它是一个有效的解决方案。

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

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

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

您的等式似乎有多种解决方案。这两个值似乎都满足等式。