Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的数学域错误_Python - Fatal编程技术网

Python中的数学域错误

Python中的数学域错误,python,Python,该程序适用于变量“n”的值设置为4,如下代码所示: from __future__ import division from numpy import zeros import numpy as np import matplotlib.pyplot as plt from numpy.linalg import linalg import math def getA(kappa): matrix = zeros((n, n), float) for i in range(

该程序适用于变量“n”的值设置为4,如下代码所示:

from __future__ import division
from numpy import zeros
import numpy as np
import matplotlib.pyplot as plt

from numpy.linalg import linalg
import math


def getA(kappa):
    matrix = zeros((n, n), float)
    for i in range(n):
        for j in range(n):
            matrix[i][j] = 2*math.cos((2*math.pi/n)*(abs(j-i))*kappa)
    return matrix


def getF(csi, a):
    csiInv = linalg.inv(csi)
    valueF = np.dot(csiInv, a)
    valueF = np.dot(valueF, csiInv)
    valueF = np.dot(valueF, a)
    traceF = valueF.trace()
    return 0.5 * traceF


def getG(csi, f, a):
    csiInv = linalg.inv(csi)
    valueG = np.dot(csiInv, a)
    valueG = np.dot(valueG, csiInv)
    valueG = valueG / (2 * f)
    return valueG


def getE(g, k):
    #m = 10 ^ -6
    #kinv = linalg.inv(k + np.eye(k.shape[1])*m)
    kinv = linalg.inv(k)
    #kinv = linalg.pinv(k)
    ktrans = k.transpose()
    #ktransinv = linalg.pinv(ktrans)
    #ktransinv = linalg.inv(ktrans + np.eye(ktrans.shape[1])*m)
    ktransinv = linalg.inv(ktrans)
    e = np.dot(ktransinv,g)
    e = np.dot(e, kinv)
    return e

def getW(k, a, e):
    ktrans = k.transpose()
    w = np.dot(k, a)
    w = np.dot(w, ktrans)
    w = np.dot(w, e)
    valuew = w.trace()
    return valuew

def getV(csi, e, e2, k):
    v = np.dot(csi, k)
    v = np.dot(v, e)
    v = np.dot(v, k)
    v = np.dot(v, csi)
    v = np.dot(v,  k)
    v = np.dot(v, e2)
    v = np.dot(v, k)
    traceV = v.trace()
    return traceV


handle_2 = open("test.txt", "w")

n = 4


power_spectrum_k = np.zeros(n, float)
for i in range(n):
    power = math.exp(-(2*math.pi*i/n)*(2*math.pi*i/n))
    power_spectrum_k[i] = power

# ora posso chiamare l'anti-trasformata
inverse_transform = np.fft.ifft(power_spectrum_k)
print 'inverse_transform:', inverse_transform
CSI = zeros((n, n))
for i in range(n):
    for j in range(n):
        CSI[i][j] = inverse_transform[abs(i-j)]


betaArray = zeros(n, float)
WabArray = zeros((6, n), float)
correlation = zeros((6, 6), float)

list = [1, 2, 3, 4, 5, 6]

K = zeros((n, n), float)
for i in range(n):
    for j in range(i+1):
        i_shifted = i + 2
        j_shifted = j + 1
        print "###############################"
        print i_shifted
        print j

        component1 = ((3.0*70.0*70.0*0.3)/(2.0*300000.0*300000.0))
        component2 = ((j_shifted*(i_shifted-j_shifted))/(i_shifted))
        component3 = (1.0+(70.0/300000.0)*j_shifted)

        print component1
        print component2
        print component3

        K[i][j] = component1*component2*component3

#print 'DetK:', np.linalg.det(K)
print 'K:\n', K

counter = 0

for alpha in list:
    counter2 = 0
    Aa = getA(alpha)
    Faa = getF(CSI, Aa)
    Ga = getG(CSI, Faa, Aa)
    Ea = getE(Ga, K)
    #print 'Ea:', Ea
    V_alphaalpha = getV(CSI, Ea, Ea, K)
    for beta in xrange(n):
            Ab = getA(beta + 1)
            #print "Calling getW with K=", K, "\n Ab=", Ab, "\nEa=", Ea
            W_ab = getW(K, Ab, Ea)
            #print "\nGot W_ab=", W_ab
            betaArray[beta] = beta + 1
            WabArray[counter][beta] = W_ab
            output_string = " {0} {1} \n".format(str(beta + 1), str(W_ab))
            handle_2.write(output_string)
            Fbb = getF(CSI, Ab)
            Gb = getG(CSI, Fbb, Ab)
            Eb = getE(Gb, K)
    #print "Beta array"
    #print betaArray
    #print "Wab array"
    #print WabArray
    for gamma in list:
        Ac = getA(gamma)
        Fcc = getF(CSI, Ac)
        Gc = getG(CSI, Fcc, Ac)
        Ec = getE(Gc, K)
        V_alphagamma = getV(CSI, Ea, Ec, K)
        V_gammagamma = getV(CSI, Ec, Ec, K)
        C_alphagamma = V_alphagamma/(math.sqrt(V_alphaalpha * V_gammagamma))
        correlation[counter][counter2] = C_alphagamma
        counter2 = counter2 + 1
    counter = counter + 1


print 'correlation:\n', correlation
WabArray_all = []
betaArray_all = []
for b in range(0, len(WabArray), 1):
  for n in betaArray:
    betaArray_all.append(n)
  for n in WabArray[b]:
    WabArray_all.append(n)
现在,当我得到n=5和任何其他大于4的值时,我收到错误:

line 148, in <module>
    C_alphagamma = V_alphagamma/(math.sqrt(V_alphaalpha * V_gammagamma))
ValueError: math domain error
第148行,在
C_alphagamma=V_alphagamma/(数学sqrt(V_alphaalpha*V_gammagamma))
ValueError:数学域错误

我把它解释为一个数学错误,因为我计算了一个负值的平方根。然而,我无法理解错误的确切位置,也就是说,我无法理解为什么从4变为,比如说,5会产生不同。有人知道出了什么问题吗?

数学。sqrt无法计算负平方根

>>> math.sqrt(-1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error

如果不了解算法,很难说问题出在哪里。你必须做更多的调查。IMHO,您应该尝试转储这些值以更好地理解问题,但只有在出现问题时,才能避免输出过多。比如:

try:
    C_alphagamma = V_alphagamma/(math.sqrt(V_alphaalpha * V_gammagamma))
except ValueError as e:
    print alpha, Aa, Faa, Ga, Ea, V_alphaalpha
    print gamma, Ac, Fcc, Gc, Ec, V_alphagamma, V_gammagamma
    raise e

这只是一个想法,其他值可能更为相关

您可能希望从解释脚本试图实现的目标开始。请尝试减少问题的规模。扪心自问:V_alphaalpha和V_gammagamma中哪一个符号错误?为什么?然后往回走直到你找到答案。很抱歉,但根据我的经验,很少有人会阅读您的所有代码以提供具体答案。您是否检查过可能的数学问题,例如负平方根或0除??
try:
    C_alphagamma = V_alphagamma/(math.sqrt(V_alphaalpha * V_gammagamma))
except ValueError as e:
    print alpha, Aa, Faa, Ga, Ea, V_alphaalpha
    print gamma, Ac, Fcc, Gc, Ec, V_alphagamma, V_gammagamma
    raise e