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.
时仍然很奇怪
我有以下 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.