2013-05-24 3 views
0

Я пытаюсь запустить этот простой диффузионный чехол (я понимаю, что он вообще не идеален), и я делаю все возможное, чтобы получить внутреннюю часть твердого тела, но вам нужна помощь с внешними краями ,Наружные границы диффузии

global M 
size=100 
M=zeros(size,size); 
M(25,25)=50; 
for diffusive_steps=1:500 
oldM=M; 
newM=zeros(size,size); 
for i=2:size-1; 
    for j=2:size-1; 
    %we're considering the ij-th pixel 
    pixel_conc=oldM(i,j); 
    newM(i,j+1)=newM(i,j+1)+pixel_conc/4; 
    newM(i,j-1)=newM(i,j-1)+pixel_conc/4; 
    newM(i+1,j)=newM(i+1,j)+pixel_conc/4; 
    newM(i-1,j)=newM(i-1,j)+pixel_conc/4; 
    end 
end 
M=newM; 

end 

Это довольно простой фрагмент кода, и я это знаю. Я не очень хорошо использую Октаве (химик по профессии), поэтому я был бы признателен за любую помощь!

+0

В чем проблема? Что вы ожидали увидеть и что не работает так, как вы ожидали? В настоящее время этот вопрос довольно сложно ответить, пожалуйста, предоставьте дополнительную информацию. – Junuxx

+0

Пожалуйста, не используйте '' размер'' в качестве имени переменной. Это также функция [Matlab] (http://www.mathworks.com/help/matlab/ref/size.html). – Schorsch

+0

Прошу прощения. Мой советник предложил использовать размер, поскольку это было бы проще, размер может быть чем угодно в этом случае, скажем, 100. В его нынешнем виде модель не достигает внешнего края, как не может.Я ищу способ обойти это так, чтобы внешний край мог быть включен –

ответ

0

Одним из простых изменений, которые вы можете сделать, является добавление границы ячеек-призраков или ореолов вокруг интересующей области. Вместо неправильного использования имени size Я использовал переменную под названием sz. Заменить:

M=zeros(sz,sz) 

с

M=zeros(sz+2,sz+2) 

, а затем вычислить ваши диффузии через внутреннюю часть этой расширенной матрицы, т.е. над клетками (2:sz+1,2:sz+1). Когда дело доходит до рассмотрения результатов, отбросьте или просто игнорируйте ореол.

Даже проще было бы просто взять то, что у вас уже есть, и игнорировать ячейки в вашей существующей матрице, которые находятся на краях N, S, E, W.

Этот метод широко используется в таких проблемах, как, например, и аналогичен вашим, и позволяет избежать необходимости писать код, который имеет дело с вычислениями на ячейках, которые не имеют полного дополнения соседей. Установка подходящего значения для содержимого ячеек гало является проблемным вопросом, 0 не всегда является правильным значением.

0

Если у вас есть проблемы с границей вашей симуляции, вы можете поместить свою матрицу с значениями NaN, а затем удалить границу после завершения моделирования. NaN обозначает не число и часто используется для обозначения пустых данных. Есть много функций MATLAB, которые полезны с этими значениями.

например. найти среднее значение массива, который имеет пробелы:

nanmean([0 nan 5 nan 10]) 

ans = 

    5 

В вашем случае, я хотел бы начать с добавлением границы NaNs к вашей M матрицы. Я использую «n» вместо «size», так как размер является важной функцией в MATLAB, и использование его в качестве переменной может привести к запутывающим ошибкам.

n=100; 

blankM=zeros(n+2,n+2); 
blankM([1,end],:) = nan; 
blankM(:, [1,end]) = nan; 

Теперь мы можем определить 'M'. NB, что первый столбец и строка будет пренебрежимо малых, поэтому мы должны добавить смещения (25 + 1):

M = blankM; 
M(26,26)=50; 

Запустите моделирование с помощью,

m = size(blankM, 1); 
n = size(blankM, 2); 
for diffusive_steps=1:500 
    oldM = M; 
    newM = blankM; 
    for i=2:m-1; 
     for j=2:n-1; 
      pixel_conc=oldM(i,j); 
      newM(i,j+1)=newM(i,j+1)+pixel_conc/4; 
      newM(i,j-1)=newM(i,j-1)+pixel_conc/4; 
      newM(i+1,j)=newM(i+1,j)+pixel_conc/4; 
      newM(i-1,j)=newM(i-1,j)+pixel_conc/4; 
     end 
    end 
    M=newM; 
end 

, а затем извлечь интересующую область

finalResult = M(2:end-1, 2:end-1); 
Смежные вопросы