扩散外界

时间:2013-05-24 00:17:48

标签: matlab octave

我正在尝试运行这个简单的扩散情况(我明白它通常并不理想),并且我在获取实体的内部时做得很好,但需要一些外边缘的帮助。

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

这是一段非常简单的代码,我知道。我不太擅长使用Octave(贸易化学家),所以我很感激任何帮助!

2 个答案:

答案 0 :(得分:0)

您可能做的一个简单的更改是在感兴趣的域周围添加幽灵细胞或晕圈的边界。而不是误用名称size我使用了一个名为sz的变量。替换:

M=zeros(sz,sz)

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

然后计算你在这个增广矩阵内部的扩散,即在单元格(2:sz+1,2:sz+1)上。在考虑结果时,丢弃或忽略光环。

更简单的方法是简单地使用已有的并忽略现有矩阵中位于N,S,E,W边缘的单元格。

这种技术广泛应用于诸如此类的问题,并且类似于您的问题,并且避免了编写处理没有完整邻居的单元格上的计算的代码的需要。为晕轮细胞的内容设置适当的值是一个与问题有关的问题,0并不总是正确的值。

答案 1 :(得分:0)

如果您对模拟的边界有疑虑,可以使用NaN值填充矩阵,然后在模拟完成后删除边框。 NaN代表的不是数字,通常用于表示空白数据。有许多MATLAB函数以这些值有用的方式工作。

e.g。找到具有空白的数组的平均值:

nanmean([0 nan 5 nan 10])

ans = 

   5

在您的情况下,我首先会在您的M矩阵中添加NaN边框。我使用'n'而不是'size',因为大小是MATLAB中的一个重要功能,并且将它用作变量会导致混淆错误。

n=100;

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

现在我们可以定义'M'。 N.B第一列和第一列是NaN,所以我们需要添加一个偏移量(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);