matlab的默认复数开方
matlab的开方:
sqrt()
^(1/n)
都是把数字当复数去开方的
我们知道,数学上复数开方可能有多个值的:
一个一般的复数可以写成
z=r*exp(1i*phi)
现在开方这个数,开方后正实数r唯一确定,变化的是角度phi
得到的数的角度为phi/n+k*2*pi/n k=0,1,2,3,4,…,只要这个角度在如[0,2*pi)中的话就算是对应一个解
它可以有多个,例如:
数学上(exp(1i*pi))^(1/2)有两个解,k=0对应exp(1i*pi/2),k=1对应exp(-1i*pi/2)
数学上(-27)^(1/3)有三个解,r确定为3,k=0对应3*exp(1i*pi/3),k=1对应3*exp(1i*pi)=-3,k=2对应3*exp(1i*5*pi/3)
在MATLAB中,首先除非使用特别函数限制处理实数,matlab会把数默认当复数处理,然后matlab处理会有多个解的复数开方问题时,会默认使用这么多解的其中之一,那怎么整呢?经测试2和3的情况,都是默认使用的是k=0的那个解:
r^(1/n)*exp(1i*phi/n)
z为正实时,默认的结果为r^(1/n),合理
z为负实时,默认的结果为r^(1/n)*exp(1i*pi/n)
这在sqrt时就开始不合理:sqrt(-3)=1i*sqrt(3),这明明还有另一个解-1i*sqrt(3)
在^(1/3)时不合理: r^(1/3)*exp(1i*pi/3)总为实虚都有的复数,例如matlab算(-27)^(1/3)时,-3对应着k=1的解,是默认取k=0的matlab不会得到的,这样你计算(-27)^(1/3)得到1.5000 + 2.5981i就会很困扰
这很容易造成误会,比如你要画y=x.^(1/3)这个函数,在x<0的区域的时候,y会是一些复数
想要避免这样的误会,要理解matlab总是把数当复数处理,^(1/n)会从多个重根之中取其一,
要特别小心对负数开方的计算,如果你需要的是实数领域的计算,不能使用默认的sqrt,^(1/3),使用realsqrt,和nthroot(x,3)才对
如果你需要的是复数的开方,那你便要重新思考你想要得到重根之中的哪个根
其中realsqrt()和nthroot(x,n)
代替sqrt()和x^(1/n)用,matlab会强制保证x是实数,以及返回的值是实数,这样就不会为数被当复数处理而困扰了
Y = nthroot(X,N) returns the real nth root of the elements of X. Both X and N must be real scalars or arrays of the same size. If an element in X is negative, then the corresponding element in N must be an odd integer.
Ref matlab nthroot 参考文献