2016-04-18 15 views
7

Sto scrivendo il mio algoritmo di Newton-Raphson in Python usando sympy e numpy.Errore di risoluzione dell'equazione di Matrix con numpy

Il codice è al di sotto, ma è possibile ignorare questa e saltare sul all'errore:

CODICE

def newtonRhapson(fncList, varz, x0): 

    jacob = [] 

    for fnc in fncList: 
     vec = [] 
     for var in varz: 
      res = fnc.diff(var) 
      for i in range(len(varz)): 
       res = res.subs(varz[i], x0[i]) 
      vec.append(res) 
     jacob.append(numpy.array(vec, dtype='float64')) 

    fx0=[] 

    for fnc in fncList: 
     res2 = fnc 
     for i in range(len(varz)): 
      res2 = res2.subs(varz[i], x0[i]) 
     fx0.append(res2) 

    j = jacob 
    f = fx0 

    print j 
    print '' 
    print f 

    print numpy.linalg.solve(j,f).tolist() 

Gli argomenti della funzione sono:

fncList - un elenco di pitone delle funzioni usando i simboli Sympy

varz - una lista che contiene i simboli (variabili)

x0 - un'ipotesi iniziale

ERRORE

Fino al punto in cui siamo printj e f funziona benissimo e stampa il seguente:

[array([-9.13378682, -5.91269838]), array([ 4.84401379, 1.01980286])] 

[-5.15598620617611, 5.13378681611922] 

quando corro:

newtonRhapson([5*cos(a)+6*cos(a+b)-10, 5*sin(a)+6*sin(a+b)-4], [a,b], [0.7,0.7]) 

Ma a correre la linea:

print numpy.linalg.solve(j,f).tolist() 

ottengo l'errore:

File "/Users/me/anaconda/lib/python2.7/site- packages/numpy/linalg/linalg.py", line 384, in solve 
r = gufunc(a, b, signature=signature, extobj=extobj) 
TypeError: No loop matching the specified signature and casting was found for ufunc solve1 

risposta

5

Il tuo problema è nel vostro secondo for ciclo.

for fnc in fncList: 
    res2 = fnc 
    for i in range(len(varz)): 
     res2 = res2.subs(varz[i], x0[i]) 
    fx0.append(res2) 

Quando si accoda a fx0, è necessario assicurarsi che si sta aggiungendo la stesso tipo (float64) in modo tale che NumPy in grado di calcolare il determinante del sistema con LAPACK (vedere this answer per ulteriori informazioni). Al momento stai aggiungendo <class 'sympy.core.numbers.Float'> - il tuo messaggio errror ti sta dicendo che hai una firma di tipo errata per l'utilizzo.

Per correggere questo problema, si può semplicemente aggiungere numpy.array con una specifica dtype per float64 come avete fatto in precedenza

for fnc in fncList: 
    res2 = fnc 
    for i in range(len(varz)): 
     res2 = res2.subs(varz[i], x0[i]) 
    fx0.append(numpy.array(res2, dtype='float')) 
+0

Certo! Molte grazie! –

+3

Un commento, per googler - Questo è lo stesso errore che si ottiene per molte funzioni di numpy, in cui si ha il tipo di dati errato (per me era un np.linalg.pinv (x), dove x era erroneamente un oggetto dtype) – jeremycg