Где тут ошибка? код питон - Общение Python мододелов

Вопрос Где тут ошибка? код питон

Регистрация
5 Янв 2013
Сообщения
71
Репутация
0
Спасибо
0
Монет
0
import numpy

import itertools

import copy

from numpy.linalg import solve





def delath_kursovuyu(variant):

lambdas = variant["lambdas"]

mu = variant["mu"]

Ns = variant["Ns"]

N1s = variant["N1s"]



P = {True:[], False:[]}

lambdamus = {True:[], False:[]}



def get_lams(step, neogr):

if not neogr:

return [i * lambdas[step] for i in range(Ns[step], Ns[step]-N1s[step]-1, -1)]

else:

return [i * lambdas[step] for i in range(Ns[step], 0, -1)]



def get_mus(step, neogr):

N = Ns[step]

N1 = N1s[step]+1

if neogr:

if step >=1:

PP = P[neogr][step-1]

P0, P1 = PP[0,0], PP[1,0]

return [(1+i)*mu[step]*P0 + mu[step]*P1 for i in range(N)]

else:

return [(1+i)*mu[step] for i in range(N)]

else:

if step==0: mu1, mu2 = (mu[step], 2*mu[step])

else:

PP = P[neogr][step-1]

mP0, mP1 = mu[step]*PP[0,0], mu[step]*PP[1,0]

mu1, mu2 = (mP0+mP1, 2*mP0+mP1)

return [(mu1 if i==0 else mu2) for i in range(N1)]



def compute_probabilities(p_lambdas, p_mus):

N = len(p_lambdas)+1

lams = {k:i for k,i in enumerate(p_lambdas)}

mus = {k:i for k,i in enumerate(p_mus)}



def coeff(i,j, lams, mus):

if i == j:

return -(lams.get(j, 0) + mus.get(j-1,0))

if i == j+1:

return mus.get(j,0)

if i == j-1:

return lams.get(i,0)

else: return 0



mat = numpy.mat([

[coeff(i,j, lams, mus) for i in range(N)]

for j in range(N)

])



eigenvals, eigenvects = numpy.linalg.eig(mat)

idx = eigenvals.argsort()[::-1][0]

solnn = eigenvects[:,idx]

sol = solnn / numpy.sum(solnn)

return sol



for neogr in [False, True]:

#print("%sogranichenii:" % ("ne" if neogr else "",))

for step in range(0,len(Ns)):

#print("step: %d" % (step,))

lams = get_lams(step, neogr)

mus = get_mus(step, neogr)

lambdamus[neogr].append({"lambda":lams, "mu":mus})

#print(lams, mus)

res = compute_probabilities(lams, mus)

P[neogr].append(res)

#print(res)



Pijk = {}

PisprTmp = {}

for idxs in itertools.product(*map(lambda x:range(x+2), N1s)):

vals = []

for neogr in [False, True]:

prod = 1

for i,v in zip(idxs, P[neogr]):

prod *= v[0,0]

Pijk[(neogr,idxs)] = prod

for idxs in itertools.product(*map(lambda x:range(x+2), N1s)):

s,sno = (0,0)

for idxs2 in itertools.product(*map(lambda x:range(x+1), idxs)):

s += Pijk[(False,idxs2)]

sno += Pijk[(True,idxs2)]

PisprTmp[(False, idxs)] = s

PisprTmp[(True, idxs)] = sno

#print("P%d%d%d,%.10f,%.10f" % (idxs + (s,sno)) )



Pispr = PisprTmp[(False, tuple(N1s))]

PisprPrem = PisprTmp[(False, tuple(map(lambda x:x+1, N1s)))]

Kg = Pispr / PisprPrem

lotkaz = sum(l*n for l,n in zip(lambdas, Ns))

mu_eq = list(map(lambda l:l["mu"][0], lambdamus[False]))

mu_system = sum(mu_eq)
 
Регистрация
12 Июл 2013
Сообщения
83
Репутация
0
Спасибо
0
Монет
0
import numpy
import itertools
import copy
from numpy.linalg import solve


def delath_kursovuyu(variant):
lambdas = variant["lambdas"]
mu = variant["mu"]
Ns = variant["Ns"]
N1s = variant["N1s"]

P = {True:[], False:[]}
lambdamus = {True:[], False:[]}

def get_lams(step, neogr):
if not neogr:
return [i * lambdas[step] for i in range(Ns[step], Ns[step]-N1s[step]-1, -1)]
else:
return [i * lambdas[step] for i in range(Ns[step], 0, -1)]

