用复杂表达式进行Matlab求解

用复杂表达式进行Matlab求解,matlab,frequency,toolkit,Matlab,Frequency,Toolkit,我有以下Matlab表达式(传递函数): 其中w是符号变量(ω) 我试图为w解以下表达式: |H(w)| == 1/sqrt(2) 手工解决这个问题我相信答案应该是0.105,但我无法得到这个答案。我已经尝试为w是真实的且w>0添加假设 我尝试了以下命令: solve(abs(H)==1/sqrt(2),w) 及 没有运气。如蒙协助,将不胜感激 谢谢 我第一次尝试解决这个问题时给出的值与您提供的值不同。使用MATLAB的符号解算器,我可以为您的问题找到一个假想的解决方案 H = 0.1/(1

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

其中w是符号变量(ω)

我试图为w解以下表达式:

|H(w)| == 1/sqrt(2)
手工解决这个问题我相信答案应该是0.105,但我无法得到这个答案。我已经尝试为w是真实的且w>0添加假设

我尝试了以下命令:

solve(abs(H)==1/sqrt(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
为实数很重要,在复域中,方程有无穷多个解。对于real
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
为正(例如,
假设也为(w>=0)
),则会发生奇怪的事情,我们得到一个带有两个参数的结果,一个整数
k
(给出2πk倍数)和一个标量
z
,其中包含一些条件(z上至少有一个条件给出了0.1055的正确值,但我真的很想知道2πk的倍数)。我不确定为什么会发生这种情况。也许其他人可以澄清


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

你确定j是正确定义的吗?Treffen我要做的第一件事是尝试使用subs函数,看看在答案处计算H是否符合你的要求墨水会给你。如果是的话,那么你知道问题出在解算师身上,我相信0.105是一个有效的解决方案。我想我的问题是我的假设(w,'real')假设被我的假设(w>0)假设覆盖了。谢谢!我可以告诉你,我做错了一件事,就是我有两个假设,而第二个假设也是()因此,我实际上取消了第一个碰巧是假设(w,'real')。从中得到了很好的教训。事后看来,
2*pi*k
倍数似乎是合理的。
w
只出现在
exp(-j*w)
项中。
exp(-j*(w+2*pi))=exp(-j*w)*exp(-j*w)*(-j*pi)=exp(-j*w)*1.0
@Jonathan:当然,你是对的。谢谢你指出这一点。我已经编辑了我的回复。谢谢!有什么方法可以同时得到两个解,还是我只需要在不同的假设下运行解算器?你指的是哪一个解算器?
solve
(符号)还是
fsolve
(数字)?我指的是solve()。我尝试添加“ReturnConditions”,即真正的参数,但没有这样的洞察力。
fsolve(@(w) abs(0.1/(1 - 0.9*exp(-j*w)))-1/sqrt(2), 0.1)
% ans = 0.1055
>> 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