Python:负面的根源(在电源中遇到无效值)

时间:2016-03-18 13:35:19

标签: python math matplotlib

我制作以下代码来绘制根函数:

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

怎么了?

2 个答案:

答案 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语句以获取负输入的绝对值,然后在取幂解决问题后将其转换回负值。