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
Код содержит несколько потенциальных ошибок и проблем:
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. Конкретное сообщение об ошибке (если есть)
Без этих данных приведены наиболее вероятные проблемные места.