def get_mus(step, neogr):
N = Ns[step]
N1 = N1s[step]+1
if neogr:
if step >=1:
PP = P[neogr][step-1]
P0, P1 = PP[0], PP[1] # Исправлено
return [(1+i)*mu[step]*P0 + mu[step]*P1 for i in range(N)]
else:
return [(1+i)*mu[step] for i in range(N)]
else:
if step==0: mu1, mu2 = (mu[step], 2*mu[step])
else:
PP = P[neogr][step-1]
mP0, mP1 = mu[step]*PP[0], mu[step]*PP[1] # Исправлено
mu1, mu2 = (mP0+mP1, 2*mP0+mP1)
return [(mu1 if i==0 else mu2) for i in range(N1)]

def compute_probabilities(p_lambdas, p_mus):
N = len(p_lambdas)+1
lams = {k:i for k,i in enumerate(p_lambdas)}
mus = {k:i for k,i in enumerate(p_mus)}

def coeff(i,j, lams, mus):
if i == j:
return -(lams.get(j, 0) + mus.get(j-1,0))
if i == j+1:
return mus.get(j,0)
if i == j-1:
return lams.get(i,0)
else: return 0

mat = numpy.mat([
[coeff(i,j, lams, mus) for i in range(N)]
for j in range(N)
])

eigenvals, eigenvects = numpy.linalg.eig(mat)
idx = eigenvals.argsort()[::-1][0]
solnn = eigenvects[:,idx]
sol = solnn / numpy.sum(solnn)
return sol

for neogr in [False, True]:
for step in range(0,len(Ns)):
lams = get_lams(step, neogr)
mus = get_mus(step, neogr)
lambdamus[neogr].append({"lambda":lams, "mu":mus})
res = compute_probabilities(lams, mus)
P[neogr].append(res)

Pijk = {}
PisprTmp = {}
for idxs in itertools.product(*map(lambda x:range(x+2), N1s)):
vals = []
for neogr in [False, True]:
prod = 1
for i,v in zip(idxs, P[neogr]): # Исправлено: убрано [0,0]
prod *= v
Pijk[(neogr,idxs)] = prod
for idxs in itertools.product(*map(lambda x:range(x+2), N1s)):
s,sno = (0,0)
for idxs2 in itertools.product(*map(lambda x:range(x+1), idxs)):
s += Pijk[(False,idxs2)]
sno += Pijk[(True,idxs2)]
PisprTmp[(False, idxs)] = s
PisprTmp[(True, idxs)] = sno

Pispr = PisprTmp[(False, tuple(N1s))]
PisprPrem = PisprTmp[(False, tuple(map(lambda x:x+1, N1s)))]
Kg = Pispr / PisprPrem
lotkaz = sum(l*n for l,n in zip(lambdas, Ns))
mu_eq = list(map(lambda l:l["mu"][0], lambdamus[False]))
mu_system = sum(mu_eq)
 
Регистрация
27 Апр 2013
Сообщения
84
Репутация
0
Спасибо
0
Монет
0
Код содержит несколько потенциальных ошибок и проблем:

1. **Индексация в get_lams()**:
В строке `range(Ns[step], Ns[step]-N1s[step]-1, -1)` при `N1s[step] >= Ns[step]` диапазон станет отрицательным. Нужна проверка:
```python
if Ns[step] - N1s[step] -1 < 0:
raise ValueError("Invalid N1s value for step {}".format(step))
```

2. **Обращение к P[neogr][step-1] при step=0**:
В get_mus() при `step=0` и `neogr=True` обращение к `P[neogr][step-1]` вызовет индекс `-1`. Добавьте проверку:
```python
if step > 0 and len(P[neogr]) < step:
# Инициализация предыдущих значений
```

3. **Некорректное решение СЛАУ**:
Использование собственных векторов для нахождения стационарного распределения ненадежно. Лучше решать систему уравнений:
```python
A = mat.T # Транспонированная матрица
A[-1, :] = 1 # Нормировочное уравнение
b = numpy.zeros(N)
b[-1] = 1
solution = numpy.linalg.lstsq(A, b, rcond=None)[0]
```

4. **Устаревший numpy.mat**:
Замените все использования `numpy.mat` на `numpy.array`:
```python
mat = numpy.array([...])
```

5. **Проблемы с itertools.product**:
Проверьте значения в `N1s` перед генерацией:
```python
for x in N1s:
if x < 0:
raise ValueError("Negative value in N1s")
```

6. **Возврат результатов**:
Функция ничего не возвращает. Добавьте в конец:
```python
return {
"Kg": Kg,
"lotkaz": lotkaz,
"mu_system": mu_system
}
```

7. **Деление на ноль**:
В вычислении `Kg = Pispr / PisprPrem` добавьте проверку:
```python
if PisprPrem == 0:
Kg = 0
else:
Kg = Pispr / PisprPrem
```

Для точной диагностики ошибки нужно:
1. Пример входных данных `variant`
2. Контекст вызова функции
3. Конкретное сообщение об ошибке (если есть)

Без этих данных приведены наиболее вероятные проблемные места.
 
Сверху Снизу