需要在Python中创建函数,找到z ^ n = x的所有复杂和真实的根(所以x的第n个根)

时间:2015-11-17 21:11:05

标签: python

初学者程序员在这里。我被指派创建一个功能' Roots'取两个参数x和n(n必须是整数),然后计算方程z ^ n = x的所有复数和实根。但是,我可以使用的唯一模块/包是数学。另外,我被告知以下功能的某些方面' Power_complex'在创造“根源”中发挥重要作用:

def Power_complex(re, im, n):     #calculates the n-th power of a complex number(lets call this a), where 're' is the real part and 'im' the imaginary part
import math
r=math.sqrt((re)**2+(im)**2)      #calculates modulus
h=math.atan2(re,im)               #calculates argument(angle)
ren=(r**n)*math.cos(h*n)          #calculates the real part of a^n
imn=(r**n)*math.sin(h*n)          #calculates the imaginary part of a^n
return ren, imn
print '(',re, '+', im, 'i',')','^',n,'=',ren,'+',imn,'i' #displays the result

另外,我需要以某种方式将for循环实现到' Roots'。 我一直在思考这个问题好几个小时,但唉,我真的无法解决这个问题,我希望你们中的一个可以帮助我。

BTW我的python版本是2.7.10

1 个答案:

答案 0 :(得分:1)

解决方案的表达式是(explained here):

z = r^(1/n) e^(i * (theta + 2*pi*k) / n )  for k = {0, 1, ... , n-1}

何时

z^n = r e^( i*theta )

如果z ^ n是实数,等于你问题中的x,那么r = | x |并且角度分别为0或pi,表示正负值。

所以你按照你的方式制作模数和参数,然后使每个解决方案对应于k

的值
z = [r**(1./n) * exp(1j * (theta + 2*pi*k) / n ) for k in range(n)]

这一行使用名为list comprehension的Python技术。这样做的一种有效方式(你可能更熟悉)可能是:

z = []
for k in range(n):
    nthroot = r**(1./n) * exp( 1j * (theta + 2*pi*k) / n )
    z.append(nthroot)

打印出来可以使用for循环以相同的方式完成:

for i in range(len(z)):
    print "Root #%d = %g + i*%g" % (i, z[i].real, z[i].imag)

请注意,所使用的exp - 函数必须来自模块cmathmath无法处理复数)。如果您不被允许使用cmath,那么我建议您在没有模数和参数的情况下重写表单解决方案的表达式。