Python scipy функция не принимает глобальные переменные

1

Я пытаюсь решить систему линейных уравнений. Потому что их много, я использую метод Newton-Krylov, из scipy.minimize. Для незнакомых ему требуется набор уравнений и первоначальное предположение. Однако определение набора уравнений зависит от его собственных параметров, но нет способа ввести их в решатель Newton-Krylov.

Ниже приведен код, который я написал

import networkx as nx
import scipy as sp
import numpy as np
import math
from scipy.optimize import newton_krylov

def gen_r_scores_anderson():
    datasets = [
        'WTW_decades/1960wtw.txt'
            ]
    z_scores = []
    for i in range(1):
        data = np.genfromtxt(datasets[i], dtype=[('a','|S5'),('b','|S5'),('amount','f8')], usemask=True) #import data
        binary_edgelist = create_edgelist_binary(data) #create edgelist
        H = nx.DiGraph() #create graph
        H.add_edges_from(binary_edgelist) #insert edgelist in graph
        B = nx.adjacency_matrix(H) #make H into an adjacency matrix
        n = len(H.nodes()) #define number of nodes n
        H_nodes = np.asarray(H.nodes()) #define the name of the nodes in an array

        rec = recip(B.todense(),n) #counts the amount of reciprocating links between i and j
        onrec = out_non_recip(B.todense(),n) #links going from i to j
        inrec = in_non_recip(B.todense(),n) #amount of links going from j to i

        #now we calculate the x and y values using Newtons method

        u = [0.5]*3*n # initial guess
        s = newton_krylov(f, u) # << this is where the problem lies
    return(t)

t_score = gen_r_scores_anderson()
print(t_score)

где функция f, вход для метода newton_krylov, определяется следующим образом

def f(w, n, onrec, inrec, rec):
    F = [0]*3*n
    for i in range(n): 
        F[i] = -onrec[i]
        F[n+i] = -inrec[i]
        F[(2*n)+i] = -rec[i]
        for j in range(n):
            if i == j:
                None
            else:
                F[i] += (w[i]*w[n+j])/(1+w[i]*w[n+j]+w[j]*w[n+i]+w[2*n+i]*w[2*n+j])
                F[n+i] += (w[j]*w[n+i])/(1+w[i]*w[n+j]+w[j]*w[n+i]+w[2*n+i]*w[2*n+j])
                F[2*n+i] += (w[(2*n)+i]*w[(2*n)+j])/(1+w[i]*w[n+j]+w[j]*w[n+i]+w[2*n+i]*w[2*n+j])
    return(F)

Я читал о глобалах, но с некоторыми беспорядками, не понял, как использовать их в этом сценарии. Спасибо за помощь заранее, надеюсь, вы можете помочь мне передать мою диссертацию вовремя!

Теги:
scipy
global-variables

2 ответа

1
Лучший ответ

Чтобы использовать глобальные переменные, вам нужно объявить их внутри функции.

Например:

variable = 0
def function():
     global variable
     variable += 1
function()

Этот код увеличивает глобальную переменную. Однако эта функция не выполняет:

variable = 0
def function(input):
    global variable
    input += 1
function(variable)

Локальная переменная является копией глобальной

  • 0
    Но определить ли я их внутри функции f или внутри inrec , onrec и rec ?
  • 0
    Я собираюсь взглянуть глубже на ваш код и вернуться к вам
Показать ещё 3 комментария
0

Это немного отличается, поскольку теперь я использую метод anderson, но в основном тот же.

start1 = time.time()

def gen_r_scores_anderson():
    datasets = [
        'WTW_decades/1960wtw.txt'
            ]
    z_scores = []
    for i in range(1):
        data = np.genfromtxt(datasets[i], dtype=[('a','|S5'),('b','|S5'),('amount','f8')], usemask=True) #import data
        binary_edgelist = create_edgelist_binary(data) #create edgelist
        H = nx.DiGraph() #create graph
        H.add_edges_from(binary_edgelist) #insert edgelist in graph
        B = nx.adjacency_matrix(H) #make H into an adjacency matrix
        global n
        n = len(H.nodes()) #define number of nodes n
        H_nodes = np.asarray(H.nodes()) #define the name of the nodes in an array

        global rec
        rec = recip(B.todense(),n) #counts the amount of reciprocating links between i and j

        global onrec
        onrec = out_non_recip(B.todense(),n) #links going from i to j

        global inrec
        inrec = in_non_recip(B.todense(),n) #amount of links going from j to i

        #now we calculate the x and y values using Newtons method

        u = [0.5]*3*n
        s = anderson(f, u)
        t = makematrixpos(s)
    return(t)

t_score = gen_r_scores_anderson()
print(t_score)

end1 = time.time()
print(end1 - start1)

Таким образом, я сделал global в функции gen_all_data вместо того, чтобы помещать global в f, inrec, rec или onrec

Ещё вопросы

Сообщество Overcoder
Наверх
Меню