Я пытаюсь решить систему линейных уравнений. Потому что их много, я использую метод 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)
Я читал о глобалах, но с некоторыми беспорядками, не понял, как использовать их в этом сценарии. Спасибо за помощь заранее, надеюсь, вы можете помочь мне передать мою диссертацию вовремя!
Чтобы использовать глобальные переменные, вам нужно объявить их внутри функции.
Например:
variable = 0
def function():
global variable
variable += 1
function()
Этот код увеличивает глобальную переменную. Однако эта функция не выполняет:
variable = 0
def function(input):
global variable
input += 1
function(variable)
Локальная переменная является копией глобальной
Это немного отличается, поскольку теперь я использую метод 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
f
или внутриinrec
,onrec
иrec
?