我制作以下代码来绘制根函数:
import pylab
from pylab import *
from matplotlib import pyplot as plt
import numpy as np
def roots(minimo=-5, maximo=5, step=1, potencia=3):
rootsLs=[]
fig = plt.figure()
ax = fig.add_subplot(111)
valor =1.0/potencia
for i in np.arange(minimo,maximo,step):
rootsLs.append((i)**valor)
pylab.plot(rootsLs)
left,right = ax.get_xlim()
low,high = ax.get_ylim()
grid()
#pylab.show()
return rootsLs
但是,当我尝试计算负数的立方根时,空闲警告
Warning (from warnings module):
File "/media/bidone/calculus/grahphRoots.py", line 18
rootsLs.append((i)**valor)
RuntimeWarning: invalid value encountered in power
对于具有默认值(立方根,范围从-5到5)的调用,返回的列表为[nan, nan, nan, nan, nan, 0.0, 1.0, 1.2599210498948732, 1.4422495703074083, 1.5874010519681994]
。
但是,当我在空闲shell中评估 vg 。,-4**(1.0/3)
时,它不会抱怨并返回正确答案,-1.5874010519681994
。
怎么了?
答案 0 :(得分:2)
-4**(1.0/3)
评估为
-( 4**(1.0/3) )
所以权力分配。 root是正数。允许复数计算
>>> import cmath
>>> (-4+0j)**(1.0/3)
(0.7937005259840999+1.3747296369986024j)
请注意,一般规则是返回具有最小(正)角度的根,符合计算方法
pow(x,y) = exp(y*Ln(x))
复数的位置
Ln(z) = ln(abs(z)) + i*arg(z)
arg(a+i*b) = atan2(b,a)
答案 1 :(得分:0)
根据詹姆斯·托宾提供的信息,我已经重新编写了我的代码,以便它能够正确处理我迄今为止所提供的所有输入。 新代码如下:
import pylab
from pylab import *
from matplotlib import pyplot as plt
import numpy as np
def roots(minimo=-5, maximo=5, step=1, potencia=3):
rootsLs=[]
color=['m','g','r','b']
fig = plt.figure()
ax = fig.add_subplot(111)
valor =1.0/potencia
ranging = np.arange(minimo,maximo,step)
for i in ranging:
if i < 0:
i = i * (-1)
point = -1*(i**valor)
else:
point = i**valor
rootsLs.append(point)
pylab.plot(ranging, rootsLs)
grid()
pylab.show()
插入if
语句以获取负输入的绝对值,然后在取幂解决问题后将其转换回负值。