我想我发现了一个Matlab bug(我目前使用的是R2023a)。我的问题是,我该如何规避它。
考虑以下代码
syms z
r1 = vpa( root( z^5 + z^4 + z^3 + z^2 + z^1 + 1 == 0, z, 1 ) ) % 0.5 + 0.866025403784438646763723170753i
r2 = conj( vpa( root( z^5 + z^4 + z^3 + z^2 + z^1 + 1 == 0, z, 1 ) ) ) % 0.5 - 0.866025403784438646763723170753i
s1 = vpa( root( z^5 + z^4 + z^3 + z^2 + z^1 + 1 == 0, z, 1 ) ) % 0.5 + 0.866025403784438646763723170753i
s2 = vpa( conj( root( z^5 + z^4 + z^3 + z^2 + z^1 + 1 == 0, z, 1 ) ) ) % 0.5 + 0.866025403784438646763723170753i
其中
r1
和 r2
彼此正确共轭,但 s1
和 s2
相同。因此,matlab似乎忽略了对“conj
对象”的root
调用(我不知道这里正确的术语。
root
-对象”?由于没有已发布的根为 root(表达式,1) 的首选“顺序”,因此符号工具箱可以自由地为您提供它想要的任何顺序。由于符号工具箱知道当系数为实数时,根以复共轭对的形式出现,因此在 conj(roots(表达式,1)) 的情况下,显然工具箱只是隐式地切换了背景顺序以简化表达式。该表达式显然被解释为“表达式的一个根的共轭”,而不是“给定首选顺序的该表达式的第一个根的共轭”。事实上,根的“顺序”是任意的,并且可以根据调用顺序和工具箱简化在后台进行更改,这是一个错误吗?特别是考虑到文档中没有发布首选“顺序”?我把这个留给你。如果您一次请求所有这些,然后转换它们,也许您可以在代码中毫无歧义地使用它们。例如,
>> syms z
>> ex = z^5 + z^4 + z^3 + z^2 + z^1 + 1 == 0;
>> s = root(ex)
s =
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 1)
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 2)
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 3)
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 4)
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 5)
>> vpa(s)
ans =
- 0.5 - 0.86602540378443864676372317075294i
0.5 - 0.86602540378443864676372317075294i
0.5 + 0.86602540378443864676372317075294i
- 0.5 + 0.86602540378443864676372317075294i
-1.0
>> c = conj(root(ex))
c =
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 1)
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 2)
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 3)
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 4)
root(z^5 + z^4 + z^3 + z^2 + z + 1, z, 5)
>> vpa(c)
ans =
- 0.5 - 0.86602540378443864676372317075294i
0.5 - 0.86602540378443864676372317075294i
0.5 + 0.86602540378443864676372317075294i
- 0.5 + 0.86602540378443864676372317075294i
-1.0