Это то, что я импортировал:
import random
import matplotlib.pyplot as plt
from math import log, e, ceil, floor
import numpy as np
from numpy import arange,array
import pdb
from random import randint
Здесь я определяю матрицу функций (p, m)
def matrix(p,m): # A matrix with zeros everywhere, except in every entry in the middle of the row
v = [0]*m
v[(m+1)/2 - 1] = 1
vv = array([v,]*p)
return vv
ct = np.zeros(5) # Here, I choose 5 cause I wanted to work with an example, but should be p in general
Здесь я определяю MHops, который в основном берет размеры матрицы, матрицы и вектора ct и дает мне новую матрицу mm и новый вектор ct
def MHops(p,m,mm,ct):
k = 0
while k < p : # This 'spans' the rows
i = 0
while i < m : # This 'spans' the columns
if mm[k][i] == 0 :
i+=1
else:
R = random.random()
t = -log(1-R,e) # Calculate time of the hopping
ct[k] = ct[k] + t
r = random.random()
if 0 <= r < 0.5 : # particle hops right
if 0 <= i < m-1:
mm[k][i] = 0
mm[k][i+1] = 1
break
else:
break # Because it is at the boundary
else: # particle hops left
if 0 < i <=m-1:
mm[k][i] = 0
mm[k][i-1] = 1
break
else: # Because it is at the boundary
break
break
k+=1
return (mm,ct) # Gives me the new matrix showing the new position of the particles and a new vector of times, showing the times taken by each particle to hop
Теперь то, что я хочу сделать, это повторить этот процесс, но я хочу иметь возможность визуализировать каждый шаг в списке. Вкратце, что я делаю: 1. создаю матрицу, представляющую решетку, где 0 означает, что в этом слоте нет частицы, а 1 означает, что там есть частица. 2. Создайте функцию MHops, которая имитирует случайное блуждание в один шаг и дает мне новую матрицу и вектор ct, который показывает время движения частиц.
Теперь я хочу иметь вектор или массив, в котором у меня есть 2 * n объектов, то есть матрица mm и вектор ct для n итераций. Мне нужен массив, список или что-то в этом роде, потому что мне нужно использовать их позже.
Здесь начинается моя проблема:
Я создаю пустой список и использую append для добавления элементов на каждой итерации цикла while. Однако результат, который я получаю, представляет собой список d с n равными объектами, полученными из последней итерации!
Следовательно, моя функция для итерации следующая:
def rep_MHops(n,p,m,mm,ct):
mat = mm
cct = ct
d = []
i = 0
while i < n :
y = MHops(p,m,mat,cct) # Calculate the hop, so y is a tuple y = (mm,ct)
mat = y[0] # I reset mat and cct so that for the next iteration, I go further
cct = y[1]
d.append(mat)
d.append(cct)
i+=1
return d
z = rep_MHops(3,5,5,matrix(5,5),ct) #If you check this, it doesn't work
print z
Однако это не работает, я не понимаю, почему. Что я делаю, так это использую MHops, затем я хочу установить новую матрицу и новый вектор как те, что на выходе MHops, и сделать это снова. Однако, если вы запустите этот код, вы увидите, что v работает, т.е. вектор времени увеличивается и матрица решетки изменяется, однако, когда я добавляю это к d, d в основном представляет собой список из n равных объектов, где объект являются последней итерацией.
В чем моя ошибка? Кроме того, если у вас есть какие-либо советы по кодированию для этого кода, они будут более чем кстати, я не уверен, что это эффективный способ.
Просто чтобы вы лучше поняли, я хотел бы использовать окончательный вектор d в другой функции, где прежде всего я выбираю случайное время T, затем я в основном проверяю каждую нечетную запись (каждый ct) и, следовательно, проверяю каждую запись каждого ct и посмотрим, меньше ли эти числа или равны Т. Если это произошло, то движение частицы произошло, иначе - нет. Затем я попытаюсь визуализировать с помощью matpotlibt результат с помощью гистограммы или чего-то подобного.
Есть ли кто-нибудь, кто знает, как запустить такое моделирование в Matlab? Как вы думаете, было бы легче?
.append(object_to_append)
, как показано ниже. В некоторых случаях полезно заменить элементы в спискеlist[index] = some_value
, однако в вашем случае нет смысла создавать список с n индексами. просто создайте пустой список и используйте метод добавления на каждой итерации, а не заменяйте предварительно созданное значение! - person TheLazyScripter   schedule 10.06.2016d = []
, а послеcct = y[1]
у меня былиd.append(mat)
иd.append(cct)
, но это не сработало!! - person Euler_Salter   schedule 10.06.2016def rep_MHops(n,p,m,mm,ct):
mat = mm
cct = ct
d = []
`i = 0`while i < n :
y = MHops(p,m,mat,cct)
`mat = y[0]`cct = y[1]
d.append(mat)
d.append(cct)
`i+=1` `return d` - person Euler_Salter   schedule 10.06.2016MHops
, который изменяет его и возвращает. По сути, это ссылка. Таким образом, вы получаете 5 копий одной и той же ссылки в своем выходном списке. Вариант stackoverflow .com/questions/1132941/. - person Corley Brigman   schedule 10.06.2016MHops
изменяет вашу ранее сохраненную версию вd
. Вместо этого используйтеimport copy; d.append(copy.deepcopy(mat))
, чтобы сохранить копию, которая не будет изменена позже. - person RedCraig   schedule 10.06.2016